mirror of
https://github.com/grafana/grafana.git
synced 2025-02-10 23:55:47 -06:00
172 lines
5.1 KiB
TypeScript
172 lines
5.1 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 = {
|
|
navModel: {
|
|
main: {
|
|
text: 'Configuration',
|
|
},
|
|
node: {
|
|
text: 'Service accounts',
|
|
},
|
|
},
|
|
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);
|
|
});
|
|
});
|