import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { contextSrv } from 'app/core/services/context_srv'; import { grantUserPermissions } from 'app/features/alerting/unified/mocks'; import { Snapshot } from 'app/features/dashboard/services/SnapshotSrv'; import { AccessControlAction } from 'app/types'; import { SnapshotListTableRow } from './SnapshotListTableRow'; jest.mock('app/core/services/context_srv'); const mockContextSrv = jest.mocked(contextSrv); const grantAllPermissions = () => { grantUserPermissions([AccessControlAction.SnapshotsDelete]); mockContextSrv.hasPermissionInMetadata.mockImplementation(() => true); mockContextSrv.hasPermission.mockImplementation(() => true); }; const grantNoPermissions = () => { grantUserPermissions([]); mockContextSrv.hasPermissionInMetadata.mockImplementation(() => false); mockContextSrv.hasPermission.mockImplementation(() => false); }; describe('SnapshotListTableRow', () => { const mockSnapshot = { key: 'test', name: 'Test Snapshot', url: 'http://test.com', external: false, }; it('renders correctly', () => { const mockOnRemove = jest.fn(); grantAllPermissions(); render(
); expect(screen.getByRole('row')).toBeInTheDocument(); expect(screen.getByRole('cell', { name: mockSnapshot.name })).toBeInTheDocument(); expect(screen.getByRole('cell', { name: mockSnapshot.url })).toBeInTheDocument(); expect(screen.queryByRole('cell', { name: 'External' })).not.toBeInTheDocument(); }); it('adds the correct href to the name, url and view buttons', () => { const mockOnRemove = jest.fn(); grantAllPermissions(); render(
); const nameLink = screen.getByRole('link', { name: mockSnapshot.name }); const urlLink = screen.getByRole('link', { name: mockSnapshot.url }); const viewButton = screen.getByRole('link', { name: 'View' }); expect(nameLink).toHaveAttribute('href', mockSnapshot.url); expect(urlLink).toHaveAttribute('href', mockSnapshot.url); expect(viewButton).toHaveAttribute('href', mockSnapshot.url); }); it('calls onRemove when delete button is clicked', async () => { const mockOnRemove = jest.fn(); grantAllPermissions(); render(
); await userEvent.click(screen.getByRole('button')); expect(mockOnRemove).toHaveBeenCalled(); }); it('delete button should be disabled when no permissions', async () => { const mockOnRemove = jest.fn(); grantNoPermissions(); render(
); const deleteButton = screen.getByRole('button'); expect(deleteButton).toHaveAttribute('aria-disabled', 'true'); await userEvent.click(deleteButton); expect(mockOnRemove).not.toHaveBeenCalled(); }); describe('for an external snapshot', () => { let mockSnapshotWithExternal: Snapshot; const mockOnRemove = jest.fn(); beforeEach(() => { mockSnapshotWithExternal = { ...mockSnapshot, external: true, externalUrl: 'http://external.com', }; }); it('renders the external badge', () => { render(
); expect(screen.getByRole('cell', { name: 'External' })).toBeInTheDocument(); }); it('uses the external href for the name, url and view buttons', () => { render(
); const nameLink = screen.getByRole('link', { name: mockSnapshotWithExternal.name }); const urlLink = screen.getByRole('link', { name: mockSnapshotWithExternal.externalUrl }); const viewButton = screen.getByRole('link', { name: 'View' }); expect(nameLink).toHaveAttribute('href', mockSnapshotWithExternal.externalUrl); expect(urlLink).toHaveAttribute('href', mockSnapshotWithExternal.externalUrl); expect(viewButton).toHaveAttribute('href', mockSnapshotWithExternal.externalUrl); }); }); });