externalIssueActions.spec.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import {Group as GroupFixture} from 'sentry-fixture/group';
  2. import {
  3. render,
  4. renderGlobalModal,
  5. screen,
  6. userEvent,
  7. } from 'sentry-test/reactTestingLibrary';
  8. import ExternalIssueActions from 'sentry/components/group/externalIssuesList/externalIssueActions';
  9. describe('ExternalIssueActions', function () {
  10. const group = GroupFixture();
  11. afterEach(() => {
  12. MockApiClient.clearMockResponses();
  13. });
  14. describe('with no external issues linked', function () {
  15. const integration = TestStubs.GitHubIntegration({externalIssues: []});
  16. const configurations = [integration];
  17. it('renders', function () {
  18. render(
  19. <ExternalIssueActions
  20. key="github"
  21. group={group}
  22. configurations={configurations}
  23. onChange={() => {}}
  24. />
  25. );
  26. // renders GitHub Issue when no issues currently linked
  27. expect(screen.getByText('GitHub Issue')).toBeInTheDocument();
  28. });
  29. it('opens hovercard', async function () {
  30. render(
  31. <ExternalIssueActions
  32. key="github"
  33. group={group}
  34. configurations={configurations}
  35. onChange={() => {}}
  36. />
  37. );
  38. await userEvent.hover(screen.getByText('GitHub Issue'));
  39. expect(await screen.findByText('GitHub Integration')).toBeInTheDocument();
  40. expect(screen.getByText('github.com/test-integration')).toBeInTheDocument();
  41. });
  42. it('opens modal', async function () {
  43. const integrationConfigMock = MockApiClient.addMockResponse({
  44. url: '/organizations/org-slug/issues/1/integrations/1/',
  45. body: {createIssueConfig: []},
  46. });
  47. render(
  48. <ExternalIssueActions
  49. key="github"
  50. group={group}
  51. configurations={configurations}
  52. onChange={() => {}}
  53. />
  54. );
  55. renderGlobalModal();
  56. await userEvent.click(screen.getByRole('button', {name: 'Add'}));
  57. expect(await screen.findByText('Create Issue')).toBeInTheDocument();
  58. expect(integrationConfigMock).toHaveBeenCalledTimes(1);
  59. });
  60. });
  61. describe('with an external issue linked', function () {
  62. const externalIssues = [
  63. {
  64. id: 100,
  65. url: 'https://github.com/MeredithAnya/testing/issues/2',
  66. key: 'getsentry/sentry#2',
  67. },
  68. ];
  69. const integration = TestStubs.GitHubIntegration({externalIssues});
  70. const configurations = [integration];
  71. it('renders', function () {
  72. render(
  73. <ExternalIssueActions
  74. key="github"
  75. group={group}
  76. configurations={configurations}
  77. onChange={() => {}}
  78. />
  79. );
  80. expect(screen.getByText('getsentry/sentry#2')).toBeInTheDocument();
  81. });
  82. it('deletes when clicking x', async function () {
  83. const mockDelete = MockApiClient.addMockResponse({
  84. url: '/organizations/org-slug/issues/1/integrations/1/?externalIssue=100',
  85. method: 'DELETE',
  86. });
  87. render(
  88. <ExternalIssueActions
  89. key="github"
  90. group={group}
  91. configurations={configurations}
  92. onChange={() => {}}
  93. />
  94. );
  95. await userEvent.click(screen.getByRole('button', {name: 'Close'}));
  96. expect(mockDelete).toHaveBeenCalledTimes(1);
  97. });
  98. });
  99. });