grafana/public/app/features/serviceaccounts/ServiceAccountsListPage.test.tsx
Torkel Ödegaard 1e85a6f4fd
TopNav: New page layouts (#51510)
* First stab at new page layouts behind feature toggle

* Simplifying PageHeader

* Progress on a new model that can more easily support new and old page layouts

* Progress

* rename folder

* Progress

* Minor change

* fixes

* Fixing tests

* Make breadcrumbs work

* Add tests for old Page component

* Adding tests for new Page component and behavior

* fixing page header test

* Fixed test

* AppChrome outside route

* Renaming folder

* Minor fix

* Updated

* Fixing StoragePage

* Fix for banners

Co-authored-by: Ashley Harrison <ashley.harrison@grafana.com>
2022-07-06 17:00:56 +02:00

164 lines
5.0 KiB
TypeScript

import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import { OrgRole, ServiceAccountDTO, ServiceAccountStateFilter } from 'app/types';
import { Props, ServiceAccountsListPageUnconnected } from './ServiceAccountsListPage';
jest.mock('app/core/core', () => ({
contextSrv: {
licensedAccessControlEnabled: () => false,
hasPermission: () => true,
hasPermissionInMetadata: () => true,
},
}));
const setup = (propOverrides: Partial<Props>) => {
const changeQueryMock = jest.fn();
const fetchACOptionsMock = jest.fn();
const fetchServiceAccountsMock = jest.fn();
const deleteServiceAccountMock = jest.fn();
const updateServiceAccountMock = jest.fn();
const changeStateFilterMock = jest.fn();
const createServiceAccountTokenMock = jest.fn();
const getApiKeysMigrationStatusMock = jest.fn();
const getApiKeysMigrationInfoMock = jest.fn();
const closeApiKeysMigrationInfoMock = jest.fn();
const props: Props = {
builtInRoles: {},
isLoading: false,
page: 0,
perPage: 10,
query: '',
roleOptions: [],
serviceAccountStateFilter: ServiceAccountStateFilter.All,
showPaging: false,
totalPages: 1,
serviceAccounts: [],
apiKeysMigrated: false,
showApiKeysMigrationInfo: false,
changeQuery: changeQueryMock,
fetchACOptions: fetchACOptionsMock,
fetchServiceAccounts: fetchServiceAccountsMock,
deleteServiceAccount: deleteServiceAccountMock,
updateServiceAccount: updateServiceAccountMock,
changeStateFilter: changeStateFilterMock,
createServiceAccountToken: createServiceAccountTokenMock,
getApiKeysMigrationStatus: getApiKeysMigrationStatusMock,
getApiKeysMigrationInfo: getApiKeysMigrationInfoMock,
closeApiKeysMigrationInfo: closeApiKeysMigrationInfoMock,
};
Object.assign(props, propOverrides);
const { rerender } = render(<ServiceAccountsListPageUnconnected {...props} />);
return {
rerender,
props,
changeQueryMock,
fetchACOptionsMock,
fetchServiceAccountsMock,
deleteServiceAccountMock,
updateServiceAccountMock,
changeStateFilterMock,
createServiceAccountTokenMock,
};
};
const getDefaultServiceAccount: () => ServiceAccountDTO = () => ({
id: 42,
name: 'Data source scavenger',
login: 'sa-data-source-scavenger',
orgId: 1,
role: OrgRole.Editor,
isDisabled: false,
teams: [],
tokens: 1,
createdAt: '2022-01-01 00:00:00',
});
describe('ServiceAccountsListPage tests', () => {
it('Should display list of service accounts', () => {
setup({
serviceAccounts: [getDefaultServiceAccount()],
});
expect(screen.getByText(/Data source scavenger/)).toBeInTheDocument();
expect(screen.getByText(/sa-data-source-scavenger/)).toBeInTheDocument();
expect(screen.getByText(/Editor/)).toBeInTheDocument();
});
it('Should display enable button for disabled account', () => {
setup({
serviceAccounts: [
{
...getDefaultServiceAccount(),
isDisabled: true,
},
],
});
expect(screen.getByRole('button', { name: 'Enable' })).toBeInTheDocument();
});
it('Should display Add token button for account without tokens', () => {
setup({
serviceAccounts: [
{
...getDefaultServiceAccount(),
tokens: 0,
},
],
});
expect(screen.getByRole('button', { name: 'Add token' })).toBeInTheDocument();
expect(screen.getByText(/No tokens/)).toBeInTheDocument();
});
it('Should update service account role', async () => {
const updateServiceAccountMock = jest.fn();
setup({
serviceAccounts: [getDefaultServiceAccount()],
updateServiceAccount: updateServiceAccountMock,
});
const user = userEvent.setup();
await user.click(screen.getByText('Editor'));
await user.click(screen.getByText('Admin'));
expect(updateServiceAccountMock).toHaveBeenCalledWith({
...getDefaultServiceAccount(),
role: OrgRole.Admin,
});
});
it('Should disable service account', async () => {
const updateServiceAccountMock = jest.fn();
setup({
serviceAccounts: [getDefaultServiceAccount()],
updateServiceAccount: updateServiceAccountMock,
});
const user = userEvent.setup();
await user.click(screen.getByRole('button', { name: /Disable/ }));
await user.click(screen.getByLabelText(/Confirm Modal Danger Button/));
expect(updateServiceAccountMock).toHaveBeenCalledWith({
...getDefaultServiceAccount(),
isDisabled: true,
});
});
it('Should remove service account', async () => {
const deleteServiceAccountMock = jest.fn();
setup({
serviceAccounts: [getDefaultServiceAccount()],
deleteServiceAccount: deleteServiceAccountMock,
});
const user = userEvent.setup();
await user.click(screen.getByLabelText(/Delete service account/));
await user.click(screen.getByLabelText(/Confirm Modal Danger Button/));
expect(deleteServiceAccountMock).toHaveBeenCalledWith(42);
});
});