]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-14403 Add monorepo checkbox for Bitbucket server bindings
authorPhilippe Perrin <philippe.perrin@sonarsource.com>
Wed, 27 Jan 2021 14:56:38 +0000 (15:56 +0100)
committersonartech <sonartech@sonarsource.com>
Tue, 2 Feb 2021 20:07:48 +0000 (20:07 +0000)
server/sonar-web/src/main/js/apps/settings/components/pullRequestDecorationBinding/AlmSpecificForm.tsx
server/sonar-web/src/main/js/apps/settings/components/pullRequestDecorationBinding/PRDecorationBinding.tsx
server/sonar-web/src/main/js/apps/settings/components/pullRequestDecorationBinding/__tests__/AlmSpecificForm-test.tsx
server/sonar-web/src/main/js/apps/settings/components/pullRequestDecorationBinding/__tests__/PRDecorationBinding-test.tsx
server/sonar-web/src/main/js/apps/settings/components/pullRequestDecorationBinding/__tests__/__snapshots__/AlmSpecificForm-test.tsx.snap
server/sonar-web/src/main/js/components/tutorials/__tests__/__snapshots__/TutorialSelectionRenderer-test.tsx.snap
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/JenkinsTutorial-test.tsx.snap
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/WebhookStep-test.tsx.snap
server/sonar-web/src/main/js/helpers/mocks/alm-settings.ts
server/sonar-web/src/main/js/types/alm-settings.ts
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index dc766d34715505dae2a9a75d09fd3e1c6fd75a4f..67de027591a093cccb9d660f7eb600d01e4dc7b9 100644 (file)
@@ -113,6 +113,37 @@ function renderField(
   );
 }
 
+function renderMonoRepoField(props: {
+  monorepoEnabled: boolean;
+  value?: boolean;
+  docLink: string;
+  onFieldChange: (id: keyof ProjectAlmBindingResponse, value: string | boolean) => void;
+}) {
+  if (!props.monorepoEnabled) {
+    return null;
+  }
+
+  return renderBooleanField({
+    help: true,
+    helpParams: {
+      doc_link: (
+        <Link to={props.docLink} target="_blank">
+          {translate('learn_more')}
+        </Link>
+      )
+    },
+    id: 'monorepo',
+    onFieldChange: props.onFieldChange,
+    propKey: 'monorepo',
+    value: props.value ?? false,
+    inputExtra: props.value && (
+      <Alert className="no-margin-bottom spacer-left" variant="warning" display="inline">
+        {translate('settings.pr_decoration.binding.form.monorepo.warning')}
+      </Alert>
+    )
+  });
+}
+
 export default function AlmSpecificForm(props: AlmSpecificFormProps) {
   const {
     alm,
@@ -138,26 +169,12 @@ export default function AlmSpecificForm(props: AlmSpecificFormProps) {
             propKey: 'repository',
             value: repository || ''
           })}
-          {monorepoEnabled &&
-            renderBooleanField({
-              help: true,
-              helpParams: {
-                doc_link: (
-                  <Link to="/documentation/analysis/azuredevops-integration/" target="_blank">
-                    {translate('learn_more')}
-                  </Link>
-                )
-              },
-              id: 'azure.monorepo',
-              onFieldChange: props.onFieldChange,
-              propKey: 'monorepo',
-              value: monorepo ?? false,
-              inputExtra: monorepo && (
-                <Alert className="no-margin-bottom spacer-left" variant="warning" display="inline">
-                  {translate('settings.pr_decoration.binding.form.azure.monorepo.warning')}
-                </Alert>
-              )
-            })}
+          {renderMonoRepoField({
+            monorepoEnabled,
+            value: monorepo,
+            docLink: '/documentation/analysis/azuredevops-integration/',
+            onFieldChange: props.onFieldChange
+          })}
         </>
       );
     case AlmKeys.Bitbucket:
@@ -195,6 +212,12 @@ export default function AlmSpecificForm(props: AlmSpecificFormProps) {
             propKey: 'slug',
             value: slug || ''
           })}
+          {renderMonoRepoField({
+            monorepoEnabled,
+            value: monorepo,
+            docLink: '/documentation/analysis/bitbucket-integration/',
+            onFieldChange: props.onFieldChange
+          })}
         </>
       );
     case AlmKeys.GitHub:
