]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11032 Hide Analyze Project to user without provisioning permission
authorPascal Mugnier <pascal.mugnier@sonarsource.com>
Mon, 30 Jul 2018 06:27:23 +0000 (08:27 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 2 Aug 2018 18:21:32 +0000 (20:21 +0200)
server/sonar-web/src/main/js/app/components/embed-docs-modal/EmbedDocsPopup.tsx
server/sonar-web/src/main/js/app/components/embed-docs-modal/__tests__/EmbedDocsPopup-test.tsx
server/sonar-web/src/main/js/app/components/embed-docs-modal/__tests__/__snapshots__/EmbedDocsPopup-test.tsx.snap
server/sonar-web/src/main/js/app/types.ts

index 5d9cacc42e104866e08f29428a28f52f0b14782c..c62d51dfd5ec25a5a31c7e978ce3c10f511779c8 100644 (file)
@@ -22,7 +22,7 @@ import * as PropTypes from 'prop-types';
 import { Link } from 'react-router';
 import ProductNewsMenuItem from './ProductNewsMenuItem';
 import { SuggestionLink } from './SuggestionsProvider';
-import { CurrentUser, isLoggedIn } from '../../types';
+import { CurrentUser, isLoggedIn, hasGlobalPermission } from '../../types';
 import { translate } from '../../../helpers/l10n';
 import { getBaseUrl } from '../../../helpers/urls';
 import { isSonarCloud } from '../../../helpers/system';
@@ -119,15 +119,17 @@ export default class EmbedDocsPopup extends React.PureComponent<Props> {
   }
 
   renderSonarQubeLinks() {
+    const { currentUser } = this.props;
     return (
       <React.Fragment>
-        {isLoggedIn(this.props.currentUser) && (
-          <li>
-            <a href="#" onClick={this.onAnalyzeProjectClick}>
-              {translate('embed_docs.analyze_new_project')}
-            </a>
-          </li>
-        )}
+        {isLoggedIn(currentUser) &&
+          hasGlobalPermission(currentUser, 'provisioning') && (
+            <li>
+              <a data-test="analyze-new-project" href="#" onClick={this.onAnalyzeProjectClick}>
+                {translate('embed_docs.analyze_new_project')}
+              </a>
+            </li>
+          )}
         <li className="divider" />
         <li>
           <a href="https://community.sonarsource.com/" rel="noopener noreferrer" target="_blank">
index 9423f9979fa9b2dd8319fa84d2834268a6784bc5..24f5fbec4d653f2b64cfffcd85fbb3dd9d39a1c3 100644 (file)
@@ -42,6 +42,28 @@ it('should display suggestion links', () => {
   expect(wrapper).toMatchSnapshot();
 });
 
+it('should display analyze new project link when user has permission', () => {
+  const wrapper = shallow(
+    <EmbedDocsPopup
+      currentUser={{ isLoggedIn: true, permissions: { global: ['provisioning'] } }}
+      onClose={jest.fn()}
+      suggestions={suggestions}
+    />
+  );
+  expect(wrapper.find('[data-test="analyze-new-project"]').exists()).toBe(true);
+});
+
+it('should not display analyze new project link when user does not have permission', () => {
+  const wrapper = shallow(
+    <EmbedDocsPopup
+      currentUser={{ isLoggedIn: true }}
+      onClose={jest.fn()}
+      suggestions={suggestions}
+    />
+  );
+  expect(wrapper.find('[data-test="analyze-new-project"]').exists()).toBe(false);
+});
+
 it('should display correct links for SonarCloud', () => {
   (isSonarCloud as jest.Mock<any>).mockReturnValueOnce(true);
   const context = {};
index abb6a2f122c7145aa756f299a17863cd22e00a36..6cce2b6fce97757226dccdbecc283ad60c1b0006 100644 (file)
@@ -188,14 +188,6 @@ exports[`should display suggestion links 1`] = `
       </Link>
     </li>
     <React.Fragment>
-      <li>
-        <a
-          href="#"
-          onClick={[Function]}
-        >
-          embed_docs.analyze_new_project
-        </a>
-      </li>
       <li
         className="divider"
       />
index 741521d83963e837d1077ae210c68731298e96e0..e02ced80d7e6450598bbad636fdf6093959727e7 100644 (file)
@@ -100,6 +100,7 @@ export interface CoveredFile {
 
 export interface CurrentUser {
   isLoggedIn: boolean;
+  permissions?: { global: string[] };
   showOnboardingTutorial?: boolean;
 }
 
@@ -204,6 +205,13 @@ export function isLoggedIn(user: CurrentUser): user is LoggedInUser {
   return user.isLoggedIn;
 }
 
+export function hasGlobalPermission(user: CurrentUser, permission: string): boolean {
+  if (!user.permissions) {
+    return false;
+  }
+  return user.permissions.global.includes(permission);
+}
+
 export function isSameHomePage(a: HomePage, b: HomePage) {
   return (
     a.type === b.type &&