import {ProjectKeysFixture} from 'sentry-fixture/projectKeys'; import {initializeOrg} from 'sentry-test/initializeOrg'; import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import selectEvent from 'sentry-test/selectEvent'; import {t} from 'sentry/locale'; import type {Organization} from 'sentry/types/organization'; import type {Project, ProjectKey} from 'sentry/types/project'; import {KeySettings} from './keySettings'; import {LoaderSettings} from './loaderSettings'; const dynamicSdkLoaderOptions = { hasPerformance: false, hasReplay: true, hasDebug: false, }; const fullDynamicSdkLoaderOptions = { hasPerformance: true, hasReplay: true, hasDebug: true, }; function renderMockRequests( organizationSlug: Organization['slug'], projectSlug: Project['slug'], keyId: ProjectKey['id'] ) { const projectKeys = MockApiClient.addMockResponse({ url: `/projects/${organizationSlug}/${projectSlug}/keys/${keyId}/`, method: 'PUT', body: ProjectKeysFixture()[0], }); return {projectKeys}; } describe('Loader Script Settings', function () { it('renders Loader Script Settings', function () { const params = { projectId: '1', keyId: '1', }; const {organization, project} = initializeOrg({ router: { params, }, }); const data = { ...ProjectKeysFixture()[0], dynamicSdkLoaderOptions, } as ProjectKey; const updateData = jest.fn(); render( ); // Panel title expect(screen.getByText('JavaScript Loader Script')).toBeInTheDocument(); expect(screen.getByText(t('Enable Performance Monitoring'))).toBeInTheDocument(); expect(screen.getByText(t('Enable Session Replay'))).toBeInTheDocument(); expect(screen.getByText(t('Enable Debug Bundles & Logging'))).toBeInTheDocument(); const performanceCheckbox = screen.getByRole('checkbox', { name: t('Enable Performance Monitoring'), }); expect(performanceCheckbox).toBeEnabled(); expect(performanceCheckbox).not.toBeChecked(); const replayCheckbox = screen.getByRole('checkbox', { name: t('Enable Session Replay'), }); expect(replayCheckbox).toBeEnabled(); expect(replayCheckbox).toBeChecked(); const debugCheckbox = screen.getByRole('checkbox', { name: t('Enable Debug Bundles & Logging'), }); expect(debugCheckbox).toBeEnabled(); expect(debugCheckbox).not.toBeChecked(); }); it('allows to toggle options', async function () { const {organization, project} = initializeOrg(); const params = { projectSlug: project.slug, keyId: '1', }; const data = { ...(ProjectKeysFixture()[0] as ProjectKey), dynamicSdkLoaderOptions, } as ProjectKey; const mockRequests = renderMockRequests( organization.slug, params.projectSlug, params.keyId ); const updateData = jest.fn(); render( ); // Toggle performance option await userEvent.click( screen.getByRole('checkbox', { name: t('Enable Performance Monitoring'), }) ); await waitFor(() => { expect(mockRequests.projectKeys).toHaveBeenCalledWith( `/projects/${organization.slug}/${params.projectSlug}/keys/${params.keyId}/`, expect.objectContaining({ data: expect.objectContaining({ dynamicSdkLoaderOptions: { ...dynamicSdkLoaderOptions, hasPerformance: true, }, }), }) ); }); // Update SDK version await selectEvent.select(screen.getByText('7.x'), '6.x'); await waitFor(() => { expect(mockRequests.projectKeys).toHaveBeenCalledWith( `/projects/${organization.slug}/${params.projectSlug}/keys/${params.keyId}/`, expect.objectContaining({ data: expect.objectContaining({ browserSdkVersion: '6.x', }), }) ); }); }); it('resets performance & replay when selecting SDK version <7', async function () { const {organization, project} = initializeOrg(); const params = { projectSlug: project.slug, keyId: '1', }; const data = { ...(ProjectKeysFixture()[0] as ProjectKey), dynamicSdkLoaderOptions: fullDynamicSdkLoaderOptions, } as ProjectKey; const mockRequests = renderMockRequests( organization.slug, params.projectSlug, params.keyId ); render( ); // Update SDK version - should reset performance & replay await selectEvent.select(screen.getByText('7.x'), '6.x'); await waitFor(() => { expect(mockRequests.projectKeys).toHaveBeenCalledWith( `/projects/${organization.slug}/${params.projectSlug}/keys/${params.keyId}/`, expect.objectContaining({ data: { browserSdkVersion: '6.x', dynamicSdkLoaderOptions: { hasPerformance: false, hasReplay: false, hasDebug: true, }, }, }) ); }); }); it('disabled performance & replay when SDK version <7 is selected', function () { const {organization, project} = initializeOrg(); const params = { projectSlug: project.slug, keyId: '1', }; const data = { ...(ProjectKeysFixture()[0] as ProjectKey), dynamicSdkLoaderOptions: { hasPerformance: false, hasReplay: false, hasDebug: true, }, browserSdkVersion: '6.x', } as ProjectKey; render( ); const performanceCheckbox = screen.getByRole('checkbox', { name: t('Enable Performance Monitoring'), }); expect(performanceCheckbox).not.toBeChecked(); const replayCheckbox = screen.getByRole('checkbox', { name: t('Enable Session Replay'), }); expect(replayCheckbox).not.toBeChecked(); const debugCheckbox = screen.getByRole('checkbox', { name: t('Enable Debug Bundles & Logging'), }); expect(debugCheckbox).toBeChecked(); expect( screen.getAllByText('Only available in SDK version 7.x and above') ).toHaveLength(2); }); it('shows replay message when it is enabled', function () { const {organization, project} = initializeOrg(); const params = { projectSlug: project.slug, keyId: '1', }; const data = { ...(ProjectKeysFixture()[0] as ProjectKey), dynamicSdkLoaderOptions: fullDynamicSdkLoaderOptions, } as ProjectKey; const {rerender} = render( ); expect( screen.getByText( 'When using Replay, the loader will load the ES6 bundle instead of the ES5 bundle.', {exact: false} ) ).toBeInTheDocument(); data.dynamicSdkLoaderOptions.hasReplay = false; rerender( ); expect( screen.queryByText( 'When using Replay, the loader will load the ES6 bundle instead of the ES5 bundle.', {exact: false} ) ).not.toBeInTheDocument(); }); it('shows performance message when it is enabled', function () { const {organization, project} = initializeOrg(); const params = { projectSlug: project.slug, keyId: '1', }; const data = { ...(ProjectKeysFixture()[0] as ProjectKey), dynamicSdkLoaderOptions: fullDynamicSdkLoaderOptions, } as ProjectKey; const {rerender} = render( ); expect( screen.getByText('tracesSampleRate: 1.0', { exact: false, }) ).toBeInTheDocument(); expect( screen.getByText('distributed tracing to same-origin requests', { exact: false, }) ).toBeInTheDocument(); data.dynamicSdkLoaderOptions.hasPerformance = false; rerender( ); expect( screen.queryByText('tracesSampleRate: 1.0', { exact: false, }) ).not.toBeInTheDocument(); expect( screen.queryByText('distributed tracing to same-origin requests', { exact: false, }) ).not.toBeInTheDocument(); }); });