1
import * as React from 'react';
2
import { mount, ReactWrapper } from 'enzyme';
3
import { act } from 'react-dom/test-utils';
4
import { Alert } from 'reactstrap';
5
import { sampleApiResponse } from './__testdata__/testdata';
6
import ScrapePoolList, { ScrapePoolPanel } from './ScrapePoolList';
7
import { Target } from './target';
8
import { FetchMock } from 'jest-fetch-mock/types';
9
import { PathPrefixContext } from '../../contexts/PathPrefixContext';
11
describe('ScrapePoolList', () => {
13
fetchMock.resetMocks();
16
describe('when data is returned', () => {
17
let scrapePoolList: ReactWrapper;
20
//Tooltip requires DOM elements to exist. They do not in enzyme rendering so we must manually create them.
21
const scrapePools: { [key: string]: number } = { blackbox: 3, node_exporter: 1, 'prometheus/test': 1 };
22
Object.keys(scrapePools).forEach((pool: string): void => {
23
Array.from(Array(scrapePools[pool]).keys()).forEach((idx: number): void => {
24
const div = document.createElement('div');
25
div.id = `series-labels-${pool}-${idx}`;
26
document.body.appendChild(div);
27
const div2 = document.createElement('div');
28
div2.id = `scrape-duration-${pool}-${idx}`;
29
document.body.appendChild(div2);
32
mock = fetchMock.mockResponse(JSON.stringify(sampleApiResponse));
35
it('renders a table', async () => {
36
await act(async () => {
37
scrapePoolList = mount(
38
<PathPrefixContext.Provider value="/path/prefix">
39
<ScrapePoolList scrapePools={[]} selectedPool={null} onPoolSelect={jest.fn()} />
40
</PathPrefixContext.Provider>
43
scrapePoolList.update();
44
expect(mock).toHaveBeenCalledWith('/path/prefix/api/v1/targets?state=active', {
46
credentials: 'same-origin',
48
const panels = scrapePoolList.find(ScrapePoolPanel);
49
expect(panels).toHaveLength(3);
50
const activeTargets: Target[] = sampleApiResponse.data.activeTargets as unknown as Target[];
51
activeTargets.forEach(({ scrapePool }: Target) => {
52
const panel = scrapePoolList.find(ScrapePoolPanel).filterWhere((panel) => panel.prop('scrapePool') === scrapePool);
53
expect(panel).toHaveLength(1);
58
describe('when an error is returned', () => {
59
it('displays an alert', async () => {
60
const mock = fetchMock.mockReject(new Error('Error fetching targets'));
62
let scrapePoolList: any;
63
await act(async () => {
64
scrapePoolList = mount(
65
<PathPrefixContext.Provider value="/path/prefix">
66
<ScrapePoolList scrapePools={[]} selectedPool={null} onPoolSelect={jest.fn()} />
67
</PathPrefixContext.Provider>
70
scrapePoolList.update();
72
expect(mock).toHaveBeenCalledWith('/path/prefix/api/v1/targets?state=active', {
74
credentials: 'same-origin',
76
const alert = scrapePoolList.find(Alert);
77
expect(alert.prop('color')).toBe('danger');
78
expect(alert.text()).toContain('Error fetching targets');