import {Location} from 'history'; import {initializeOrg} from 'sentry-test/initializeOrg'; import {render, screen} from 'sentry-test/reactTestingLibrary'; import {OnboardingContextProvider} from 'sentry/components/onboarding/onboardingContext'; import {PRODUCT} from 'sentry/components/onboarding/productSelection'; import ProjectsStore from 'sentry/stores/projectsStore'; import {Organization, Project} from 'sentry/types'; import SetupDocs from 'sentry/views/onboarding/setupDocs'; const PROJECT_KEY = TestStubs.ProjectKeys()[0]; function renderMockRequests({ project, orgSlug, location, }: { orgSlug: Organization['slug']; project: Project; location?: Location; }) { MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${project.slug}/`, body: project, }); if (project.slug === 'javascript') { MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${project.slug}/keys/`, body: [PROJECT_KEY], }); } MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${project.slug}/issues/`, body: [], }); if (project.slug === 'javascript-react') { const products = location?.query.product ?? []; if ( products.includes(PRODUCT.PERFORMANCE_MONITORING) && products.includes(PRODUCT.SESSION_REPLAY) ) { MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${project.slug}/docs/javascript-react-with-error-monitoring-performance-and-replay/`, body: {html: 'javascript-react-with-error-monitoring-performance-and-replay'}, }); } else if (products.includes(PRODUCT.PERFORMANCE_MONITORING)) { MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${project.slug}/docs/javascript-react-with-error-monitoring-and-performance/`, body: {html: 'javascript-react-with-error-monitoring-and-performance'}, }); } else if (products.includes(PRODUCT.SESSION_REPLAY)) { MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${project.slug}/docs/javascript-react-with-error-monitoring-and-replay/`, body: {html: 'javascript-react-with-error-monitoring-and-replay'}, }); } else { MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${project.slug}/docs/javascript-react-with-error-monitoring/`, body: {html: 'javascript-react-with-error-monitoring'}, }); } } else { MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${project.slug}/docs/${project.platform}/`, body: {html: ''}, }); } } describe('Onboarding Setup Docs', function () { it('does not render Product Selection', async function () { const {router, route, routerContext, organization, project} = initializeOrg({ projects: [ { ...initializeOrg().project, slug: 'python', platform: 'python', }, ], }); ProjectsStore.init(); ProjectsStore.loadInitialData([project]); renderMockRequests({project, orgSlug: organization.slug}); render( {}} stepIndex={2} router={router} route={route} location={router.location} genSkipOnboardingLink={() => ''} orgId={organization.slug} search="" recentCreatedProject={project} /> , { context: routerContext, organization, } ); expect( await screen.findByRole('heading', {name: 'Configure Python SDK'}) ).toBeInTheDocument(); expect( screen.queryByTestId( `product-${PRODUCT.ERROR_MONITORING}-${PRODUCT.PERFORMANCE_MONITORING}-${PRODUCT.SESSION_REPLAY}` ) ).not.toBeInTheDocument(); }); describe('renders Product Selection', function () { it('all products checked', async function () { const {router, route, routerContext, organization, project} = initializeOrg({ router: { location: { query: {product: [PRODUCT.PERFORMANCE_MONITORING, PRODUCT.SESSION_REPLAY]}, }, }, projects: [ { ...initializeOrg().project, slug: 'javascript-react', platform: 'javascript-react', }, ], }); ProjectsStore.init(); ProjectsStore.loadInitialData([project]); renderMockRequests({ project, orgSlug: organization.slug, location: router.location, }); render( {}} stepIndex={2} router={router} route={route} location={router.location} genSkipOnboardingLink={() => ''} orgId={organization.slug} search="" recentCreatedProject={project} /> , { context: routerContext, organization, } ); expect( await screen.findByRole('heading', {name: 'Configure React SDK'}) ).toBeInTheDocument(); // Render variation of docs - default (all checked) expect( await screen.findByText( 'javascript-react-with-error-monitoring-performance-and-replay' ) ).toBeInTheDocument(); }); it('only performance checked', async function () { const {router, route, routerContext, organization, project} = initializeOrg({ router: { location: { query: {product: [PRODUCT.PERFORMANCE_MONITORING]}, }, }, projects: [ { ...initializeOrg().project, slug: 'javascript-react', platform: 'javascript-react', }, ], }); ProjectsStore.init(); ProjectsStore.loadInitialData([project]); renderMockRequests({ project, orgSlug: organization.slug, location: router.location, }); render( {}} stepIndex={2} router={router} route={route} location={router.location} genSkipOnboardingLink={() => ''} orgId={organization.slug} search="" recentCreatedProject={project} /> , { context: routerContext, organization, } ); // Render variation of docs - error monitoring and performance doc expect( await screen.findByText('javascript-react-with-error-monitoring-and-performance') ).toBeInTheDocument(); }); it('only session replay checked', async function () { const {router, route, routerContext, organization, project} = initializeOrg({ router: { location: { query: {product: [PRODUCT.SESSION_REPLAY]}, }, }, projects: [ { ...initializeOrg().project, slug: 'javascript-react', platform: 'javascript-react', }, ], }); ProjectsStore.init(); ProjectsStore.loadInitialData([project]); renderMockRequests({ project, orgSlug: organization.slug, location: router.location, }); render( {}} stepIndex={2} router={router} route={route} location={router.location} genSkipOnboardingLink={() => ''} orgId={organization.slug} search="" recentCreatedProject={project} /> , { context: routerContext, organization, } ); // Render variation of docs - error monitoring and replay doc expect( await screen.findByText('javascript-react-with-error-monitoring-and-replay') ).toBeInTheDocument(); }); it('only error monitoring checked', async function () { const {router, route, routerContext, organization, project} = initializeOrg({ router: { location: { query: {product: []}, }, }, projects: [ { ...initializeOrg().project, slug: 'javascript-react', platform: 'javascript-react', }, ], }); ProjectsStore.init(); ProjectsStore.loadInitialData([project]); renderMockRequests({ project, orgSlug: organization.slug, location: router.location, }); render( {}} stepIndex={2} router={router} route={route} location={router.location} genSkipOnboardingLink={() => ''} orgId={organization.slug} search="" recentCreatedProject={project} /> , { context: routerContext, organization, } ); // Render variation of docs - error monitoring doc expect( await screen.findByText('javascript-react-with-error-monitoring') ).toBeInTheDocument(); }); }); describe('JS Loader Script', function () { it('renders Loader Script setup', async function () { const {router, route, routerContext, organization, project} = initializeOrg({ router: { location: { query: {product: [PRODUCT.PERFORMANCE_MONITORING, PRODUCT.SESSION_REPLAY]}, }, }, projects: [ { ...initializeOrg().project, slug: 'javascript', platform: 'javascript', }, ], }); const updateLoaderMock = MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/keys/${PROJECT_KEY.id}/`, method: 'PUT', body: PROJECT_KEY, }); ProjectsStore.init(); ProjectsStore.loadInitialData([project]); renderMockRequests({ project, orgSlug: organization.slug, location: router.location, }); const {rerender} = render( {}} stepIndex={2} router={router} route={route} location={router.location} genSkipOnboardingLink={() => ''} orgId={organization.slug} search="" recentCreatedProject={project} /> , { context: routerContext, organization, } ); expect( await screen.findByRole('heading', {name: 'Configure JavaScript SDK'}) ).toBeInTheDocument(); expect(updateLoaderMock).toHaveBeenCalledTimes(1); expect(updateLoaderMock).toHaveBeenCalledWith( expect.any(String), // The URL { data: { dynamicSdkLoaderOptions: { hasDebug: false, hasPerformance: true, hasReplay: true, }, }, error: expect.any(Function), method: 'PUT', success: expect.any(Function), } ); // update query in URL router.location.query = { product: [PRODUCT.SESSION_REPLAY], }; rerender( {}} stepIndex={2} router={router} route={route} location={router.location} genSkipOnboardingLink={() => ''} orgId={organization.slug} search="" recentCreatedProject={project} /> ); expect(updateLoaderMock).toHaveBeenCalledTimes(2); expect(updateLoaderMock).toHaveBeenLastCalledWith( expect.any(String), // The URL { data: { dynamicSdkLoaderOptions: { hasDebug: false, hasPerformance: false, hasReplay: true, }, }, error: expect.any(Function), method: 'PUT', success: expect.any(Function), } ); }); }); });