import { screen, waitFor, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { render } from 'test/test-utils';
import { byRole, byTestId, byText } from 'testing-library-selector';
import SettingsPage from './Settings';
import DataSourcesResponse from './components/settings/__mocks__/api/datasources.json';
import { setupGrafanaManagedServer, withExternalOnlySetting } from './components/settings/__mocks__/server';
import { setupMswServer } from './mockApi';
import { grantUserRole } from './mocks';
jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),
useReturnToPrevious: jest.fn(),
}));
const server = setupMswServer();
const ui = {
builtInAlertmanagerSection: byText('Built-in Alertmanager'),
otherAlertmanagerSection: byText('Other Alertmanagers'),
alertmanagerCard: (name: string) => byTestId(`alertmanager-card-${name}`),
builtInAlertmanagerCard: byTestId('alertmanager-card-Grafana built-in'),
statusReceiving: byText(/receiving grafana-managed alerts/i),
statusNotReceiving: byText(/not receiving/i),
configurationDrawer: byRole('dialog', { name: 'Drawer title Internal Grafana Alertmanager' }),
editConfigurationButton: byRole('button', { name: /edit configuration/i }),
saveConfigurationButton: byRole('button', { name: /save/i }),
enableButton: byRole('button', { name: 'Enable' }),
disableButton: byRole('button', { name: 'Disable' }),
versionsTab: byRole('tab', { name: /versions/i }),
provisionedBadge: byText(/^Provisioned$/),
};
describe('Alerting settings', () => {
beforeEach(() => {
grantUserRole('ServerAdmin');
setupGrafanaManagedServer(server);
});
it('should render the page with Built-in only enabled, others disabled', async () => {
render();
expect(await ui.builtInAlertmanagerSection.find()).toBeInTheDocument();
expect(ui.otherAlertmanagerSection.get()).toBeInTheDocument();
// check internal alertmanager configuration
expect(ui.builtInAlertmanagerCard.get()).toBeInTheDocument();
expect(ui.statusReceiving.get(ui.builtInAlertmanagerCard.get())).toBeInTheDocument();
// check external altermanagers
DataSourcesResponse.forEach((ds) => {
// get the card for datasource
const card = ui.alertmanagerCard(ds.name).get();
// expect link to data source, provisioned badge, type, and status
expect(within(card).getByRole('link', { name: ds.name })).toBeInTheDocument();
});
});
it('should render the page with external only', async () => {
render();
withExternalOnlySetting(server);
await waitFor(() => {
expect(ui.statusReceiving.query()).not.toBeInTheDocument();
});
});
it('should be able to view configuration', async () => {
render();
// wait for loading to be done
await waitFor(() => expect(ui.builtInAlertmanagerSection.get()).toBeInTheDocument());
// open configuration drawer
const internalAMCard = ui.builtInAlertmanagerCard.get();
const editInternal = ui.editConfigurationButton.get(internalAMCard);
await userEvent.click(editInternal);
await waitFor(() => {
expect(ui.configurationDrawer.get()).toBeInTheDocument();
});
await userEvent.click(ui.saveConfigurationButton.get());
expect(ui.saveConfigurationButton.get()).toBeDisabled();
await waitFor(() => {
expect(ui.saveConfigurationButton.get()).toBeEnabled();
});
});
it('should be able to view versions', async () => {
render();
// wait for loading to be done
await waitFor(() => expect(ui.builtInAlertmanagerSection.get()).toBeInTheDocument());
// open configuration drawer
const internalAMCard = ui.builtInAlertmanagerCard.get();
const editInternal = ui.editConfigurationButton.get(internalAMCard);
await userEvent.click(editInternal);
await waitFor(() => {
expect(ui.configurationDrawer.get()).toBeInTheDocument();
});
// click versions tab
await userEvent.click(ui.versionsTab.get());
await waitFor(() => {
expect(screen.getByText(/last applied/i)).toBeInTheDocument();
});
});
it('should correctly render provisioned data sources', async () => {
render();
// wait for loading to be done
await waitFor(() => expect(ui.builtInAlertmanagerSection.get()).toBeInTheDocument());
// provisioned alertmanager card
const provisionedCard = ui.alertmanagerCard('Provisioned Mimir-based Alertmanager').get();
expect(ui.provisionedBadge.get(provisionedCard)).toBeInTheDocument();
// should still be editable
const editConfigButton = ui.editConfigurationButton.get(provisionedCard);
expect(editConfigButton).toBeInTheDocument();
// enable / disable should not be avaiable when provisioned
const enableButton = ui.enableButton.query(provisionedCard);
const disableButton = ui.disableButton.query(provisionedCard);
expect(enableButton).not.toBeInTheDocument();
expect(disableButton).not.toBeInTheDocument();
});
});