customResolutionModal.spec.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import selectEvent from 'react-select-event';
  2. import styled from '@emotion/styled';
  3. import {Organization} from 'sentry-fixture/organization';
  4. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  5. import CustomResolutionModal from 'sentry/components/customResolutionModal';
  6. import {makeCloseButton} from 'sentry/components/globalModal/components';
  7. import ConfigStore from 'sentry/stores/configStore';
  8. describe('CustomResolutionModal', () => {
  9. let releasesMock;
  10. const organization = Organization();
  11. beforeEach(() => {
  12. ConfigStore.init();
  13. releasesMock = MockApiClient.addMockResponse({
  14. url: '/projects/org-slug/project-slug/releases/',
  15. body: [TestStubs.Release({authors: [TestStubs.User()]})],
  16. });
  17. });
  18. afterEach(() => {
  19. MockApiClient.clearMockResponses();
  20. });
  21. const wrapper = styled(p => p.children);
  22. it('can select a version', async () => {
  23. const onSelected = jest.fn();
  24. render(
  25. <CustomResolutionModal
  26. Header={p => <span>{p.children}</span>}
  27. Body={wrapper()}
  28. Footer={wrapper()}
  29. organization={organization}
  30. projectSlug="project-slug"
  31. onSelected={onSelected}
  32. closeModal={jest.fn()}
  33. CloseButton={makeCloseButton(() => null)}
  34. />
  35. );
  36. expect(releasesMock).toHaveBeenCalled();
  37. selectEvent.openMenu(screen.getByText('e.g. 1.0.4'));
  38. expect(await screen.findByText('1.2.0')).toBeInTheDocument();
  39. await userEvent.click(screen.getByText('1.2.0'));
  40. await userEvent.click(screen.getByText('Resolve'));
  41. expect(onSelected).toHaveBeenCalledWith({
  42. inRelease: 'sentry-android-shop@1.2.0',
  43. });
  44. });
  45. it('indicates which releases had commits from the user', async () => {
  46. const user = TestStubs.User();
  47. ConfigStore.set('user', user);
  48. render(
  49. <CustomResolutionModal
  50. Header={p => <span>{p.children}</span>}
  51. Body={wrapper()}
  52. Footer={wrapper()}
  53. organization={organization}
  54. projectSlug="project-slug"
  55. onSelected={jest.fn()}
  56. closeModal={jest.fn()}
  57. CloseButton={makeCloseButton(() => null)}
  58. />
  59. );
  60. expect(releasesMock).toHaveBeenCalled();
  61. selectEvent.openMenu(screen.getByText('e.g. 1.0.4'));
  62. expect(await screen.findByText(/You committed/)).toBeInTheDocument();
  63. });
  64. it('indicates if the release is semver or timestamp', async () => {
  65. MockApiClient.addMockResponse({
  66. url: '/projects/org-slug/project-slug/releases/',
  67. body: [
  68. // Timestamp release
  69. TestStubs.Release({
  70. version: 'frontend@abcdef',
  71. versionInfo: {version: {raw: 'abcdef'}},
  72. }),
  73. // Semver release
  74. TestStubs.Release({
  75. version: 'frontend@1.2.3',
  76. versionInfo: {
  77. version: {
  78. raw: '1.2.3',
  79. major: 1,
  80. minor: 2,
  81. patch: 3,
  82. buildCode: null,
  83. components: 3,
  84. },
  85. },
  86. }),
  87. ],
  88. });
  89. render(
  90. <CustomResolutionModal
  91. Header={p => <span>{p.children}</span>}
  92. Body={wrapper()}
  93. Footer={wrapper()}
  94. organization={organization}
  95. projectSlug="project-slug"
  96. onSelected={jest.fn()}
  97. closeModal={jest.fn()}
  98. CloseButton={makeCloseButton(() => null)}
  99. />
  100. );
  101. selectEvent.openMenu(screen.getByText('e.g. 1.0.4'));
  102. expect(
  103. await screen.findByRole('menuitemradio', {name: 'abcdef (non-semver)'})
  104. ).toBeInTheDocument();
  105. expect(
  106. screen.getByRole('menuitemradio', {name: '1.2.3 (semver)'})
  107. ).toBeInTheDocument();
  108. });
  109. });