import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import BookmarkStar from 'sentry/components/projects/bookmarkStar'; import ProjectsStore from 'sentry/stores/projectsStore'; describe('BookmarkStar', function () { const project = TestStubs.Project(); beforeEach(function () { ProjectsStore.loadInitialData([project]); }); afterEach(function () { ProjectsStore.reset(); MockApiClient.clearMockResponses(); }); it('renders', function () { const {container} = render( ); expect(container).toSnapshot(); }); it('can star', async function () { render(); const projectMock = MockApiClient.addMockResponse({ url: '/projects/org-slug/project-slug/', method: 'PUT', body: TestStubs.Project({isBookmarked: true, platform: 'javascript'}), }); expect(screen.getByRole('button', {pressed: false})).toBeInTheDocument(); userEvent.click(screen.getByRole('button')); // Visually optimistically updated expect(screen.getByRole('button', {pressed: true})).toBeInTheDocument(); expect(projectMock).toHaveBeenCalledWith( '/projects/org-slug/project-slug/', expect.objectContaining({data: {isBookmarked: true}}) ); // Not yet updated in the project store expect(ProjectsStore.getBySlug(project.slug)?.isBookmarked).toBe(false); // Project store is updated await waitFor(() => { const updatedProject = ProjectsStore.getBySlug(project.slug); expect(updatedProject?.isBookmarked).toBe(true); }); }); it('can unstar', async function () { render( ); const projectMock = MockApiClient.addMockResponse({ url: '/projects/org-slug/project-slug/', method: 'PUT', body: TestStubs.Project({isBookmarked: false, platform: 'javascript'}), }); expect(screen.getByRole('button', {pressed: true})).toBeInTheDocument(); userEvent.click(screen.getByRole('button')); // Visually optimistically updated expect(screen.getByRole('button', {pressed: false})).toBeInTheDocument(); expect(projectMock).toHaveBeenCalledWith( '/projects/org-slug/project-slug/', expect.objectContaining({data: {isBookmarked: false}}) ); // Not yet updated in the project store expect(ProjectsStore.getBySlug(project.slug)?.isBookmarked).toBe(false); // Project store is updated await waitFor(() => { const updatedProject = ProjectsStore.getBySlug(project.slug); expect(updatedProject?.isBookmarked).toBe(false); }); }); });