integrationDetailedView.spec.tsx 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  2. import IntegrationDetailedView from 'sentry/views/settings/organizationIntegrations/integrationDetailedView';
  3. describe('IntegrationDetailedView', function () {
  4. const org = TestStubs.Organization({
  5. access: ['org:integrations', 'org:write'],
  6. });
  7. beforeEach(() => {
  8. MockApiClient.clearMockResponses();
  9. MockApiClient.addMockResponse({
  10. url: `/organizations/${org.slug}/config/integrations/?provider_key=bitbucket`,
  11. body: {
  12. providers: [
  13. {
  14. canAdd: true,
  15. canDisable: false,
  16. features: ['commits', 'issue-basic'],
  17. key: 'bitbucket',
  18. metadata: {
  19. aspects: {},
  20. author: 'The Sentry Team',
  21. description:
  22. 'Connect your Sentry organization to Bitbucket, enabling the following features:',
  23. features: [],
  24. issue_url:
  25. 'https://github.com/getsentry/sentry/issues/new?template=bug.yml&title=Bitbucket%20Integration:%20&labels=Component%3A%20Integrations',
  26. noun: 'Installation',
  27. source_url:
  28. 'https://github.com/getsentry/sentry/tree/master/src/sentry/integrations/bitbucket',
  29. },
  30. name: 'Bitbucket',
  31. setupDialog: {
  32. height: 600,
  33. url: '/organizations/sentry/integrations/bitbucket/setup/',
  34. width: 600,
  35. },
  36. slug: 'bitbucket',
  37. },
  38. ],
  39. },
  40. });
  41. MockApiClient.addMockResponse({
  42. url: `/organizations/${org.slug}/integrations/?provider_key=bitbucket&includeConfig=0`,
  43. body: [
  44. {
  45. accountType: null,
  46. configData: {},
  47. configOrganization: [],
  48. domainName: 'bitbucket.org/%7Bfb715533-bbd7-4666-aa57-01dc93dd9cc0%7D',
  49. icon: 'https://secure.gravatar.com/avatar/8b4cb68e40b74c90427d8262256bd1c8?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FNN-0.png',
  50. id: '4',
  51. name: '{fb715533-bbd7-4666-aa57-01dc93dd9cc0}',
  52. provider: {
  53. aspects: {},
  54. canAdd: true,
  55. canDisable: false,
  56. features: ['commits', 'issue-basic'],
  57. key: 'bitbucket',
  58. name: 'Bitbucket',
  59. slug: 'bitbucket',
  60. },
  61. status: 'active',
  62. },
  63. ],
  64. });
  65. });
  66. it('shows integration name, status, and install button', function () {
  67. render(
  68. <IntegrationDetailedView
  69. {...TestStubs.routeComponentProps()}
  70. params={{integrationSlug: 'bitbucket'}}
  71. location={TestStubs.location({query: {}})}
  72. />
  73. );
  74. expect(screen.getByText('Bitbucket')).toBeInTheDocument();
  75. expect(screen.getByText('Installed')).toBeInTheDocument();
  76. expect(screen.getByRole('button', {name: 'Add integration'})).toBeEnabled();
  77. });
  78. it('view configurations', function () {
  79. render(
  80. <IntegrationDetailedView
  81. {...TestStubs.routeComponentProps()}
  82. params={{integrationSlug: 'bitbucket'}}
  83. location={TestStubs.location({query: {tab: 'configurations'}})}
  84. />
  85. );
  86. expect(screen.getByTestId('integration-name')).toHaveTextContent(
  87. '{fb715533-bbd7-4666-aa57-01dc93dd9cc0}'
  88. );
  89. expect(screen.getByRole('button', {name: 'Configure'})).toBeEnabled();
  90. });
  91. it('disables configure for members without access', function () {
  92. render(
  93. <IntegrationDetailedView
  94. {...TestStubs.routeComponentProps()}
  95. params={{integrationSlug: 'bitbucket'}}
  96. location={TestStubs.location({query: {tab: 'configurations'}})}
  97. />,
  98. {organization: TestStubs.Organization({access: ['org:read']})}
  99. );
  100. expect(screen.getByRole('button', {name: 'Configure'})).toBeDisabled();
  101. });
  102. it('allows members to configure github/gitlab', function () {
  103. MockApiClient.addMockResponse({
  104. url: `/organizations/${org.slug}/config/integrations/?provider_key=github`,
  105. body: {
  106. providers: [TestStubs.GitHubIntegrationProvider()],
  107. },
  108. });
  109. MockApiClient.addMockResponse({
  110. url: `/organizations/${org.slug}/integrations/?provider_key=github&includeConfig=0`,
  111. body: [
  112. {
  113. accountType: null,
  114. configData: {},
  115. configOrganization: [],
  116. domainName: 'github.com/%7Bfb715533-bbd7-4666-aa57-01dc93dd9cc0%7D',
  117. icon: 'https://secure.gravatar.com/avatar/8b4cb68e40b74c90427d8262256bd1c8?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FNN-0.png',
  118. id: '4',
  119. name: '{fb715533-bbd7-4666-aa57-01dc93dd9cc0}',
  120. provider: {
  121. aspects: {},
  122. canAdd: true,
  123. canDisable: false,
  124. features: ['commits', 'issue-basic'],
  125. key: 'github',
  126. name: 'GitHub',
  127. slug: 'github',
  128. },
  129. status: 'active',
  130. },
  131. ],
  132. });
  133. render(
  134. <IntegrationDetailedView
  135. {...TestStubs.routeComponentProps()}
  136. params={{integrationSlug: 'github'}}
  137. location={TestStubs.location({query: {tab: 'configurations'}})}
  138. />,
  139. {organization: TestStubs.Organization({access: ['org:read']})}
  140. );
  141. expect(screen.getByRole('button', {name: 'Configure'})).toBeEnabled();
  142. });
  143. it('shows features tab for github only', function () {
  144. MockApiClient.addMockResponse({
  145. url: `/organizations/${org.slug}/config/integrations/?provider_key=github`,
  146. body: {
  147. providers: [TestStubs.GitHubIntegrationProvider()],
  148. },
  149. });
  150. MockApiClient.addMockResponse({
  151. url: `/organizations/${org.slug}/integrations/?provider_key=github&includeConfig=0`,
  152. body: [
  153. {
  154. accountType: null,
  155. configData: {},
  156. configOrganization: [],
  157. domainName: 'github.com/%7Bfb715533-bbd7-4666-aa57-01dc93dd9cc0%7D',
  158. icon: 'https://secure.gravatar.com/avatar/8b4cb68e40b74c90427d8262256bd1c8?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FNN-0.png',
  159. id: '4',
  160. name: '{fb715533-bbd7-4666-aa57-01dc93dd9cc0}',
  161. provider: {
  162. aspects: {},
  163. canAdd: true,
  164. canDisable: false,
  165. features: ['commits', 'issue-basic'],
  166. key: 'github',
  167. name: 'GitHub',
  168. slug: 'github',
  169. },
  170. status: 'active',
  171. },
  172. ],
  173. });
  174. render(
  175. <IntegrationDetailedView
  176. {...TestStubs.routeComponentProps()}
  177. params={{integrationSlug: 'github'}}
  178. organization={org}
  179. location={TestStubs.location({query: {}})}
  180. />
  181. );
  182. expect(screen.getByText('features')).toBeInTheDocument();
  183. });
  184. it('cannot enable PR bot without GitHub integration', async function () {
  185. MockApiClient.addMockResponse({
  186. url: `/organizations/${org.slug}/config/integrations/?provider_key=github`,
  187. body: {
  188. providers: [TestStubs.GitHubIntegrationProvider()],
  189. },
  190. });
  191. MockApiClient.addMockResponse({
  192. url: `/organizations/${org.slug}/integrations/?provider_key=github&includeConfig=0`,
  193. body: [],
  194. });
  195. render(
  196. <IntegrationDetailedView
  197. {...TestStubs.routeComponentProps()}
  198. params={{integrationSlug: 'github'}}
  199. organization={org}
  200. location={TestStubs.location({query: {}})}
  201. />
  202. );
  203. await userEvent.click(screen.getByText('features'));
  204. expect(
  205. screen.getByRole('checkbox', {name: /Enable Pull Request Bot/})
  206. ).toBeDisabled();
  207. });
  208. });