You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GitHubMonorepoProjectCreate-it.tsx 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2024 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. import { waitFor } from '@testing-library/react';
  21. import userEvent from '@testing-library/user-event';
  22. import React from 'react';
  23. import selectEvent from 'react-select-event';
  24. import AlmIntegrationsServiceMock from '../../../../api/mocks/AlmIntegrationsServiceMock';
  25. import AlmSettingsServiceMock from '../../../../api/mocks/AlmSettingsServiceMock';
  26. import ComponentsServiceMock from '../../../../api/mocks/ComponentsServiceMock';
  27. import DopTranslationServiceMock from '../../../../api/mocks/DopTranslationServiceMock';
  28. import NewCodeDefinitionServiceMock from '../../../../api/mocks/NewCodeDefinitionServiceMock';
  29. import { renderApp } from '../../../../helpers/testReactTestingUtils';
  30. import { byRole } from '../../../../helpers/testSelector';
  31. import { AlmKeys } from '../../../../types/alm-settings';
  32. import { Feature } from '../../../../types/features';
  33. import CreateProjectPage from '../CreateProjectPage';
  34. import { CreateProjectModes } from '../types';
  35. jest.mock('../../../../api/alm-integrations');
  36. jest.mock('../../../../api/alm-settings');
  37. let almIntegrationHandler: AlmIntegrationsServiceMock;
  38. let almSettingsHandler: AlmSettingsServiceMock;
  39. let componentsHandler: ComponentsServiceMock;
  40. let dopTranslationHandler: DopTranslationServiceMock;
  41. let newCodePeriodHandler: NewCodeDefinitionServiceMock;
  42. const ui = {
  43. addButton: byRole('button', { name: 'onboarding.create_project.monorepo.add_project' }),
  44. cancelButton: byRole('button', { name: 'cancel' }),
  45. dopSettingSelector: byRole('combobox', {
  46. name: `onboarding.create_project.monorepo.choose_dop_setting.${AlmKeys.GitHub}`,
  47. }),
  48. gitHubOnboardingTitle: byRole('heading', { name: 'onboarding.create_project.github.title' }),
  49. monorepoProjectTitle: byRole('heading', {
  50. name: 'onboarding.create_project.monorepo.project_title',
  51. }),
  52. monorepoSetupLink: byRole('link', { name: 'onboarding.create_project.github.subtitle.link' }),
  53. monorepoTitle: byRole('heading', { name: 'onboarding.create_project.monorepo.titlealm.github' }),
  54. organizationSelector: byRole('combobox', {
  55. name: `onboarding.create_project.monorepo.choose_organization.${AlmKeys.GitHub}`,
  56. }),
  57. removeButton: byRole('button', { name: 'onboarding.create_project.monorepo.remove_project' }),
  58. repositorySelector: byRole('combobox', {
  59. name: `onboarding.create_project.monorepo.choose_repository.${AlmKeys.GitHub}`,
  60. }),
  61. submitButton: byRole('button', { name: 'next' }),
  62. };
  63. beforeAll(() => {
  64. Object.defineProperty(window, 'location', {
  65. configurable: true,
  66. value: { replace: jest.fn() },
  67. });
  68. almIntegrationHandler = new AlmIntegrationsServiceMock();
  69. almSettingsHandler = new AlmSettingsServiceMock();
  70. componentsHandler = new ComponentsServiceMock();
  71. dopTranslationHandler = new DopTranslationServiceMock();
  72. newCodePeriodHandler = new NewCodeDefinitionServiceMock();
  73. });
  74. beforeEach(() => {
  75. jest.clearAllMocks();
  76. almIntegrationHandler.reset();
  77. almSettingsHandler.reset();
  78. componentsHandler.reset();
  79. dopTranslationHandler.reset();
  80. newCodePeriodHandler.reset();
  81. });
  82. describe('github monorepo project setup', () => {
  83. it('should be able to access monorepo setup page from GitHub project import page', async () => {
  84. const user = userEvent.setup();
  85. renderCreateProject({ isMonorepo: false });
  86. await ui.monorepoSetupLink.find();
  87. await user.click(await ui.monorepoSetupLink.find());
  88. expect(ui.monorepoTitle.get()).toBeInTheDocument();
  89. });
  90. it('should be able to go back to GitHub onboarding page from monorepo setup page', async () => {
  91. const user = userEvent.setup();
  92. renderCreateProject();
  93. await user.click(await ui.cancelButton.find());
  94. expect(ui.gitHubOnboardingTitle.get()).toBeInTheDocument();
  95. });
  96. it('should be able to set a monorepo project', async () => {
  97. const user = userEvent.setup();
  98. renderCreateProject({ code: '123', dopSetting: 'dop-setting-test-id', isMonorepo: true });
  99. expect(await ui.monorepoTitle.find()).toBeInTheDocument();
  100. expect(await ui.dopSettingSelector.find()).toBeInTheDocument();
  101. expect(ui.monorepoProjectTitle.query()).not.toBeInTheDocument();
  102. await waitFor(async () => {
  103. await selectEvent.select(await ui.organizationSelector.find(), 'org-1');
  104. });
  105. expect(ui.monorepoProjectTitle.query()).not.toBeInTheDocument();
  106. await selectEvent.select(await ui.repositorySelector.find(), 'Github repo 1');
  107. expect(await ui.monorepoProjectTitle.find()).toBeInTheDocument();
  108. let projects = byRole('textbox', {
  109. name: /onboarding.create_project.project_key/,
  110. }).getAll();
  111. expect(projects).toHaveLength(1);
  112. expect(projects[0]).toHaveValue('org-1_Github-repo-1_add-your-reference');
  113. expect(ui.submitButton.get()).toBeEnabled();
  114. await user.click(ui.addButton.get());
  115. await waitFor(() => {
  116. projects = byRole('textbox', {
  117. name: /onboarding.create_project.project_key/,
  118. }).getAll();
  119. expect(projects).toHaveLength(2);
  120. });
  121. expect(projects[0]).toHaveValue('org-1_Github-repo-1_add-your-reference');
  122. expect(projects[1]).toHaveValue('org-1_Github-repo-1_add-your-reference-1');
  123. expect(ui.submitButton.get()).toBeEnabled();
  124. await user.type(projects[0], '-1');
  125. expect(ui.submitButton.get()).toBeDisabled();
  126. await user.clear(projects[1]);
  127. expect(ui.submitButton.get()).toBeDisabled();
  128. await user.click(ui.removeButton.getAll()[0]);
  129. await waitFor(() => {
  130. projects = byRole('textbox', {
  131. name: /onboarding.create_project.project_key/,
  132. }).getAll();
  133. expect(projects).toHaveLength(1);
  134. });
  135. expect(projects[0]).toHaveValue('');
  136. expect(ui.submitButton.get()).toBeDisabled();
  137. await user.type(projects[0], 'project-key');
  138. expect(ui.submitButton.get()).toBeEnabled();
  139. });
  140. });
  141. function renderCreateProject({
  142. code,
  143. dopSetting,
  144. isMonorepo = true,
  145. }: {
  146. code?: string;
  147. dopSetting?: string;
  148. isMonorepo?: boolean;
  149. } = {}) {
  150. let queryString = `mode=${CreateProjectModes.GitHub}`;
  151. if (isMonorepo) {
  152. queryString += '&mono=true';
  153. }
  154. if (dopSetting !== undefined) {
  155. queryString += `&dopSetting=${dopSetting}`;
  156. }
  157. if (code !== undefined) {
  158. queryString += `&code=${code}`;
  159. }
  160. renderApp('projects/create', <CreateProjectPage />, {
  161. navigateTo: `projects/create?${queryString}`,
  162. featureList: [Feature.MonoRepositoryPullRequestDecoration],
  163. });
  164. }