summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.ts')
-rw-r--r--polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.ts484
1 files changed, 484 insertions, 0 deletions
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.ts b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.ts
new file mode 100644
index 0000000000..b77a9ef0b3
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.ts
@@ -0,0 +1,484 @@
+/**
+ * @license
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import '../../../test/common-test-setup-karma';
+import './gr-permission';
+import {GrPermission} from './gr-permission';
+import {query, stubRestApi} from '../../../test/test-utils';
+import {GitRef, GroupId, GroupName} from '../../../types/common';
+import {PermissionAction} from '../../../constants/constants';
+import * as MockInteractions from '@polymer/iron-test-helpers/mock-interactions';
+import {
+ AutocompleteCommitEventDetail,
+ GrAutocomplete,
+} from '../../shared/gr-autocomplete/gr-autocomplete';
+import {queryAndAssert} from '../../../test/test-utils';
+import {GrRuleEditor} from '../gr-rule-editor/gr-rule-editor';
+import {GrButton} from '../../shared/gr-button/gr-button';
+
+const basicFixture = fixtureFromElement('gr-permission');
+
+suite('gr-permission tests', () => {
+ let element: GrPermission;
+
+ setup(() => {
+ element = basicFixture.instantiate();
+ stubRestApi('getSuggestedGroups').returns(
+ Promise.resolve({
+ Administrators: {
+ id: '4c97682e6ce61b7247f3381b6f1789356666de7f' as GroupId,
+ },
+ 'Anonymous Users': {
+ id: 'global%3AAnonymous-Users' as GroupId,
+ },
+ })
+ );
+ });
+
+ suite('unit tests', () => {
+ test('sortPermission', async () => {
+ const permission = {
+ id: 'submit' as GitRef,
+ value: {
+ rules: {
+ 'global:Project-Owners': {
+ action: PermissionAction.ALLOW,
+ force: false,
+ },
+ '4c97682e6ce6b7247f3381b6f1789356666de7f': {
+ action: PermissionAction.ALLOW,
+ force: false,
+ },
+ },
+ },
+ };
+
+ const expectedRules = [
+ {
+ id: '4c97682e6ce6b7247f3381b6f1789356666de7f' as GitRef,
+ value: {action: PermissionAction.ALLOW, force: false},
+ },
+ {
+ id: 'global:Project-Owners' as GitRef,
+ value: {action: PermissionAction.ALLOW, force: false},
+ },
+ ];
+
+ element.sortPermission(permission);
+ await element.updateComplete;
+ assert.deepEqual(element.rules, expectedRules);
+ });
+
+ test('computeLabel and computeLabelValues', async () => {
+ const labels = {
+ 'Code-Review': {
+ default_value: 0,
+ values: {
+ ' 0': 'No score',
+ '-1': 'I would prefer this is not submitted as is',
+ '-2': 'This shall not be submitted',
+ '+1': 'Looks good to me, but someone else must approve',
+ '+2': 'Looks good to me, approved',
+ },
+ },
+ };
+ let permission = {
+ id: 'label-Code-Review' as GitRef,
+ value: {
+ label: 'Code-Review',
+ rules: {
+ 'global:Project-Owners': {
+ action: PermissionAction.ALLOW,
+ force: false,
+ min: -2,
+ max: 2,
+ },
+ '4c97682e6ce6b7247f3381b6f1789356666de7f': {
+ action: PermissionAction.ALLOW,
+ force: false,
+ min: -2,
+ max: 2,
+ },
+ },
+ },
+ };
+
+ const expectedLabelValues = [
+ {value: -2, text: 'This shall not be submitted'},
+ {value: -1, text: 'I would prefer this is not submitted as is'},
+ {value: 0, text: 'No score'},
+ {value: 1, text: 'Looks good to me, but someone else must approve'},
+ {value: 2, text: 'Looks good to me, approved'},
+ ];
+
+ const expectedLabel = {
+ name: 'Code-Review',
+ values: expectedLabelValues,
+ };
+
+ element.permission = permission;
+ element.labels = labels;
+ await element.updateComplete;
+
+ assert.deepEqual(
+ element.computeLabelValues(labels['Code-Review'].values),
+ expectedLabelValues
+ );
+
+ assert.deepEqual(element.computeLabel(), expectedLabel);
+
+ permission = {
+ id: 'label-reviewDB' as GitRef,
+ value: {
+ label: 'reviewDB',
+ rules: {
+ 'global:Project-Owners': {
+ action: PermissionAction.ALLOW,
+ force: false,
+ min: 0,
+ max: 0,
+ },
+ '4c97682e6ce6b7247f3381b6f1789356666de7f': {
+ action: PermissionAction.ALLOW,
+ force: false,
+ min: 0,
+ max: 0,
+ },
+ },
+ },
+ };
+
+ element.permission = permission;
+ await element.updateComplete;
+
+ assert.isNotOk(element.computeLabel());
+ });
+
+ test('computeSectionClass', async () => {
+ let deleted = true;
+ let editing = false;
+ assert.equal(element.computeSectionClass(editing, deleted), 'deleted');
+
+ deleted = false;
+ assert.equal(element.computeSectionClass(editing, deleted), '');
+
+ editing = true;
+ assert.equal(element.computeSectionClass(editing, deleted), 'editing');
+
+ deleted = true;
+ assert.equal(
+ element.computeSectionClass(editing, deleted),
+ 'editing deleted'
+ );
+ });
+
+ test('computeGroupName', async () => {
+ const groups = {
+ abc123: {id: '1' as GroupId, name: 'test group' as GroupName},
+ bcd234: {id: '1' as GroupId},
+ };
+ assert.equal(
+ element.computeGroupName(groups, 'abc123' as GitRef),
+ 'test group' as GroupName
+ );
+ assert.equal(
+ element.computeGroupName(groups, 'bcd234' as GitRef),
+ 'bcd234' as GroupName
+ );
+ });
+
+ test('computeGroupsWithRules', async () => {
+ const rules = [
+ {
+ id: '4c97682e6ce6b7247f3381b6f1789356666de7f' as GitRef,
+ value: {action: PermissionAction.ALLOW, force: false},
+ },
+ {
+ id: 'global:Project-Owners' as GitRef,
+ value: {action: PermissionAction.ALLOW, force: false},
+ },
+ ];
+ const groupsWithRules = {
+ '4c97682e6ce6b7247f3381b6f1789356666de7f': true,
+ 'global:Project-Owners': true,
+ };
+ assert.deepEqual(element.computeGroupsWithRules(rules), groupsWithRules);
+ });
+
+ test('getGroupSuggestions without existing rules', async () => {
+ element.groupsWithRules = {};
+ await element.updateComplete;
+
+ const groups = await element.getGroupSuggestions();
+ assert.deepEqual(groups, [
+ {
+ name: 'Administrators',
+ value: '4c97682e6ce61b7247f3381b6f1789356666de7f',
+ },
+ {
+ name: 'Anonymous Users',
+ value: 'global%3AAnonymous-Users',
+ },
+ ]);
+ });
+
+ test('getGroupSuggestions with existing rules filters them', async () => {
+ element.groupsWithRules = {
+ '4c97682e6ce61b7247f3381b6f1789356666de7f': true,
+ };
+ await element.updateComplete;
+
+ const groups = await element.getGroupSuggestions();
+ assert.deepEqual(groups, [
+ {
+ name: 'Anonymous Users',
+ value: 'global%3AAnonymous-Users',
+ },
+ ]);
+ });
+
+ test('handleRemovePermission', async () => {
+ element.editing = true;
+ element.permission = {id: 'test' as GitRef, value: {rules: {}}};
+ element.handleRemovePermission();
+ await element.updateComplete;
+
+ assert.isTrue(element.deleted);
+ assert.isTrue(element.permission.value.deleted);
+
+ element.editing = false;
+ await element.updateComplete;
+ assert.isFalse(element.deleted);
+ assert.isNotOk(element.permission.value.deleted);
+ });
+
+ test('handleUndoRemove', async () => {
+ element.permission = {
+ id: 'test' as GitRef,
+ value: {deleted: true, rules: {}},
+ };
+ element.handleUndoRemove();
+ await element.updateComplete;
+
+ assert.isFalse(element.deleted);
+ assert.isNotOk(element.permission.value.deleted);
+ });
+
+ test('computeHasRange', async () => {
+ assert.isTrue(element.computeHasRange('Query Limit'));
+
+ assert.isTrue(element.computeHasRange('Batch Changes Limit'));
+
+ assert.isFalse(element.computeHasRange('test'));
+ });
+ });
+
+ suite('interactions', () => {
+ setup(async () => {
+ sinon.spy(element, 'computeLabel');
+ element.name = 'Priority';
+ element.section = 'refs/*' as GitRef;
+ element.labels = {
+ 'Code-Review': {
+ values: {
+ ' 0': 'No score',
+ '-1': 'I would prefer this is not submitted as is',
+ '-2': 'This shall not be submitted',
+ '+1': 'Looks good to me, but someone else must approve',
+ '+2': 'Looks good to me, approved',
+ },
+ default_value: 0,
+ },
+ };
+ element.permission = {
+ id: 'label-Code-Review' as GitRef,
+ value: {
+ label: 'Code-Review',
+ rules: {
+ 'global:Project-Owners': {
+ action: PermissionAction.ALLOW,
+ force: false,
+ min: -2,
+ max: 2,
+ },
+ '4c97682e6ce6b7247f3381b6f1789356666de7f': {
+ action: PermissionAction.ALLOW,
+ force: false,
+ min: -2,
+ max: 2,
+ },
+ },
+ },
+ };
+ element.setupValues();
+ await element.updateComplete;
+ flush();
+ });
+
+ test('adding a rule', async () => {
+ element.name = 'Priority';
+ element.section = 'refs/*' as GitRef;
+ element.groups = {};
+ await element.updateComplete;
+
+ queryAndAssert<GrAutocomplete>(element, '#groupAutocomplete').text =
+ 'ldap/tests te.st';
+ const e = {
+ detail: {
+ value: 'ldap:CN=test+te.st',
+ },
+ } as CustomEvent<AutocompleteCommitEventDetail>;
+ element.editing = true;
+ assert.equal(element.rules!.length, 2);
+ assert.equal(Object.keys(element.groupsWithRules!).length, 2);
+ await element.handleAddRuleItem(e);
+ assert.deepEqual(element.groups, {
+ 'ldap:CN=test te.st': {
+ name: 'ldap/tests te.st',
+ },
+ });
+ assert.equal(element.rules!.length, 3);
+ assert.equal(Object.keys(element.groupsWithRules!).length, 3);
+ assert.deepEqual(element.permission!.value.rules['ldap:CN=test te.st'], {
+ action: PermissionAction.ALLOW,
+ min: -2,
+ max: 2,
+ added: true,
+ });
+ assert.equal(
+ queryAndAssert<GrAutocomplete>(element, '#groupAutocomplete').text,
+ ''
+ );
+ // New rule should be removed if cancel from editing.
+ element.editing = false;
+ await element.updateComplete;
+ assert.equal(element.rules!.length, 2);
+ assert.equal(Object.keys(element.permission!.value.rules).length, 2);
+ });
+
+ test('removing an added rule', async () => {
+ element.name = 'Priority';
+ element.section = 'refs/*' as GitRef;
+ element.groups = {};
+ await element.updateComplete;
+ queryAndAssert<GrAutocomplete>(element, '#groupAutocomplete').text =
+ 'new group name';
+ assert.equal(element.rules!.length, 2);
+ queryAndAssert<GrRuleEditor>(element, 'gr-rule-editor').dispatchEvent(
+ new CustomEvent('added-rule-removed', {
+ composed: true,
+ bubbles: true,
+ })
+ );
+ await flush();
+ assert.equal(element.rules!.length, 1);
+ });
+
+ test('removing an added permission', async () => {
+ const removeStub = sinon.stub();
+ element.addEventListener('added-permission-removed', removeStub);
+ element.editing = true;
+ element.name = 'Priority';
+ element.section = 'refs/*' as GitRef;
+ element.permission!.value.added = true;
+ await element.updateComplete;
+ MockInteractions.tap(queryAndAssert<GrButton>(element, '#removeBtn'));
+ await element.updateComplete;
+ assert.isTrue(removeStub.called);
+ });
+
+ test('removing the permission', async () => {
+ element.editing = true;
+ element.name = 'Priority';
+ element.section = 'refs/*' as GitRef;
+ await element.updateComplete;
+
+ const removeStub = sinon.stub();
+ element.addEventListener('added-permission-removed', removeStub);
+
+ assert.isFalse(
+ queryAndAssert(element, '#permission').classList.contains('deleted')
+ );
+ assert.isFalse(element.deleted);
+ MockInteractions.tap(queryAndAssert<GrButton>(element, '#removeBtn'));
+ await element.updateComplete;
+ assert.isTrue(
+ queryAndAssert(element, '#permission').classList.contains('deleted')
+ );
+ assert.isTrue(element.deleted);
+ MockInteractions.tap(queryAndAssert<GrButton>(element, '#undoRemoveBtn'));
+ await element.updateComplete;
+ assert.isFalse(
+ queryAndAssert(element, '#permission').classList.contains('deleted')
+ );
+ assert.isFalse(element.deleted);
+ assert.isFalse(removeStub.called);
+ });
+
+ test('modify a permission', async () => {
+ element.editing = true;
+ element.name = 'Priority';
+ element.section = 'refs/*' as GitRef;
+ await element.updateComplete;
+
+ assert.isFalse(element.originalExclusiveValue);
+ assert.isNotOk(element.permission!.value.modified);
+ MockInteractions.tap(queryAndAssert(element, '#exclusiveToggle'));
+ await element.updateComplete;
+ assert.isTrue(element.permission!.value.exclusive);
+ assert.isTrue(element.permission!.value.modified);
+ assert.isFalse(element.originalExclusiveValue);
+ element.editing = false;
+ await element.updateComplete;
+ assert.isFalse(element.permission!.value.exclusive);
+ });
+
+ test('modifying emits access-modified event', async () => {
+ const modifiedHandler = sinon.stub();
+ element.editing = true;
+ element.name = 'Priority';
+ element.section = 'refs/*' as GitRef;
+ element.permission = {id: '0' as GitRef, value: {rules: {}}};
+ element.addEventListener('access-modified', modifiedHandler);
+ await element.updateComplete;
+ assert.isNotOk(element.permission.value.modified);
+ MockInteractions.tap(queryAndAssert(element, '#exclusiveToggle'));
+ await element.updateComplete;
+ assert.isTrue(element.permission.value.modified);
+ assert.isTrue(modifiedHandler.called);
+ });
+
+ test('Exclusive hidden for owner permission', async () => {
+ queryAndAssert(element, '#exclusiveToggle');
+
+ element.permission!.id = 'owner' as GitRef;
+ element.requestUpdate();
+ await element.updateComplete;
+
+ assert.notOk(query(element, '#exclusiveToggle'));
+ });
+
+ test('Exclusive hidden for any global permissions', async () => {
+ queryAndAssert(element, '#exclusiveToggle');
+
+ element.section = 'GLOBAL_CAPABILITIES' as GitRef;
+ await element.updateComplete;
+
+ assert.notOk(query(element, '#exclusiveToggle'));
+ });
+ });
+});