index 0749c3ad2048e3abfc528cfd3dcdc286dabbb2bd..f351c4d487a6fee1ce4e1b7ea930cb09c226428f 100644 (file)
@@ -181,15 +181,18 @@ export class PRDecorationBinding extends React.PureComponent<Props & StateProps,
         });
       }
       case AlmKeys.Bitbucket: {
-        if (!almSpecificFields) {
+        const repository = almSpecificFields?.repository;
+        const slug = almSpecificFields?.slug;
+        const monorepo = almSpecificFields?.monorepo ?? false;
+        if (!repository || !slug) {
           return Promise.reject();
         }
-        const { repository = '', slug = '' } = almSpecificFields;
         return setProjectBitbucketBinding({
           almSetting,
           project,
           repository,
-          slug
+          slug,
+          monorepo
         });
       }
       case AlmKeys.GitHub: {
index 5dfbeeec57824c839edc053b2daa01ad5fee4073..38c13dc03cdb740c63fe72f1b279cb807ca1b6f0 100644 (file)
@@ -26,8 +26,11 @@ it.each([
   [AlmKeys.Azure, false],
   [AlmKeys.Azure, true],
   [AlmKeys.Bitbucket, false],
+  [AlmKeys.Bitbucket, true],
   [AlmKeys.GitHub, false],
-  [AlmKeys.GitLab, false]
+  [AlmKeys.GitHub, true],
+  [AlmKeys.GitLab, false],
+  [AlmKeys.GitLab, true]
 ])('it should render correctly for %s and monorepo=%s', (alm, monorepoEnabled) => {
   expect(shallowRender(alm, { monorepoEnabled })).toMatchSnapshot();
 });
index fd5ea3e18c68604fc30c5e6306cb9146628816e2..1e52df759ce1edd369cb12f63fd5b3ede968a1d7 100644 (file)
@@ -146,7 +146,8 @@ describe('handleSubmit', () => {
     const bitbucketKey = 'bitbucket';
     const repository = 'repoKey';
     const slug = 'repoSlug';
-    wrapper.setState({ formData: { key: bitbucketKey, repository, slug }, instances });
+    const monorepo = true;
+    wrapper.setState({ formData: { key: bitbucketKey, repository, slug, monorepo }, instances });
     wrapper.instance().handleSubmit();
     await waitAndUpdate(wrapper);
 
@@ -154,7 +155,8 @@ describe('handleSubmit', () => {
       almSetting: bitbucketKey,
       project: PROJECT_KEY,
       repository,
-      slug
+      slug,
+      monorepo
     });
     expect(wrapper.state().success).toBe(true);
   });
@@ -258,6 +260,37 @@ it('should accept submit azure settings', async () => {
   });
 });
 
