import { screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { render } from 'test/test-utils';
import { ConnectionStatus } from '../../hooks/useExternalAmSelector';
import { AlertmanagerCard } from './AlertmanagerCard';
jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),
useReturnToPrevious: jest.fn(),
}));
describe('Alertmanager card', () => {
it('should show metadata', () => {
render(
);
// check metadata
const link = screen.getByRole('link', { name: 'External Alertmanager' });
expect(link).toBeInTheDocument();
expect(link).toHaveAttribute('href', '/datasource/foo');
expect(screen.getByText(/Receiving/i)).toBeInTheDocument();
expect(
screen.getByText((_, element) => element?.textContent === `Mimir|http://alertmanager:9090/`)
).toBeInTheDocument();
expect(screen.getByRole('img')).toHaveAttribute('src', 'https://image.png');
});
it('should show correct buttons for disabled alertmanager', async () => {
const onEditConfiguration = jest.fn();
const onEnable = jest.fn();
const onDisable = jest.fn();
render(
);
// check actions
const enableButton = screen.getByRole('button', { name: 'Enable' });
await userEvent.click(enableButton);
expect(onEnable).toHaveBeenCalled();
const editConfigurationButton = screen.getByRole('button', { name: 'Edit configuration' });
await userEvent.click(editConfigurationButton);
expect(onEditConfiguration).toHaveBeenCalled();
});
it('should show correct buttons for enabled alertmanager', async () => {
const onDisable = jest.fn();
render(
);
// check actions
const disableButton = screen.getByRole('button', { name: 'Disable' });
await userEvent.click(disableButton);
expect(onDisable).toHaveBeenCalled();
});
it('should not show edit / enable buttons for provisioned alertmanager', () => {
render(
);
// should not have "edit configuration"
const editConfigurationButton = screen.queryByRole('button', { name: 'Edit configuration' });
expect(editConfigurationButton).not.toBeInTheDocument();
// should have "view configuration"
const viewButton = screen.getByRole('button', { name: 'View configuration' });
expect(viewButton).toBeInTheDocument();
const enableButton = screen.queryByRole('button', { name: 'Enable' });
expect(enableButton).not.toBeInTheDocument();
});
it('should show correct buttons for read-only (vanilla) alertmanager', () => {
render(
);
// should not have "edit configuration"
const editConfigurationButton = screen.queryByRole('button', { name: 'Edit configuration' });
expect(editConfigurationButton).not.toBeInTheDocument();
// should have "view configuration"
const viewButton = screen.getByRole('button', { name: 'View configuration' });
expect(viewButton).toBeInTheDocument();
// should be able to enable / disable
const enableButton = screen.getByRole('button', { name: 'Enable' });
expect(enableButton).toBeInTheDocument();
});
it('should render correct status', () => {
render(cardWithStatus('active'));
expect(screen.getByText(/Receiving/)).toBeInTheDocument();
render(cardWithStatus('dropped'));
expect(screen.getByText(/Failed to adopt/)).toBeInTheDocument();
render(cardWithStatus('pending'));
expect(screen.getByText(/Activation in progress/)).toBeInTheDocument();
render(cardWithStatus('inconclusive'));
expect(screen.getByText(/Inconclusive/)).toBeInTheDocument();
});
it('should not render the enable / disable buttons or status when disabled', () => {
render(
);
const enableButton = screen.queryByRole('button', { name: 'Enable' });
expect(enableButton).not.toBeInTheDocument();
// should also not show the status for external alertmanagers
expect(screen.queryByText(/Receiving/)).not.toBeInTheDocument();
});
});
const cardWithStatus = (status: ConnectionStatus) => (
);