From 1436afa8b444d0dc4bc3395ad7cdb443851ea215 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Tue, 14 Apr 2015 17:21:56 +0200 Subject: [PATCH] SONAR-5851 use user's permissions to display available actions --- .../quality-profiles-actions.hbs | 37 ++++++---- .../quality-profiles-profile-details.hbs | 16 +++-- .../quality-profiles-profile-header.hbs | 14 ++-- .../main/js/quality-profiles/actions-view.js | 6 ++ .../src/main/js/quality-profiles/app.js | 13 +++- .../main/js/quality-profiles/controller.js | 10 ++- .../quality-profiles/profile-details-view.js | 5 +- .../quality-profiles/profile-header-view.js | 3 +- .../sonar-web/src/test/js/quality-profiles.js | 70 ++++++++++++++++++- .../json/quality-profiles/user-admin.json | 15 ++++ .../src/test/json/quality-profiles/user.json | 9 +++ 11 files changed, 163 insertions(+), 35 deletions(-) create mode 100644 server/sonar-web/src/test/json/quality-profiles/user-admin.json create mode 100644 server/sonar-web/src/test/json/quality-profiles/user.json diff --git a/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-actions.hbs b/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-actions.hbs index d78c76b513a..b173c8ee77f 100644 --- a/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-actions.hbs +++ b/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-actions.hbs @@ -1,19 +1,26 @@

{{t 'quality_profiles.page'}}

