import {ProjectFixture} from 'sentry-fixture/project'; import {initializeOrg} from 'sentry-test/initializeOrg'; import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import {fetchOrganizationDetails} from 'sentry/actionCreators/organization'; import * as pageFilters from 'sentry/actionCreators/pageFilters'; import ProjectsStore from 'sentry/stores/projectsStore'; import * as useApi from 'sentry/utils/useApi'; import ProjectDetail from './projectDetail'; jest.mock('sentry/actionCreators/organization'); describe('ProjectDetail', function () { const {organization, router, projects} = initializeOrg(); const project = projects[0]; beforeEach(function () { ProjectsStore.init(); }); afterEach(function () { ProjectsStore.reset(); }); it('Render an error if project not found', async function () { ProjectsStore.loadInitialData([{...project, slug: 'slug'}]); const api = new MockApiClient(); jest.spyOn(useApi, 'default').mockReturnValue(api); render( ); expect(await screen.findByText(/project could not be found/)).toBeInTheDocument(); // By clicking on the retry button, we should attempt to fetch the organization details again await userEvent.click(screen.getByRole('button', {name: 'Retry'})); expect(fetchOrganizationDetails).toHaveBeenCalledWith( api, organization.slug, true, false ); }); it('Render warning if user is not a member of the project', async function () { ProjectsStore.loadInitialData([{...project, hasAccess: false}]); render( ); expect( await screen.findByText(/ask an admin to add your team to this project/i) ).toBeInTheDocument(); }); it('Render project details', async function () { ProjectsStore.loadInitialData([project]); MockApiClient.addMockResponse({ url: `/projects/org-slug/project-slug/`, method: 'GET', body: ProjectFixture(), }); render( ); expect(await screen.findByText(/project details/i)).toBeInTheDocument(); }); it('Sync project with slug', async function () { ProjectsStore.loadInitialData([project]); jest.spyOn(pageFilters, 'updateProjects'); MockApiClient.addMockResponse({ url: `/projects/org-slug/project-slug/`, method: 'GET', body: ProjectFixture(), }); render( ); await waitFor(() => { expect(pageFilters.updateProjects).toHaveBeenCalledWith( [Number(project.id)], router ); }); }); });