+it('should reject submitted bbs settings', async () => {
+  const wrapper = shallowRender();
+
+  expect.assertions(2);
+  await expect(
+    wrapper
+      .instance()
+      .submitProjectAlmBinding(AlmKeys.Bitbucket, 'bbs-binding', { slug: 'project' })
+  ).rejects.toBeUndefined();
+  await expect(
+    wrapper
+      .instance()
+      .submitProjectAlmBinding(AlmKeys.Bitbucket, 'bbs-binding', { repository: 'repo' })
+  ).rejects.toBeUndefined();
+});
+
+it('should accept submit bbs settings', async () => {
+  const wrapper = shallowRender();
+  await wrapper.instance().submitProjectAlmBinding(AlmKeys.Bitbucket, 'bbs', {
+    repository: 'bbs-repo',
+    slug: 'bbs-project'
+  });
+  expect(setProjectBitbucketBinding).toHaveBeenCalledWith({
+    almSetting: 'bbs',
+    project: PROJECT_KEY,
+    repository: 'bbs-repo',
+    slug: 'bbs-project',
+    monorepo: false
+  });
+});
+
 it('should reject submit github settings', async () => {
   const wrapper = shallowRender();
 
index a1856461bb70f4b0db85fd639d7e475f23d57fab..3a91ce2c9771b3aaf7ddfc9af81286c6731ea134 100644 (file)
@@ -152,15 +152,15 @@ exports[`it should render correctly for azure and monorepo=true 1`] = `
   >
     <label
       className="display-flex-center"
-      htmlFor="azure.monorepo"
+      htmlFor="monorepo"
     >
-      settings.pr_decoration.binding.form.azure.monorepo
+      settings.pr_decoration.binding.form.monorepo
       <HelpTooltip
         className="spacer-left"
         overlay={
           <FormattedMessage
-            defaultMessage="settings.pr_decoration.binding.form.azure.monorepo.help"
-            id="settings.pr_decoration.binding.form.azure.monorepo.help"
+            defaultMessage="settings.pr_decoration.binding.form.monorepo.help"
+            id="settings.pr_decoration.binding.form.monorepo.help"
             values={
               Object {
                 "doc_link": <Link
@@ -183,7 +183,7 @@ exports[`it should render correctly for azure and monorepo=true 1`] = `
     >
       <InputForBoolean
         isDefault={true}
-        name="azure.monorepo"
+        name="monorepo"
         onChange={[Function]}
         value={false}
       />
@@ -287,6 +287,143 @@ exports[`it should render correctly for bitbucket and monorepo=false 1`] = `
 </Fragment>
 `;
 
+exports[`it should render correctly for bitbucket and monorepo=true 1`] = `
+<Fragment>
+  <div
+    className="form-field"
+  >
+    <label
+      className="display-flex-center"
+      htmlFor="bitbucket.repository"
+    >
+      settings.pr_decoration.binding.form.bitbucket.repository
+      <em
+        className="mandatory"
+      >
+        *
+      </em>
+      <HelpTooltip
+        className="spacer-left"
+        overlay={
+          <FormattedMessage
+            defaultMessage="settings.pr_decoration.binding.form.bitbucket.repository.help"
+            id="settings.pr_decoration.binding.form.bitbucket.repository.help"
+            values={
+              Object {
+                "example": <React.Fragment>
+                  .../projects/
+                  <strong>
+                    {KEY}
+                  </strong>
+                  /repos/{SLUG}/browse
+                </React.Fragment>,
+              }
+            }
+          />
+        }
+        placement="right"
+      />
+    </label>
+    <input
+      className="input-super-large"
+      id="bitbucket.repository"
+      maxLength={256}
+      name="bitbucket.repository"
+      onChange={[Function]}
+      type="text"
+      value=""
+    />
+  </div>
+  <div
+    className="form-field"
+  >
+    <label
+      className="display-flex-center"
+      htmlFor="bitbucket.slug"
+    >
+      settings.pr_decoration.binding.form.bitbucket.slug
+      <em
+        className="mandatory"
+      >
+        *
+      </em>
+      <HelpTooltip
+        className="spacer-left"
+        overlay={
+          <FormattedMessage
+            defaultMessage="settings.pr_decoration.binding.form.bitbucket.slug.help"
+            id="settings.pr_decoration.binding.form.bitbucket.slug.help"
+            values={
+              Object {
+                "example": <React.Fragment>
+                  .../projects/{KEY}/repos/
+                  <strong>
+                    {SLUG}
+                  </strong>
+                  /browse
+                </React.Fragment>,
+              }
+            }
+          />
+        }
+        placement="right"
+      />
+    </label>
+    <input
+      className="input-super-large"
+      id="bitbucket.slug"
+      maxLength={256}
+      name="bitbucket.slug"
+      onChange={[Function]}
+      type="text"
+      value=""
+    />
+  </div>
+  <div
+    className="form-field"
+  >
+    <label
+      className="display-flex-center"
+      htmlFor="monorepo"
+    >
+      settings.pr_decoration.binding.form.monorepo
+      <HelpTooltip
+        className="spacer-left"
+        overlay={
+          <FormattedMessage
+            defaultMessage="settings.pr_decoration.binding.form.monorepo.help"
+            id="settings.pr_decoration.binding.form.monorepo.help"
+            values={
+              Object {
+                "doc_link": <Link
+                  onlyActiveOnIndex={false}
+                  style={Object {}}
+                  target="_blank"
+                  to="/documentation/analysis/bitbucket-integration/"
+                >
+                  learn_more
+                </Link>,
+              }
+            }
+          />
+        }
+        placement="right"
+      />
+    </label>
+    <div
+      className="display-flex-center"
+    >
+      <InputForBoolean
+        isDefault={true}
+        name="monorepo"
+        onChange={[Function]}
+        value={false}
+      />
+    </div>
+  </div>
+</Fragment>
+`;
+
 exports[`it should render correctly for github and monorepo=false 1`] = `
 <Fragment>
   <div
@@ -362,6 +499,81 @@ exports[`it should render correctly for github and monorepo=false 1`] = `
 </Fragment>
 `;
 
+exports[`it should render correctly for github and monorepo=true 1`] = `
+<Fragment>
+  <div
+    className="form-field"
+  >
+    <label
+      className="display-flex-center"
+      htmlFor="github.repository"
+    >
+      settings.pr_decoration.binding.form.github.repository
+      <em
+        className="mandatory"
+      >
+        *
+      </em>
+      <HelpTooltip
+        className="spacer-left"
+        overlay={
+          <FormattedMessage
+            defaultMessage="settings.pr_decoration.binding.form.github.repository.help"
+            id="settings.pr_decoration.binding.form.github.repository.help"
+            values={
+              Object {
+                "example": "SonarSource/sonarqube",
+              }
+            }
+          />
+        }
+        placement="right"
+      />
+    </label>
+    <input
+      className="input-super-large"
+      id="github.repository"
+      maxLength={256}
+      name="github.repository"
+      onChange={[Function]}
+      type="text"
+      value=""
+    />
+  </div>
+  <div
+    className="form-field"
+  >
+    <label
+      className="display-flex-center"
+      htmlFor="github.summary_comment_setting"
+    >
+      settings.pr_decoration.binding.form.github.summary_comment_setting
+      <HelpTooltip
+        className="spacer-left"
+        overlay={
+          <FormattedMessage
+            defaultMessage="settings.pr_decoration.binding.form.github.summary_comment_setting.help"
+            id="settings.pr_decoration.binding.form.github.summary_comment_setting.help"
+            values={Object {}}
+          />
+        }
+        placement="right"
+      />
+    </label>
+    <div
+      className="display-flex-center"
+    >
+      <InputForBoolean
+        isDefault={true}
+        name="github.summary_comment_setting"
+        onChange={[Function]}
+        value={true}
+      />
+    </div>
+  </div>
+</Fragment>
+`;
+
 exports[`it should render correctly for gitlab and monorepo=false 1`] = `
 <div
   className="form-field"
@@ -389,6 +601,33 @@ exports[`it should render correctly for gitlab and monorepo=false 1`] = `
 </div>
 `;
 
+exports[`it should render correctly for gitlab and monorepo=true 1`] = `
+<div
+  className="form-field"
+>
+  <label
+    className="display-flex-center"
+    htmlFor="gitlab.repository"
+  >
+    settings.pr_decoration.binding.form.gitlab.repository
+    <em
+      className="mandatory"
+    >
+      *
+    </em>
+  </label>
+  <input
+    className="input-super-large"
+    id="gitlab.repository"
+    maxLength={256}
+    name="gitlab.repository"
+    onChange={[Function]}
+    type="text"
+    value=""
+  />
+</div>
+`;
+
 exports[`should render an alert for azure when the monorepo option is activated 1`] = `
 <Fragment>
   <div
@@ -466,15 +705,15 @@ exports[`should render an alert for azure when the monorepo option is activated
   >
     <label
       className="display-flex-center"
-      htmlFor="azure.monorepo"
+      htmlFor="monorepo"
     >
-      settings.pr_decoration.binding.form.azure.monorepo
+      settings.pr_decoration.binding.form.monorepo
       <HelpTooltip
         className="spacer-left"
         overlay={
           <FormattedMessage
-            defaultMessage="settings.pr_decoration.binding.form.azure.monorepo.help"
-            id="settings.pr_decoration.binding.form.azure.monorepo.help"
+            defaultMessage="settings.pr_decoration.binding.form.monorepo.help"
+            id="settings.pr_decoration.binding.form.monorepo.help"
             values={
               Object {
                 "doc_link": <Link
@@ -497,7 +736,7 @@ exports[`should render an alert for azure when the monorepo option is activated
     >
       <InputForBoolean
         isDefault={true}
-        name="azure.monorepo"
+        name="monorepo"
         onChange={[Function]}
         value={true}
       />
@@ -506,7 +745,7 @@ exports[`should render an alert for azure when the monorepo option is activated
         display="inline"
         variant="warning"
       >
-        settings.pr_decoration.binding.form.azure.monorepo.warning
+        settings.pr_decoration.binding.form.monorepo.warning
       </Alert>
     </div>
   </div>
index b9ce14c2e614d83918d23eded76e7d2b184db32a..c43527dccbd274d988e540dfe265a95868821899 100644 (file)
@@ -130,6 +130,7 @@ exports[`should render correctly: jenkins tutorial 1`] = `
       Object {
         "alm": "bitbucket",
         "key": "foo",
+        "monorepo": true,
         "repository": "PROJECT_KEY",
         "slug": "repo-slug",
       }
index fc7e2f796aa905abb03c02c508e3bfd8c0e30b40..c38b75a11f3c84f8dd65988507e0a9215c632051 100644 (file)
@@ -28,6 +28,7 @@ exports[`should render correctly: default 1`] = `
       Object {
         "alm": "bitbucket",
         "key": "foo",
+        "monorepo": true,
         "repository": "PROJECT_KEY",
         "slug": "repo-slug",
       }
@@ -42,6 +43,7 @@ exports[`should render correctly: default 1`] = `
       Object {
         "alm": "bitbucket",
         "key": "foo",
+        "monorepo": true,
         "repository": "PROJECT_KEY",
         "slug": "repo-slug",
       }
index 0acde32c4274ef32056fa65c8e038a796b2bdcfb..23f83edc47b849d84863784066ffe676a0d86257 100644 (file)
@@ -79,6 +79,7 @@ exports[`it should render correctly for bitbucket: content 1`] = `
         Object {
           "alm": "bitbucket",
           "key": "foo",
+          "monorepo": true,
           "repository": "PROJECT_KEY",
           "slug": "repo-slug",
         }
index fbe38e044c36b61eac467a81376b7364fff16301..34018f3fd9a013373d2b9ede9af481ce014723c2 100644 (file)
@@ -106,6 +106,7 @@ export function mockProjectBitbucketBindingResponse(
     key: 'foo',
     repository: 'PROJECT_KEY',
     slug: 'repo-slug',
+    monorepo: true,
     ...overrides
   };
 }
index d048494624876a45b147fad4eec794b674d9e4a4..148d3b08950ebb3e65376a8e0f312ad35d0aea47 100644 (file)
@@ -73,6 +73,7 @@ export interface ProjectBitbucketBindingResponse extends ProjectAlmBindingRespon
   alm: AlmKeys.Bitbucket;
   repository: string;
   slug: string;
+  monorepo: boolean;
 }
 
 export interface ProjectGitHubBindingResponse extends ProjectAlmBindingResponse {
@@ -100,6 +101,7 @@ export interface AzureProjectAlmBindingParams extends ProjectAlmBindingParams {
 export interface BitbucketProjectAlmBindingParams extends ProjectAlmBindingParams {
   repository: string;
   slug: string;
+  monorepo: boolean;
 }
 
 export interface GithubProjectAlmBindingParams extends ProjectAlmBindingParams {
index 9ccf4f1a64ebde4b9de05f1368b836ec69304b03..318ff9800d4890aec7a7f24590b03c5dc761dbc0 100644 (file)
@@ -1138,13 +1138,13 @@ settings.pr_decoration.binding.title=Pull Request Decoration
 settings.pr_decoration.binding.description=Enable Pull Request Decoration for this project.
 settings.pr_decoration.binding.form.url=Project location
 settings.pr_decoration.binding.form.name=Configuration name
+settings.pr_decoration.binding.form.monorepo=Enable mono repository support
+settings.pr_decoration.binding.form.monorepo.help=Enable this setting if your project is part of a mono repository. {doc_link}
+settings.pr_decoration.binding.form.monorepo.warning=This setting must be enabled for all SonarQube projects that are part of a mono repository.
 settings.pr_decoration.binding.form.azure.project=Project Name
 settings.pr_decoration.binding.form.azure.project.help=The name of the Azure DevOps Server project containing your repository.
 settings.pr_decoration.binding.form.azure.repository=Repository Name
 settings.pr_decoration.binding.form.azure.repository.help=The name of your Azure DevOps Server repository.
-settings.pr_decoration.binding.form.azure.monorepo=Enable mono repository support
-settings.pr_decoration.binding.form.azure.monorepo.help=Enable this setting if your project is part of a mono repository. {doc_link}
-settings.pr_decoration.binding.form.azure.monorepo.warning=This setting must be enabled for all projects that are part of a mono repository.
 settings.pr_decoration.binding.form.github.repository=Repository identifier
 settings.pr_decoration.binding.form.github.repository.help=The path of your repository URL. Example: {example}
 settings.pr_decoration.binding.form.github.summary_comment_setting=Enable analysis summary under the GitHub Conversation tab