|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- /*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
- import { waitFor } from '@testing-library/react';
- import userEvent from '@testing-library/user-event';
- import React from 'react';
- import selectEvent from 'react-select-event';
- import AlmIntegrationsServiceMock from '../../../../api/mocks/AlmIntegrationsServiceMock';
- import AlmSettingsServiceMock from '../../../../api/mocks/AlmSettingsServiceMock';
- import ComponentsServiceMock from '../../../../api/mocks/ComponentsServiceMock';
- import DopTranslationServiceMock from '../../../../api/mocks/DopTranslationServiceMock';
- import NewCodeDefinitionServiceMock from '../../../../api/mocks/NewCodeDefinitionServiceMock';
- import { renderApp } from '../../../../helpers/testReactTestingUtils';
- import { byRole } from '../../../../helpers/testSelector';
- import { AlmKeys } from '../../../../types/alm-settings';
- import { Feature } from '../../../../types/features';
- import CreateProjectPage from '../CreateProjectPage';
- import { CreateProjectModes } from '../types';
-
- jest.mock('../../../../api/alm-integrations');
- jest.mock('../../../../api/alm-settings');
-
- let almIntegrationHandler: AlmIntegrationsServiceMock;
- let almSettingsHandler: AlmSettingsServiceMock;
- let componentsHandler: ComponentsServiceMock;
- let dopTranslationHandler: DopTranslationServiceMock;
- let newCodePeriodHandler: NewCodeDefinitionServiceMock;
-
- const ui = {
- addButton: byRole('button', { name: 'onboarding.create_project.monorepo.add_project' }),
- cancelButton: byRole('button', { name: 'cancel' }),
- dopSettingSelector: byRole('combobox', {
- name: `onboarding.create_project.monorepo.choose_dop_setting.${AlmKeys.GitHub}`,
- }),
- gitHubOnboardingTitle: byRole('heading', { name: 'onboarding.create_project.github.title' }),
- monorepoProjectTitle: byRole('heading', {
- name: 'onboarding.create_project.monorepo.project_title',
- }),
- monorepoSetupLink: byRole('link', { name: 'onboarding.create_project.github.subtitle.link' }),
- monorepoTitle: byRole('heading', { name: 'onboarding.create_project.monorepo.titlealm.github' }),
- organizationSelector: byRole('combobox', {
- name: `onboarding.create_project.monorepo.choose_organization.${AlmKeys.GitHub}`,
- }),
- removeButton: byRole('button', { name: 'onboarding.create_project.monorepo.remove_project' }),
- repositorySelector: byRole('combobox', {
- name: `onboarding.create_project.monorepo.choose_repository.${AlmKeys.GitHub}`,
- }),
- submitButton: byRole('button', { name: 'next' }),
- };
-
- beforeAll(() => {
- Object.defineProperty(window, 'location', {
- configurable: true,
- value: { replace: jest.fn() },
- });
- almIntegrationHandler = new AlmIntegrationsServiceMock();
- almSettingsHandler = new AlmSettingsServiceMock();
- componentsHandler = new ComponentsServiceMock();
- dopTranslationHandler = new DopTranslationServiceMock();
- newCodePeriodHandler = new NewCodeDefinitionServiceMock();
- });
-
- beforeEach(() => {
- jest.clearAllMocks();
- almIntegrationHandler.reset();
- almSettingsHandler.reset();
- componentsHandler.reset();
- dopTranslationHandler.reset();
- newCodePeriodHandler.reset();
- });
-
- describe('github monorepo project setup', () => {
- it('should be able to access monorepo setup page from GitHub project import page', async () => {
- const user = userEvent.setup();
- renderCreateProject({ isMonorepo: false });
-
- await ui.monorepoSetupLink.find();
-
- await user.click(await ui.monorepoSetupLink.find());
-
- expect(ui.monorepoTitle.get()).toBeInTheDocument();
- });
-
- it('should be able to go back to GitHub onboarding page from monorepo setup page', async () => {
- const user = userEvent.setup();
- renderCreateProject();
-
- await user.click(await ui.cancelButton.find());
-
- expect(ui.gitHubOnboardingTitle.get()).toBeInTheDocument();
- });
-
- it('should be able to set a monorepo project', async () => {
- const user = userEvent.setup();
- renderCreateProject({ code: '123', dopSetting: 'dop-setting-test-id', isMonorepo: true });
-
- expect(await ui.monorepoTitle.find()).toBeInTheDocument();
-
- expect(await ui.dopSettingSelector.find()).toBeInTheDocument();
- expect(ui.monorepoProjectTitle.query()).not.toBeInTheDocument();
-
- await waitFor(async () => {
- await selectEvent.select(await ui.organizationSelector.find(), 'org-1');
- });
- expect(ui.monorepoProjectTitle.query()).not.toBeInTheDocument();
-
- await selectEvent.select(await ui.repositorySelector.find(), 'Github repo 1');
- expect(await ui.monorepoProjectTitle.find()).toBeInTheDocument();
- let projects = byRole('textbox', {
- name: /onboarding.create_project.project_key/,
- }).getAll();
- expect(projects).toHaveLength(1);
- expect(projects[0]).toHaveValue('org-1_Github-repo-1_add-your-reference');
- expect(ui.submitButton.get()).toBeEnabled();
-
- await user.click(ui.addButton.get());
- await waitFor(() => {
- projects = byRole('textbox', {
- name: /onboarding.create_project.project_key/,
- }).getAll();
- expect(projects).toHaveLength(2);
- });
- expect(projects[0]).toHaveValue('org-1_Github-repo-1_add-your-reference');
- expect(projects[1]).toHaveValue('org-1_Github-repo-1_add-your-reference-1');
- expect(ui.submitButton.get()).toBeEnabled();
-
- await user.type(projects[0], '-1');
- expect(ui.submitButton.get()).toBeDisabled();
- await user.clear(projects[1]);
- expect(ui.submitButton.get()).toBeDisabled();
-
- await user.click(ui.removeButton.getAll()[0]);
- await waitFor(() => {
- projects = byRole('textbox', {
- name: /onboarding.create_project.project_key/,
- }).getAll();
- expect(projects).toHaveLength(1);
- });
- expect(projects[0]).toHaveValue('');
- expect(ui.submitButton.get()).toBeDisabled();
-
- await user.type(projects[0], 'project-key');
- expect(ui.submitButton.get()).toBeEnabled();
- });
- });
-
- function renderCreateProject({
- code,
- dopSetting,
- isMonorepo = true,
- }: {
- code?: string;
- dopSetting?: string;
- isMonorepo?: boolean;
- } = {}) {
- let queryString = `mode=${CreateProjectModes.GitHub}`;
- if (isMonorepo) {
- queryString += '&mono=true';
- }
- if (dopSetting !== undefined) {
- queryString += `&dopSetting=${dopSetting}`;
- }
- if (code !== undefined) {
- queryString += `&code=${code}`;
- }
-
- renderApp('projects/create', <CreateProjectPage />, {
- navigateTo: `projects/create?${queryString}`,
- featureList: [Feature.MonoRepositoryPullRequestDecoration],
- });
- }
|