+
- + {{#if canWrite}} + + {{else}} +
+ +
+ {{/if}}
diff --git a/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-details.hbs b/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-details.hbs index 502448d9f7a..c40678d064d 100644 --- a/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-details.hbs +++ b/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-details.hbs @@ -37,7 +37,11 @@

{{t 'projects'}}

{{#if isDefault}} -

{{t 'quality_profiles.projects_for_default.edit'}}

+ {{#if canWrite}} +

{{t 'quality_profiles.projects_for_default.edit'}}

+ {{else}} +

{{t 'quality_profiles.projects_for_default'}}

+ {{/if}} {{else}}
{{/if}} @@ -53,11 +57,13 @@
{{#notEmpty ancestors}} diff --git a/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-header.hbs b/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-header.hbs index 00ba0b100de..141004e9fdb 100644 --- a/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-header.hbs +++ b/server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-header.hbs @@ -7,11 +7,13 @@
{{t 'backup_verb'}} - - - {{#unless isDefault}} - - - {{/unless}} + {{#if canWrite}} + + + {{#unless isDefault}} + + + {{/unless}} + {{/if}}
diff --git a/server/sonar-web/src/main/js/quality-profiles/actions-view.js b/server/sonar-web/src/main/js/quality-profiles/actions-view.js index 67f4caceba9..4d0653c3f57 100644 --- a/server/sonar-web/src/main/js/quality-profiles/actions-view.js +++ b/server/sonar-web/src/main/js/quality-profiles/actions-view.js @@ -79,6 +79,12 @@ define([ requestLanguages: function () { var url = baseUrl + '/api/languages/list'; return $.get(url); + }, + + serializeData: function () { + return _.extend(Marionette.ItemView.prototype.serializeData.apply(this, arguments), { + canWrite: this.options.canWrite + }); } }); diff --git a/server/sonar-web/src/main/js/quality-profiles/app.js b/server/sonar-web/src/main/js/quality-profiles/app.js index b3e2a269ea6..d139f2b17b5 100644 --- a/server/sonar-web/src/main/js/quality-profiles/app.js +++ b/server/sonar-web/src/main/js/quality-profiles/app.js @@ -43,13 +43,15 @@ require([ // Actions View this.actionsView = new ActionsView({ - collection: this.profiles + collection: this.profiles, + canWrite: this.canWrite }); this.layout.actionsRegion.show(this.actionsView); // Profiles View this.profilesView = new ProfilesView({ - collection: this.profiles + collection: this.profiles, + canWrite: this.canWrite }); this.layout.resultsRegion.show(this.profilesView); @@ -62,7 +64,12 @@ require([ }); - window.requestMessages().done(function () { + + var requestUser = $.get(baseUrl + '/api/users/current').done(function (r) { + App.canWrite = r.permissions.global.indexOf('profileadmin') !== -1; + }); + + $.when(window.requestMessages(), requestUser).done(function () { App.start(); }); diff --git a/server/sonar-web/src/main/js/quality-profiles/controller.js b/server/sonar-web/src/main/js/quality-profiles/controller.js index 8219fa96e13..906503b17c0 100644 --- a/server/sonar-web/src/main/js/quality-profiles/controller.js +++ b/server/sonar-web/src/main/js/quality-profiles/controller.js @@ -67,10 +67,16 @@ define([ } this.options.app.profilesView.highlight(key); this.fetchProfile(profile).done(function () { - var profileHeaderView = new ProfileHeaderView({ model: profile }); + var profileHeaderView = new ProfileHeaderView({ + model: profile, + canWrite: that.options.app.canWrite + }); that.options.app.layout.headerRegion.show(profileHeaderView); - var profileDetailsView = new ProfileDetailsView({ model: profile }); + var profileDetailsView = new ProfileDetailsView({ + model: profile, + canWrite: that.options.app.canWrite + }); that.options.app.layout.detailsRegion.show(profileDetailsView); }); }, diff --git a/server/sonar-web/src/main/js/quality-profiles/profile-details-view.js b/server/sonar-web/src/main/js/quality-profiles/profile-details-view.js index 8c26922ad85..87a13beb80e 100644 --- a/server/sonar-web/src/main/js/quality-profiles/profile-details-view.js +++ b/server/sonar-web/src/main/js/quality-profiles/profile-details-view.js @@ -55,7 +55,7 @@ define([ new window.SelectList({ el: this.$('#quality-profile-projects-list'), width: '100%', - readOnly: false, + readOnly: !this.options.canWrite, focusSearch: false, format: function (item) { return item.name; @@ -105,7 +105,8 @@ define([ var key = this.model.get('key'), rulesSearchUrl = '/coding_rules#qprofile=' + encodeURIComponent(key) + '|activation=true'; return _.extend(Marionette.ItemView.prototype.serializeData.apply(this, arguments), { - rulesSearchUrl: rulesSearchUrl + rulesSearchUrl: rulesSearchUrl, + canWrite: this.options.canWrite }); } }); diff --git a/server/sonar-web/src/main/js/quality-profiles/profile-header-view.js b/server/sonar-web/src/main/js/quality-profiles/profile-header-view.js index 0ea480936b8..7b55bfa3d2e 100644 --- a/server/sonar-web/src/main/js/quality-profiles/profile-header-view.js +++ b/server/sonar-web/src/main/js/quality-profiles/profile-header-view.js @@ -84,7 +84,8 @@ define([ serializeData: function () { var key = this.model.get('key'); return _.extend(Marionette.ItemView.prototype.serializeData.apply(this, arguments), { - encodedKey: encodeURIComponent(key) + encodedKey: encodeURIComponent(key), + canWrite: this.options.canWrite }); } }); diff --git a/server/sonar-web/src/test/js/quality-profiles.js b/server/sonar-web/src/test/js/quality-profiles.js index c63fe829f43..60062524a22 100644 --- a/server/sonar-web/src/test/js/quality-profiles.js +++ b/server/sonar-web/src/test/js/quality-profiles.js @@ -32,6 +32,7 @@ casper.test.begin(testName('Should Show List'), 9, function (test) { .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user.json'); lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); }) @@ -69,11 +70,65 @@ casper.test.begin(testName('Should Show List'), 9, function (test) { }); -casper.test.begin(testName('Should Show Details'), 9, function (test) { +casper.test.begin(testName('Should Show Details'), 10, function (test) { casper .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user.json'); + lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); + lib.mockRequestFromFile('/api/rules/search', 'rules.json', + { data: { qprofile: 'java-sonar-way-67887', activation: 'true' }}); + lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json', { + data: { profileKey: 'java-sonar-way-67887' } + }); + }) + + .then(function () { + casper.evaluate(function () { + require(['/js/quality-profiles/app.js']); + }); + }) + + .then(function () { + casper.waitForSelector('.js-list .list-group-item'); + }) + + .then(function () { + casper.click('.js-list .list-group-item[data-key="java-sonar-way-67887"]'); + casper.waitForSelector('.search-navigator-header-component'); + }) + + .then(function () { + test.assertElementCount('.js-list .list-group-item.active', 1); + test.assertSelectorContains('.js-list .list-group-item.active', 'Sonar way'); + + test.assertSelectorContains('.search-navigator-workspace-header', 'Sonar way'); + test.assertSelectorContains('.search-navigator-workspace-header', 'Java'); + test.assertExists('#quality-profile-backup'); + test.assertDoesntExist('#quality-profile-rename'); + test.assertDoesntExist('#quality-profile-copy'); + test.assertDoesntExist('#quality-profile-delete'); + test.assertDoesntExist('#quality-profile-set-as-default'); + test.assertDoesntExist('#quality-profile-change-parent'); + }) + + .then(function () { + lib.sendCoverage(); + }) + + .run(function () { + test.done(); + }); +}); + + +casper.test.begin(testName('Should Show Details', 'Admin'), 10, function (test) { + casper + .start(lib.buildUrl('profiles'), function () { + lib.setDefaultViewport(); + + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json', { data: { qprofile: 'java-sonar-way-67887', activation: 'true' }}); @@ -108,6 +163,7 @@ casper.test.begin(testName('Should Show Details'), 9, function (test) { test.assertExists('#quality-profile-copy'); test.assertDoesntExist('#quality-profile-delete'); test.assertDoesntExist('#quality-profile-set-as-default'); + test.assertExists('#quality-profile-change-parent'); }) .then(function () { @@ -125,6 +181,7 @@ casper.test.begin(testName('Should Show Inheritance Details'), 10, function (tes .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-inheritance.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance-plus.json', { @@ -177,6 +234,7 @@ casper.test.begin(testName('Should Show Selected Projects'), 2, function (test) .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/projects?key=php-psr-2-46772', 'projects.json'); @@ -222,6 +280,7 @@ casper.test.begin(testName('Copy Profile'), 5, function (test) { .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); @@ -282,6 +341,7 @@ casper.test.begin(testName('Rename Profile'), 2, function (test) { .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); @@ -342,6 +402,7 @@ casper.test.begin(testName('Make Profile Default'), 4, function (test) { .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); @@ -396,6 +457,7 @@ casper.test.begin(testName('Delete Profile'), 2, function (test) { .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-with-copy.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); @@ -453,6 +515,7 @@ casper.test.begin(testName('Create Profile'), 2, function (test) { .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); @@ -510,6 +573,7 @@ casper.test.begin(testName('Restore Built-in Profiles'), 2, function (test) { .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-modified.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); @@ -566,6 +630,7 @@ casper.test.begin(testName('Change Parent'), 1, function (test) { .start(lib.buildUrl('profiles'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-change-parent.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); this.inheritanceMock = lib.mockRequestFromFile('/api/qualityprofiles/inheritance', @@ -628,6 +693,7 @@ casper.test.begin(testName('Permalink'), 9, function (test) { .start(lib.buildUrl('profiles#show?key=java-sonar-way-67887'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user-admin.json'); lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); @@ -671,6 +737,7 @@ casper.test.begin(testName('Changelog'), 21, function (test) { .start(lib.buildUrl('profiles#show?key=java-sonar-way-67887'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user.json'); lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); @@ -746,6 +813,7 @@ casper.test.begin(testName('Changelog Permalink'), 2, function (test) { .start(lib.buildUrl('profiles#changelog?since=2015-03-25&key=java-sonar-way-67887&to=2015-03-26'), function () { lib.setDefaultViewport(); + lib.mockRequestFromFile('/api/users/current', 'user.json'); lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json'); lib.mockRequestFromFile('/api/rules/search', 'rules.json'); lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json'); diff --git a/server/sonar-web/src/test/json/quality-profiles/user-admin.json b/server/sonar-web/src/test/json/quality-profiles/user-admin.json new file mode 100644 index 00000000000..d0d8417406f --- /dev/null +++ b/server/sonar-web/src/test/json/quality-profiles/user-admin.json @@ -0,0 +1,15 @@ +{ + "isLoggedIn": true, + "login": "admin", + "name": "Administrator", + "permissions": { + "global": [ + "provisioning", + "dryRunScan", + "shareDashboard", + "scan", + "profileadmin", + "admin" + ] + } +} diff --git a/server/sonar-web/src/test/json/quality-profiles/user.json b/server/sonar-web/src/test/json/quality-profiles/user.json new file mode 100644 index 00000000000..3d5f7c3fa20 --- /dev/null +++ b/server/sonar-web/src/test/json/quality-profiles/user.json @@ -0,0 +1,9 @@ +{ + "isLoggedIn": false, + "permissions": { + "global": [ + "scan", + "dryRunScan" + ] + } +} -- 2.39.5