bookmarkStar.spec.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import {Organization} from 'sentry-fixture/organization';
  2. import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
  3. import BookmarkStar from 'sentry/components/projects/bookmarkStar';
  4. import ProjectsStore from 'sentry/stores/projectsStore';
  5. describe('BookmarkStar', function () {
  6. const project = TestStubs.Project();
  7. beforeEach(function () {
  8. ProjectsStore.loadInitialData([project]);
  9. });
  10. afterEach(function () {
  11. ProjectsStore.reset();
  12. MockApiClient.clearMockResponses();
  13. });
  14. it('renders', function () {
  15. render(<BookmarkStar organization={Organization()} project={project} />);
  16. });
  17. it('can star', async function () {
  18. render(<BookmarkStar organization={Organization()} project={project} />);
  19. const projectMock = MockApiClient.addMockResponse({
  20. url: '/projects/org-slug/project-slug/',
  21. method: 'PUT',
  22. body: TestStubs.Project({isBookmarked: true, platform: 'javascript'}),
  23. });
  24. expect(screen.getByRole('button', {pressed: false})).toBeInTheDocument();
  25. await userEvent.click(screen.getByRole('button'));
  26. // Visually optimistically updated
  27. expect(screen.getByRole('button', {pressed: true})).toBeInTheDocument();
  28. expect(projectMock).toHaveBeenCalledWith(
  29. '/projects/org-slug/project-slug/',
  30. expect.objectContaining({data: {isBookmarked: true}})
  31. );
  32. expect(ProjectsStore.getBySlug(project.slug)?.isBookmarked).toBe(true);
  33. });
  34. it('can unstar', async function () {
  35. render(
  36. <BookmarkStar
  37. organization={Organization()}
  38. project={TestStubs.Project({isBookmarked: true})}
  39. />
  40. );
  41. const projectMock = MockApiClient.addMockResponse({
  42. url: '/projects/org-slug/project-slug/',
  43. method: 'PUT',
  44. body: TestStubs.Project({isBookmarked: false, platform: 'javascript'}),
  45. });
  46. expect(screen.getByRole('button', {pressed: true})).toBeInTheDocument();
  47. await userEvent.click(screen.getByRole('button'));
  48. // Visually optimistically updated
  49. expect(screen.getByRole('button', {pressed: false})).toBeInTheDocument();
  50. expect(projectMock).toHaveBeenCalledWith(
  51. '/projects/org-slug/project-slug/',
  52. expect.objectContaining({data: {isBookmarked: false}})
  53. );
  54. // Not yet updated in the project store
  55. expect(ProjectsStore.getBySlug(project.slug)?.isBookmarked).toBe(false);
  56. // Project store is updated
  57. await waitFor(() => {
  58. const updatedProject = ProjectsStore.getBySlug(project.slug);
  59. expect(updatedProject?.isBookmarked).toBe(false);
  60. });
  61. });
  62. });