import {Project} from 'sentry-fixture/project'; import {ProjectKeys as ProjectKeysFixture} from 'sentry-fixture/projectKeys'; import {initializeOrg} from 'sentry-test/initializeOrg'; import { render, renderGlobalModal, screen, userEvent, waitFor, } from 'sentry-test/reactTestingLibrary'; import ProjectKeys from 'sentry/views/settings/project/projectKeys/list'; describe('ProjectKeys', function () { const {organization, project, routerProps} = initializeOrg(); const projectKeys = ProjectKeysFixture(); let deleteMock: jest.Mock; beforeEach(function () { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/keys/`, method: 'GET', body: projectKeys, }); deleteMock = MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/keys/${projectKeys[0].id}/`, method: 'DELETE', }); }); it('renders empty', function () { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/keys/`, method: 'GET', body: [], }); render( ); expect( screen.getByText('There are no keys active for this project.') ).toBeInTheDocument(); }); it('has clippable box', async function () { render( ); const expandButton = screen.getByRole('button', {name: 'Expand'}); await userEvent.click(expandButton); expect(expandButton).not.toBeInTheDocument(); }); it('renders for default project', function () { render( ); const allDsn = screen.getAllByRole('textbox', {name: 'DSN URL'}); expect(allDsn.length).toBe(1); const expandButton = screen.getByRole('button', {name: 'Expand'}); const dsn = screen.getByRole('textbox', {name: 'DSN URL'}); const minidumpEndpoint = screen.queryByRole('textbox', { name: 'Minidump Endpoint URL', }); const unrealEndpoint = screen.queryByRole('textbox', { name: 'Unreal Engine Endpoint URL', }); const securityHeaderEndpoint = screen.queryByRole('textbox', { name: 'Security Header Endpoint URL', }); expect(expandButton).toBeInTheDocument(); expect(dsn).toHaveValue(projectKeys[0].dsn.public); expect(minidumpEndpoint).toHaveValue(projectKeys[0].dsn.minidump); // this is empty in the default ProjectKey expect(unrealEndpoint).toHaveValue(''); expect(securityHeaderEndpoint).toHaveValue(projectKeys[0].dsn.security); }); it('renders for javascript project', function () { render( ); const expandButton = screen.queryByRole('button', {name: 'Expand'}); const dsn = screen.getByRole('textbox', {name: 'DSN URL'}); const minidumpEndpoint = screen.queryByRole('textbox', { name: 'Minidump Endpoint URL', }); const unrealEndpoint = screen.queryByRole('textbox', { name: 'Unreal Engine Endpoint URL', }); const securityHeaderEndpoint = screen.queryByRole('textbox', { name: 'Security Header Endpoint URL', }); expect(expandButton).not.toBeInTheDocument(); expect(dsn).toHaveValue(projectKeys[0].dsn.public); expect(minidumpEndpoint).not.toBeInTheDocument(); expect(unrealEndpoint).not.toBeInTheDocument(); expect(securityHeaderEndpoint).not.toBeInTheDocument(); // Loader Script is rendered expect(screen.getByText('Loader Script')).toBeInTheDocument(); const loaderScript = screen.getByRole('textbox', { name: 'Loader Script', }); expect(loaderScript).toHaveValue( `` ); }); it('renders for javascript-react project', function () { render( ); const expandButton = screen.queryByRole('button', {name: 'Expand'}); const dsn = screen.getByRole('textbox', {name: 'DSN URL'}); const minidumpEndpoint = screen.queryByRole('textbox', { name: 'Minidump Endpoint URL', }); const unrealEndpoint = screen.queryByRole('textbox', { name: 'Unreal Engine Endpoint URL', }); const securityHeaderEndpoint = screen.queryByRole('textbox', { name: 'Security Header Endpoint URL', }); expect(expandButton).not.toBeInTheDocument(); expect(dsn).toHaveValue(projectKeys[0].dsn.public); expect(minidumpEndpoint).not.toBeInTheDocument(); expect(unrealEndpoint).not.toBeInTheDocument(); expect(securityHeaderEndpoint).not.toBeInTheDocument(); expect(screen.queryByText('Loader Script')).not.toBeInTheDocument(); }); it('renders multiple keys', function () { const multipleProjectKeys = ProjectKeysFixture([ { dsn: { secret: 'http://188ee45a58094d939428d8585aa6f662:a33bf9aba64c4bbdaf873bb9023b6d2c@dev.getsentry.net:8000/1', minidump: 'http://dev.getsentry.net:8000/api/1/minidump?sentry_key=188ee45a58094d939428d8585aa6f662', public: 'http://188ee45a58094d939428d8585aa6f662@dev.getsentry.net:8000/1', csp: 'http://dev.getsentry.net:8000/api/1/csp-report/?sentry_key=188ee45a58094d939428d8585aa6f662', security: 'http://dev.getsentry.net:8000/api/1/security-report/?sentry_key=188ee45a58094d939428d8585aa6f662', cdn: '', unreal: '', }, public: '188ee45a58094d939428d8585aa6f662', secret: 'a33bf9aba64c4bbdaf873bb9023b6d2c', name: 'Key 2', rateLimit: null, projectId: '1', dateCreated: '2018-02-28T07:13:51.087Z', id: '188ee45a58094d939428d8585aa6f662', isActive: true, label: 'Key 2', browserSdkVersion: 'latest', browserSdk: { choices: [ ['latest', 'latest'], ['7.x', '7.x'], ['6.x', '6.x'], ['5.x', '5.x'], ['4.x', '4.x'], ], }, dynamicSdkLoaderOptions: { hasPerformance: false, hasReplay: false, hasDebug: false, }, }, ]); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/keys/`, method: 'GET', body: multipleProjectKeys, }); render( ); const allDsn = screen.getAllByRole('textbox', {name: 'DSN URL'}); expect(allDsn.length).toBe(2); }); it('deletes key', async function () { render( ); await userEvent.click(screen.getByRole('button', {name: 'Delete'})); renderGlobalModal(); await userEvent.click(screen.getByTestId('confirm-button')); expect(deleteMock).toHaveBeenCalled(); }); it('disable and enables key', async function () { render( ); const enableMock = MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/keys/${projectKeys[0].id}/`, method: 'PUT', }); renderGlobalModal(); await userEvent.click(screen.getByRole('button', {name: 'Disable'})); await userEvent.click(screen.getByTestId('confirm-button')); await waitFor(() => { expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); }); expect(enableMock).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ data: {isActive: false}, }) ); await userEvent.click(screen.getByRole('button', {name: 'Enable'})); await userEvent.click(screen.getByTestId('confirm-button')); expect(enableMock).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ data: {isActive: true}, }) ); }); });