]> source.dussan.org Git - sonarqube.git/blob
54ecf78154a08c89a15b650fd3ec32b3309d5317
[sonarqube.git] /
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 userEvent from '@testing-library/user-event';
21 import React from 'react';
22 import AlmSettingsServiceMock from '../../../../api/mocks/AlmSettingsServiceMock';
23 import UserTokensMock from '../../../../api/mocks/UserTokensMock';
24 import { mockAlmSettingsInstance } from '../../../../helpers/mocks/alm-settings';
25 import { mockComponent } from '../../../../helpers/mocks/component';
26 import { mockLanguage, mockLoggedInUser } from '../../../../helpers/testMocks';
27 import { RenderContext, renderApp } from '../../../../helpers/testReactTestingUtils';
28 import { byRole } from '../../../../sonar-aligned/helpers/testSelector';
29 import { AlmKeys } from '../../../../types/alm-settings';
30 import { Feature } from '../../../../types/features';
31 import {
32   getCommonNodes,
33   getCopyToClipboardValue,
34   getTutorialActionButtons,
35   getTutorialBuildButtons,
36 } from '../../test-utils';
37 import { GradleBuildDSL, TutorialModes } from '../../types';
38 import BitbucketPipelinesTutorial, {
39   BitbucketPipelinesTutorialProps,
40 } from '../BitbucketPipelinesTutorial';
41
42 jest.mock('../../../../api/settings', () => ({
43   getAllValues: jest.fn().mockResolvedValue([]),
44 }));
45
46 const tokenMock = new UserTokensMock();
47 const almMock = new AlmSettingsServiceMock();
48
49 afterEach(() => {
50   tokenMock.reset();
51   almMock.reset();
52 });
53
54 const ui = {
55   ...getCommonNodes(TutorialModes.BitbucketPipelines),
56   ...getTutorialActionButtons(),
57   ...getTutorialBuildButtons(),
58 };
59
60 it('should follow and complete all steps', async () => {
61   const user = userEvent.setup();
62   renderBitbucketPipelinesTutorial();
63
64   expect(await ui.secretsStepTitle.find()).toBeInTheDocument();
65
66   // Env variables step
67   expect(getCopyToClipboardValue(0, 'Copy to clipboard')).toMatchSnapshot('sonar token key');
68   expect(getCopyToClipboardValue(1, 'Copy to clipboard')).toMatchSnapshot('sonarqube host url key');
69   expect(getCopyToClipboardValue(2, 'Copy to clipboard')).toMatchSnapshot(
70     'sonarqube host url value',
71   );
72
73   // Create/update configuration file step
74   // Maven
75   await user.click(ui.mavenBuildButton.get());
76   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot('Maven: bitbucket-pipelines.yml');
77
78   // Gradle
79   await user.click(ui.gradleBuildButton.get());
80   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot('Groovy: build.gradle');
81   await user.click(ui.gradleDSLButton(GradleBuildDSL.Kotlin).get());
82   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot('Kotlin: build.gradle.kts');
83   expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot('Gradle: bitbucket-pipelines.yml');
84
85   // .NET
86   await user.click(ui.dotnetBuildButton.get());
87   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot('.NET: bitbucket-pipelines.yml');
88
89   // Cpp
90   await user.click(ui.cppBuildButton.get());
91   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
92     'C++ (automatic) and other: sonar-project.properties',
93   );
94   expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
95     'C++ (automatic) and other: bitbucket-pipelines.yml',
96   );
97
98   // Cpp (manual)
99   await user.click(ui.autoConfigManual.get());
100   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
101     'C++ (manual) and Objective-C: sonar-project.properties',
102   );
103   expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
104     'C++ (manual) and Objective-C: bitbucket-pipelines.yml',
105   );
106   await user.click(ui.arm64Button.get());
107   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
108     'C++ (manual arm64) and Objective-C: sonar-project.properties',
109   );
110   expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
111     'C++ (manual arm64) and Objective-C: bitbucket-pipelines.yml',
112   );
113
114   // Objective-C
115   await user.click(ui.objCBuildButton.get());
116   await user.click(ui.x86_64Button.get());
117   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
118     'C++ (manual) and Objective-C: bitbucket-pipelines.yml',
119   );
120   expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
121     'C++ (manual) and Objective-C: sonar-project.properties',
122   );
123   await user.click(ui.arm64Button.get());
124   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
125     'C++ (manual arm64) and Objective-C: bitbucket-pipelines.yml',
126   );
127   expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
128     'C++ (manual arm64) and Objective-C: sonar-project.properties',
129   );
130
131   // Dart
132   await user.click(ui.dartBuildButton.get());
133   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot('Dart: sonar-project.properties');
134   expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot('Dart: bitbucket-pipelines.yml');
135
136   // Other
137   await user.click(ui.otherBuildButton.get());
138   expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
139     'C++ (automatic) and other: sonar-project.properties',
140   );
141   expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
142     'C++ (automatic) and other: .github/workflows/build.yml',
143   );
144
145   expect(ui.allSetSentence.get()).toBeInTheDocument();
146 });
147
148 it('should generate/delete a new token or use existing one', async () => {
149   const user = userEvent.setup();
150   renderBitbucketPipelinesTutorial();
151
152   expect(await ui.secretsStepTitle.find()).toBeInTheDocument();
153
154   // Generate token
155   await user.click(ui.genTokenDialogButton.get());
156   await user.click(ui.generateTokenButton.get());
157   expect(getCopyToClipboardValue()).toEqual('generatedtoken2');
158
159   // Revoke current token and create new one
160   await user.click(ui.deleteTokenButton.get());
161   await user.type(ui.tokenNameInput.get(), 'newtoken');
162
163   await user.click(ui.expiresInSelect.get());
164   await user.click(byRole('option', { name: 'users.tokens.expiration.365' }).get());
165
166   await user.click(ui.generateTokenButton.get());
167   expect(ui.tokenValue.get()).toBeInTheDocument();
168   await user.click(ui.continueButton.getAll()[0]);
169   expect(ui.tokenValue.query()).not.toBeInTheDocument();
170 });
171
172 it('navigates between steps', async () => {
173   const user = userEvent.setup();
174   almMock.handleSetProjectBinding(AlmKeys.GitHub, {
175     almSetting: 'my-project',
176     project: 'my-project',
177     repository: 'my-project',
178     monorepo: true,
179   });
180   renderBitbucketPipelinesTutorial({
181     almBinding: mockAlmSettingsInstance({
182       alm: AlmKeys.BitbucketCloud,
183       url: 'http://localhost/qube',
184     }),
185   });
186
187   // If project is bound, link to repo is visible
188   expect(await ui.linkToRepo.find()).toBeInTheDocument();
189
190   await user.click(ui.mavenBuildButton.get());
191   expect(ui.allSetSentence.get()).toBeInTheDocument();
192
193   await user.click(ui.ymlFileStepTitle.get());
194   expect(ui.mavenBuildButton.get()).toBeInTheDocument();
195   await user.click(ui.secretsStepTitle.get());
196   expect(ui.genTokenDialogButton.get()).toBeInTheDocument();
197 });
198
199 function renderBitbucketPipelinesTutorial(
200   overrides: Partial<BitbucketPipelinesTutorialProps> = {},
201   { languages = { c: mockLanguage({ key: 'c' }) } }: RenderContext = {},
202 ) {
203   return renderApp(
204     '/',
205     <BitbucketPipelinesTutorial
206       baseUrl="http://localhost:9000"
207       mainBranchName="main"
208       component={mockComponent()}
209       currentUser={mockLoggedInUser()}
210       {...overrides}
211     />,
212     { languages, featureList: [Feature.BranchSupport] },
213   );
214 }