|  | <!DOCTYPE html> | 
|  | <!-- | 
|  | @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. | 
|  | --> | 
|  |  | 
|  | <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> | 
|  | <title>gr-permission</title> | 
|  | <script src="/test/common-test-setup.js"></script> | 
|  | <script src="/bower_components/webcomponentsjs/custom-elements-es5-adapter.js"></script> | 
|  |  | 
|  | <script src="/bower_components/page/page.js"></script> | 
|  | <script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script> | 
|  | <script src="/bower_components/web-component-tester/browser.js"></script> | 
|  | <link rel="import" href="../../../test/common-test-setup.html"/> | 
|  | <link rel="import" href="gr-permission.html"> | 
|  |  | 
|  | <script>void(0);</script> | 
|  |  | 
|  | <test-fixture id="basic"> | 
|  | <template> | 
|  | <gr-permission></gr-permission> | 
|  | </template> | 
|  | </test-fixture> | 
|  |  | 
|  | <script> | 
|  | suite('gr-permission tests', () => { | 
|  | let element; | 
|  | let sandbox; | 
|  |  | 
|  | setup(() => { | 
|  | sandbox = sinon.sandbox.create(); | 
|  | element = fixture('basic'); | 
|  | sandbox.stub(element.$.restAPI, 'getSuggestedGroups').returns( | 
|  | Promise.resolve({ | 
|  | 'Administrators': { | 
|  | id: '4c97682e6ce61b7247f3381b6f1789356666de7f', | 
|  | }, | 
|  | 'Anonymous Users': { | 
|  | id: 'global%3AAnonymous-Users', | 
|  | }, | 
|  | })); | 
|  | }); | 
|  |  | 
|  | teardown(() => { | 
|  | sandbox.restore(); | 
|  | }); | 
|  |  | 
|  | suite('unit tests', () => { | 
|  | test('_sortPermission', () => { | 
|  | const permission = { | 
|  | id: 'submit', | 
|  | value: { | 
|  | rules: { | 
|  | 'global:Project-Owners': { | 
|  | action: 'ALLOW', | 
|  | force: false, | 
|  | }, | 
|  | '4c97682e6ce6b7247f3381b6f1789356666de7f': { | 
|  | action: 'ALLOW', | 
|  | force: false, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | }; | 
|  |  | 
|  | const expectedRules = [ | 
|  | { | 
|  | id: '4c97682e6ce6b7247f3381b6f1789356666de7f', | 
|  | value: {action: 'ALLOW', force: false}, | 
|  | }, | 
|  | { | 
|  | id: 'global:Project-Owners', | 
|  | value: {action: 'ALLOW', force: false}, | 
|  | }, | 
|  | ]; | 
|  |  | 
|  | element._sortPermission(permission); | 
|  | assert.deepEqual(element._rules, expectedRules); | 
|  | }); | 
|  |  | 
|  | test('_computeLabel and _computeLabelValues', () => { | 
|  | const labels = { | 
|  | 'Code-Review': { | 
|  | default_value: 0, | 
|  | values: { | 
|  | ' 0': 'No score', | 
|  | '-1': 'I would prefer this is not merged as is', | 
|  | '-2': 'This shall not be merged', | 
|  | '+1': 'Looks good to me, but someone else must approve', | 
|  | '+2': 'Looks good to me, approved', | 
|  | }, | 
|  | }, | 
|  | }; | 
|  | let permission = { | 
|  | id: 'label-Code-Review', | 
|  | value: { | 
|  | label: 'Code-Review', | 
|  | rules: { | 
|  | 'global:Project-Owners': { | 
|  | action: 'ALLOW', | 
|  | force: false, | 
|  | min: -2, | 
|  | max: 2, | 
|  | }, | 
|  | '4c97682e6ce6b7247f3381b6f1789356666de7f': { | 
|  | action: 'ALLOW', | 
|  | force: false, | 
|  | min: -2, | 
|  | max: 2, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | }; | 
|  |  | 
|  | const expectedLabelValues = [ | 
|  | {value: -2, text: 'This shall not be merged'}, | 
|  | {value: -1, text: 'I would prefer this is not merged 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, | 
|  | }; | 
|  |  | 
|  | assert.deepEqual(element._computeLabelValues( | 
|  | labels['Code-Review'].values), expectedLabelValues); | 
|  |  | 
|  | assert.deepEqual(element._computeLabel(permission, labels), | 
|  | expectedLabel); | 
|  |  | 
|  | permission = { | 
|  | id: 'label-reviewDB', | 
|  | value: { | 
|  | label: 'reviewDB', | 
|  | rules: { | 
|  | 'global:Project-Owners': { | 
|  | action: 'ALLOW', | 
|  | force: false, | 
|  | }, | 
|  | '4c97682e6ce6b7247f3381b6f1789356666de7f': { | 
|  | action: 'ALLOW', | 
|  | force: false, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | }; | 
|  |  | 
|  | assert.isNotOk(element._computeLabel(permission, labels)); | 
|  | }); | 
|  |  | 
|  | test('_computeSectionClass', () => { | 
|  | 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', () => { | 
|  | const groups = { | 
|  | abc123: {name: 'test group'}, | 
|  | bcd234: {}, | 
|  | }; | 
|  | assert.equal(element._computeGroupName(groups, 'abc123'), 'test group'); | 
|  | assert.equal(element._computeGroupName(groups, 'bcd234'), 'bcd234'); | 
|  | }); | 
|  |  | 
|  | test('_computeGroupsWithRules', () => { | 
|  | const rules = [ | 
|  | { | 
|  | id: '4c97682e6ce6b7247f3381b6f1789356666de7f', | 
|  | value: {action: 'ALLOW', force: false}, | 
|  | }, | 
|  | { | 
|  | id: 'global:Project-Owners', | 
|  | value: {action: 'ALLOW', force: false}, | 
|  | }, | 
|  | ]; | 
|  | const groupsWithRules = { | 
|  | '4c97682e6ce6b7247f3381b6f1789356666de7f': true, | 
|  | 'global:Project-Owners': true, | 
|  | }; | 
|  | assert.deepEqual(element._computeGroupsWithRules(rules), | 
|  | groupsWithRules); | 
|  | }); | 
|  |  | 
|  | test('_getGroupSuggestions without existing rules', done => { | 
|  | element._groupsWithRules = {}; | 
|  |  | 
|  | element._getGroupSuggestions().then(groups => { | 
|  | assert.deepEqual(groups, [ | 
|  | { | 
|  | name: 'Administrators', | 
|  | value: {id: '4c97682e6ce61b7247f3381b6f1789356666de7f'}, | 
|  | }, { | 
|  | name: 'Anonymous Users', | 
|  | value: {id: 'global%3AAnonymous-Users'}, | 
|  | }, | 
|  | ]); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('_getGroupSuggestions with existing rules filters them', done => { | 
|  | element._groupsWithRules = { | 
|  | '4c97682e6ce61b7247f3381b6f1789356666de7f': true, | 
|  | }; | 
|  |  | 
|  | element._getGroupSuggestions().then(groups => { | 
|  | assert.deepEqual(groups, [{ | 
|  | name: 'Anonymous Users', | 
|  | value: {id: 'global%3AAnonymous-Users'}, | 
|  | }]); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('_handleRemovePermission', () => { | 
|  | element.editing = true; | 
|  | element.permission = {value: {rules: {}}}; | 
|  | element._handleRemovePermission(); | 
|  | assert.isTrue(element._deleted); | 
|  | assert.isTrue(element.permission.value.deleted); | 
|  |  | 
|  | element.editing = false; | 
|  | assert.isFalse(element._deleted); | 
|  | assert.isNotOk(element.permission.value.deleted); | 
|  | }); | 
|  |  | 
|  | test('_handleUndoRemove', () => { | 
|  | element.permission = {value: {deleted: true, rules: {}}}; | 
|  | element._handleUndoRemove(); | 
|  | assert.isFalse(element._deleted); | 
|  | assert.isNotOk(element.permission.value.deleted); | 
|  | }); | 
|  |  | 
|  | test('_computeHasRange', () => { | 
|  | assert.isTrue(element._computeHasRange('Query Limit')); | 
|  |  | 
|  | assert.isTrue(element._computeHasRange('Batch Changes Limit')); | 
|  |  | 
|  | assert.isFalse(element._computeHasRange('test')); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | suite('interactions', () => { | 
|  | setup(() => { | 
|  | sandbox.spy(element, '_computeLabel'); | 
|  | element.name = 'Priority'; | 
|  | element.section = 'refs/*'; | 
|  | element.labels = { | 
|  | 'Code-Review': { | 
|  | values: { | 
|  | ' 0': 'No score', | 
|  | '-1': 'I would prefer this is not merged as is', | 
|  | '-2': 'This shall not be merged', | 
|  | '+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', | 
|  | value: { | 
|  | label: 'Code-Review', | 
|  | rules: { | 
|  | 'global:Project-Owners': { | 
|  | action: 'ALLOW', | 
|  | force: false, | 
|  | min: -2, | 
|  | max: 2, | 
|  | }, | 
|  | '4c97682e6ce6b7247f3381b6f1789356666de7f': { | 
|  | action: 'ALLOW', | 
|  | force: false, | 
|  | min: -2, | 
|  | max: 2, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | }; | 
|  | element._setupValues(); | 
|  | flushAsynchronousOperations(); | 
|  | }); | 
|  |  | 
|  | test('adding a rule', () => { | 
|  | element.name = 'Priority'; | 
|  | element.section = 'refs/*'; | 
|  | element.groups = {}; | 
|  | element.$.groupAutocomplete.text = 'ldap/tests tests'; | 
|  | const e = { | 
|  | detail: { | 
|  | value: { | 
|  | id: 'ldap:CN=test+test', | 
|  | }, | 
|  | }, | 
|  | }; | 
|  | element.editing = true; | 
|  | assert.equal(element._rules.length, 2); | 
|  | assert.equal(Object.keys(element._groupsWithRules).length, 2); | 
|  | element._handleAddRuleItem(e); | 
|  | flushAsynchronousOperations(); | 
|  | assert.deepEqual(element.groups, {'ldap:CN=test test': { | 
|  | name: 'ldap/tests tests'}}); | 
|  | assert.equal(element._rules.length, 3); | 
|  | assert.equal(Object.keys(element._groupsWithRules).length, 3); | 
|  | assert.deepEqual(element.permission.value.rules['ldap:CN=test test'], | 
|  | {action: 'ALLOW', min: -2, max: 2, added: true}); | 
|  | // New rule should be removed if cancel from editing. | 
|  | element.editing = false; | 
|  | assert.equal(element._rules.length, 2); | 
|  | assert.equal(Object.keys(element.permission.value.rules).length, 2); | 
|  | }); | 
|  |  | 
|  | test('removing an added rule', () => { | 
|  | element.name = 'Priority'; | 
|  | element.section = 'refs/*'; | 
|  | element.groups = {}; | 
|  | element.$.groupAutocomplete.text = 'new group name'; | 
|  | assert.equal(element._rules.length, 2); | 
|  | element.$$('gr-rule-editor').fire('added-rule-removed'); | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(element._rules.length, 1); | 
|  | }); | 
|  |  | 
|  | test('removing an added permission', () => { | 
|  | const removeStub = sandbox.stub(); | 
|  | element.addEventListener('added-permission-removed', removeStub); | 
|  | element.editing = true; | 
|  | element.name = 'Priority'; | 
|  | element.section = 'refs/*'; | 
|  | element.permission.value.added = true; | 
|  | MockInteractions.tap(element.$.removeBtn); | 
|  | assert.isTrue(removeStub.called); | 
|  | }); | 
|  |  | 
|  | test('removing the permission', () => { | 
|  | element.editing = true; | 
|  | element.name = 'Priority'; | 
|  | element.section = 'refs/*'; | 
|  |  | 
|  | const removeStub = sandbox.stub(); | 
|  | element.addEventListener('added-permission-removed', removeStub); | 
|  |  | 
|  | assert.isFalse(element.$.permission.classList.contains('deleted')); | 
|  | assert.isFalse(element._deleted); | 
|  | MockInteractions.tap(element.$.removeBtn); | 
|  | assert.isTrue(element.$.permission.classList.contains('deleted')); | 
|  | assert.isTrue(element._deleted); | 
|  | MockInteractions.tap(element.$.undoRemoveBtn); | 
|  | assert.isFalse(element.$.permission.classList.contains('deleted')); | 
|  | assert.isFalse(element._deleted); | 
|  | assert.isFalse(removeStub.called); | 
|  | }); | 
|  |  | 
|  | test('modify a permission', () => { | 
|  | element.editing = true; | 
|  | element.name = 'Priority'; | 
|  | element.section = 'refs/*'; | 
|  |  | 
|  | assert.isFalse(element._originalExclusiveValue); | 
|  | assert.isNotOk(element.permission.value.modified); | 
|  | MockInteractions.tap(element.$$('#exclusiveToggle')); | 
|  | flushAsynchronousOperations(); | 
|  | assert.isTrue(element.permission.value.exclusive); | 
|  | assert.isTrue(element.permission.value.modified); | 
|  | assert.isFalse(element._originalExclusiveValue); | 
|  | element.editing = false; | 
|  | assert.isFalse(element.permission.value.exclusive); | 
|  | }); | 
|  |  | 
|  | test('_handleValueChange', () => { | 
|  | const modifiedHandler = sandbox.stub(); | 
|  | element.permission = {value: {rules: {}}}; | 
|  | element.addEventListener('access-modified', modifiedHandler); | 
|  | assert.isNotOk(element.permission.value.modified); | 
|  | element._handleValueChange(); | 
|  | assert.isTrue(element.permission.value.modified); | 
|  | assert.isTrue(modifiedHandler.called); | 
|  | }); | 
|  |  | 
|  | test('Exclusive hidden for owner permission', () => { | 
|  | assert.equal(getComputedStyle(element.$$('#exclusiveToggle')).display, | 
|  | 'flex'); | 
|  | element.set(['permission', 'id'], 'owner'); | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(getComputedStyle(element.$$('#exclusiveToggle')).display, | 
|  | 'none'); | 
|  | }); | 
|  |  | 
|  | test('Exclusive hidden for any global permissions', () => { | 
|  | assert.equal(getComputedStyle(element.$$('#exclusiveToggle')).display, | 
|  | 'flex'); | 
|  | element.section = 'GLOBAL_CAPABILITIES'; | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(getComputedStyle(element.$$('#exclusiveToggle')).display, | 
|  | 'none'); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | </script> |