import {initializeOrg} from 'sentry-test/initializeOrg'; import {reactHooks} from 'sentry-test/reactTestingLibrary'; import usePerformanceOnboardingDocs, { generateOnboardingDocKeys, } from 'sentry/components/performanceOnboarding/usePerformanceOnboardingDocs'; import {OrganizationContext} from 'sentry/views/organizationContext'; describe('usePerformanceOnboardingDocs', function () { it('fetches onboarding documentation steps', async function () { const {organization} = initializeOrg({ router: { location: {query: {}, search: ''}, push: jest.fn(), }, } as any); const wrapper = ({children}: {children?: React.ReactNode}) => ( {children} ); const project = TestStubs.Project({ platform: 'javascript-react', firstTransactionEvent: false, }); const apiMocks: any = {}; const docKeys = generateOnboardingDocKeys(project.platform); expect(docKeys).toEqual([ 'javascript-react-performance-onboarding-1-install', 'javascript-react-performance-onboarding-2-configure', 'javascript-react-performance-onboarding-3-verify', ]); docKeys.forEach(docKey => { apiMocks[docKey] = MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/docs/${docKey}/`, method: 'GET', body: {html: `${docKey} content`}, }); }); const {result, waitForNextUpdate} = reactHooks.renderHook( usePerformanceOnboardingDocs, { initialProps: project, wrapper, } ); await waitForNextUpdate(); const {docContents, isLoading, hasOnboardingContents} = result.current; expect(isLoading).toEqual(false); const expectedDocContents = Object.keys(apiMocks).reduce((acc, key) => { acc[key] = `${key} content`; return acc; }, {}); expect(docContents).toEqual(expectedDocContents); expect(hasOnboardingContents).toEqual(true); Object.values(apiMocks).forEach(mock => { expect(mock).toHaveBeenCalled(); }); }); it('project with no onboarding support', function () { const {organization} = initializeOrg({ router: { location: {query: {}, search: ''}, push: jest.fn(), }, } as any); const wrapper = ({children}: {children?: React.ReactNode}) => ( {children} ); const project = TestStubs.Project({ platform: 'javascript-angular', firstTransactionEvent: false, }); const apiMocks: any = {}; const docKeys = generateOnboardingDocKeys(project.platform); expect(docKeys).toEqual([ 'javascript-angular-performance-onboarding-1-install', 'javascript-angular-performance-onboarding-2-configure', 'javascript-angular-performance-onboarding-3-verify', ]); docKeys.forEach(docKey => { apiMocks[docKey] = MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/docs/${docKey}/`, method: 'GET', body: {html: `${docKey} content`}, }); }); const {result} = reactHooks.renderHook(usePerformanceOnboardingDocs, { wrapper, initialProps: project, }); const {docContents, isLoading, hasOnboardingContents} = result.current; expect(isLoading).toEqual(false); expect(docContents).toEqual({}); expect(hasOnboardingContents).toEqual(false); Object.values(apiMocks).forEach(mock => { expect(mock).not.toHaveBeenCalled(); }); }); it('project with no performance support', function () { const {organization} = initializeOrg({ router: { location: {query: {}, search: ''}, push: jest.fn(), }, } as any); const wrapper = ({children}: {children?: React.ReactNode}) => ( {children} ); const project = TestStubs.Project({ platform: 'elixir', firstTransactionEvent: false, }); const apiMocks: any = {}; const docKeys = generateOnboardingDocKeys(project.platform); expect(docKeys).toEqual([ 'elixir-performance-onboarding-1-install', 'elixir-performance-onboarding-2-configure', 'elixir-performance-onboarding-3-verify', ]); docKeys.forEach(docKey => { apiMocks[docKey] = MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/docs/${docKey}/`, method: 'GET', body: {html: `${docKey} content`}, }); }); const {result} = reactHooks.renderHook(usePerformanceOnboardingDocs, { wrapper, initialProps: project, }); const {docContents, isLoading, hasOnboardingContents} = result.current; expect(isLoading).toEqual(false); expect(docContents).toEqual({}); expect(hasOnboardingContents).toEqual(false); Object.values(apiMocks).forEach(mock => { expect(mock).not.toHaveBeenCalled(); }); }); });