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) => ( );