summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
diff options
context:
space:
mode:
Diffstat (limited to 'polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html')
-rw-r--r--polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html466
1 files changed, 466 insertions, 0 deletions
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
new file mode 100644
index 0000000000..38c5d6739a
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
@@ -0,0 +1,466 @@
+<!DOCTYPE html>
+<!--
+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-access-section</title>
+
+<script src="../../../bower_components/page/page.js"></script>
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.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-access-section.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+ <template>
+ <gr-access-section></gr-access-section>
+ </template>
+</test-fixture>
+
+<script>
+ suite('gr-access-section tests', () => {
+ let element;
+ let sandbox;
+
+ setup(() => {
+ sandbox = sinon.sandbox.create();
+ element = fixture('basic');
+ });
+
+ teardown(() => {
+ sandbox.restore();
+ });
+
+ suite('unit tests', () => {
+ setup(() => {
+ element.section = {
+ id: 'refs/*',
+ value: {
+ permissions: {
+ read: {
+ rules: {},
+ },
+ },
+ },
+ };
+ element.capabilities = {
+ accessDatabase: {
+ id: 'accessDatabase',
+ name: 'Access Database',
+ },
+ administrateServer: {
+ id: 'administrateServer',
+ name: 'Administrate Server',
+ },
+ batchChangesLimit: {
+ id: 'batchChangesLimit',
+ name: 'Batch Changes Limit',
+ },
+ createAccount: {
+ id: 'createAccount',
+ name: 'Create Account',
+ },
+ };
+ 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._sectionChanged(element.section);
+ flushAsynchronousOperations();
+ });
+
+ test('_sectionChanged', () => {
+ // _sectionChanged was called in setup, so just make assertions.
+ const expectedPermissions = [
+ {
+ id: 'read',
+ value: {
+ rules: {},
+ },
+ },
+ ];
+ assert.deepEqual(element._permissions, expectedPermissions);
+ assert.equal(element._originalId, element.section.id);
+ });
+
+ test('_computeLabelOptions', () => {
+ const expectedLabelOptions = [
+ {
+ id: 'label-Code-Review',
+ value: {
+ name: 'Label Code-Review',
+ id: 'label-Code-Review',
+ },
+ },
+ {
+ id: 'labelAs-Code-Review',
+ value: {
+ name: 'Label Code-Review (On Behalf Of)',
+ id: 'labelAs-Code-Review',
+ },
+ },
+ ];
+
+ assert.deepEqual(element._computeLabelOptions(element.labels),
+ expectedLabelOptions);
+ });
+
+ test('_computePermissions', () => {
+ sandbox.stub(element, 'toSortedArray').returns(
+ [{
+ id: 'push',
+ value: {
+ rules: {},
+ },
+ },
+ {
+ id: 'read',
+ value: {
+ rules: {},
+ },
+ },
+ ]);
+
+ const expectedPermissions = [{
+ id: 'push',
+ value: {
+ rules: {},
+ },
+ },
+ ];
+ const labelOptions = [
+ {
+ id: 'label-Code-Review',
+ value: {
+ name: 'Label Code-Review',
+ id: 'label-Code-Review',
+ },
+ },
+ {
+ id: 'labelAs-Code-Review',
+ value: {
+ name: 'Label Code-Review (On Behalf Of)',
+ id: 'labelAs-Code-Review',
+ },
+ },
+ ];
+
+ // For global capabilities, just return the sorted array filtered by
+ // existing permissions.
+ let name = 'GLOBAL_CAPABILITIES';
+ assert.deepEqual(element._computePermissions(name, element.capabilities,
+ element.labels), expectedPermissions);
+
+ // Uses the capabilities array to come up with possible values.
+ assert.isTrue(element.toSortedArray.lastCall.
+ calledWithExactly(element.capabilities));
+
+
+ // For everything else, include possible label values before filtering.
+ name = 'refs/for/*';
+ assert.deepEqual(element._computePermissions(name, element.capabilities,
+ element.labels), labelOptions.concat(expectedPermissions));
+
+ // Uses permissionValues (defined in gr-access-behavior) to come up with
+ // possible values.
+ assert.isTrue(element.toSortedArray.lastCall.
+ calledWithExactly(element.permissionValues));
+ });
+
+ test('_computePermissionName', () => {
+ let name = 'GLOBAL_CAPABILITIES';
+ let permission = {
+ id: 'administrateServer',
+ value: {},
+ };
+ assert.equal(element._computePermissionName(name, permission,
+ element.permissionValues, element.capabilities),
+ element.capabilities[permission.id].name);
+
+ name = 'refs/for/*';
+ permission = {
+ id: 'abandon',
+ value: {},
+ };
+
+ assert.equal(element._computePermissionName(
+ name, permission, element.permissionValues, element.capabilities),
+ element.permissionValues[permission.id].name);
+
+ name = 'refs/for/*';
+ permission = {
+ id: 'label-Code-Review',
+ value: {
+ label: 'Code-Review',
+ },
+ };
+
+ assert.equal(element._computePermissionName(name, permission,
+ element.permissionValues, element.capabilities),
+ 'Label Code-Review');
+
+ permission = {
+ id: 'labelAs-Code-Review',
+ value: {
+ label: 'Code-Review',
+ },
+ };
+
+ assert.equal(element._computePermissionName(name, permission,
+ element.permissionValues, element.capabilities),
+ 'Label Code-Review(On Behalf Of)');
+ });
+
+ test('_computeSectionName', () => {
+ let name;
+ // When computing the section name for an undefined name, it means a
+ // new section is being added. In this case, it should defualt to
+ // 'refs/heads/*'.
+ element._editingRef = false;
+ assert.equal(element._computeSectionName(name),
+ 'Reference: refs/heads/*');
+ assert.isTrue(element._editingRef);
+ assert.equal(element.section.id, 'refs/heads/*');
+
+ // Reset editing to false.
+ element._editingRef = false;
+ name = 'GLOBAL_CAPABILITIES';
+ assert.equal(element._computeSectionName(name), 'Global Capabilities');
+ assert.isFalse(element._editingRef);
+
+ name = 'refs/for/*';
+ assert.equal(element._computeSectionName(name),
+ 'Reference: refs/for/*');
+ assert.isFalse(element._editingRef);
+ });
+
+ test('_handleEditReference', () => {
+ element._handleEditReference();
+ assert.isTrue(element._editingRef);
+ });
+
+ test('_undoReferenceEdit', () => {
+ element._originalId = 'refs/for/old';
+ element.section.id = 'refs/for/new';
+ element.editing = true;
+ element._undoReferenceEdit();
+ assert.isFalse(element._editingRef);
+ assert.equal(element.section.id, 'refs/for/old');
+ });
+
+ test('_computeSectionClass', () => {
+ let editingRef = false;
+ let editing = false;
+ let deleted = false;
+ assert.equal(element._computeSectionClass(editing, editingRef, deleted),
+ '');
+
+ editing = true;
+ assert.equal(element._computeSectionClass(editing, editingRef, deleted),
+ 'editing');
+
+ editingRef = true;
+ assert.equal(element._computeSectionClass(editing, editingRef, deleted),
+ 'editing editingRef');
+
+ deleted = true;
+ assert.equal(element._computeSectionClass(editing, editingRef, deleted),
+ 'editing editingRef deleted');
+
+ editingRef = false;
+ assert.equal(element._computeSectionClass(editing, editingRef, deleted),
+ 'editing deleted');
+ });
+
+ test('_computeEditBtnClass', () => {
+ let name = 'GLOBAL_CAPABILITIES';
+ assert.equal(element._computeEditBtnClass(name), 'global');
+ name = 'refs/for/*';
+ assert.equal(element._computeEditBtnClass(name), '');
+ });
+ });
+
+ suite('interactive tests', () => {
+ setup(() => {
+ 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,
+ },
+ };
+ });
+ suite('Global section', () => {
+ setup(() => {
+ element.section = {
+ id: 'GLOBAL_CAPABILITIES',
+ value: {
+ permissions: {
+ accessDatabase: {
+ rules: {},
+ },
+ },
+ },
+ };
+ element.capabilities = {
+ accessDatabase: {
+ id: 'accessDatabase',
+ name: 'Access Database',
+ },
+ administrateServer: {
+ id: 'administrateServer',
+ name: 'Administrate Server',
+ },
+ batchChangesLimit: {
+ id: 'batchChangesLimit',
+ name: 'Batch Changes Limit',
+ },
+ createAccount: {
+ id: 'createAccount',
+ name: 'Create Account',
+ },
+ };
+ element._sectionChanged(element.section);
+ flushAsynchronousOperations();
+ });
+
+ test('classes are assigned correctly', () => {
+ assert.isFalse(element.$.section.classList.contains('editing'));
+ assert.isFalse(element.$.section.classList.contains('deleted'));
+ assert.isTrue(element.$.editBtn.classList.contains('global'));
+ });
+ });
+
+ suite('Non-global section', () => {
+ setup(() => {
+ element.section = {
+ id: 'refs/*',
+ value: {
+ permissions: {
+ read: {
+ rules: {},
+ },
+ },
+ },
+ };
+ element.capabilities = {};
+ element._sectionChanged(element.section);
+ flushAsynchronousOperations();
+ });
+
+ test('classes are assigned correctly', () => {
+ assert.isFalse(element.$.section.classList.contains('editing'));
+ assert.isFalse(element.$.section.classList.contains('deleted'));
+ assert.isFalse(element.$.editBtn.classList.contains('global'));
+ });
+
+ test('add permission', () => {
+ element.$.permissionSelect.value = 'label-Code-Review';
+ assert.equal(element._permissions.length, 1);
+ assert.equal(Object.keys(element.section.value.permissions).length,
+ 1);
+ MockInteractions.tap(element.$.addBtn);
+ flushAsynchronousOperations();
+
+ // The permission is added to both the permissions array and also
+ // the section's permission object.
+ assert.equal(element._permissions.length, 2);
+ let permission = {
+ id: 'label-Code-Review',
+ value: {
+ label: 'Code-Review',
+ rules: {},
+ },
+ };
+ assert.equal(element._permissions.length, 2);
+ assert.deepEqual(element._permissions[1], permission);
+ assert.equal(Object.keys(element.section.value.permissions).length,
+ 2);
+ assert.deepEqual(
+ element.section.value.permissions['label-Code-Review'],
+ permission.value);
+
+
+ element.$.permissionSelect.value = 'abandon';
+ MockInteractions.tap(element.$.addBtn);
+ flushAsynchronousOperations();
+
+ permission = {
+ id: 'abandon',
+ value: {
+ rules: {},
+ },
+ };
+
+ assert.equal(element._permissions.length, 3);
+ assert.deepEqual(element._permissions[2], permission);
+ assert.equal(Object.keys(element.section.value.permissions).length,
+ 3);
+ assert.deepEqual(element.section.value.permissions['abandon'],
+ permission.value);
+ });
+
+ test('edit section reference', () => {
+ assert.isFalse(element.$.section.classList.contains('editing'));
+ element.editing = true;
+ assert.isTrue(element.$.section.classList.contains('editing'));
+ assert.isFalse(element._editingRef);
+ MockInteractions.tap(element.$.editBtn);
+ element.$.editRefInput.bindValue='new/ref';
+ flushAsynchronousOperations();
+ assert.equal(element.section.id, 'new/ref');
+ assert.isTrue(element._editingRef);
+ assert.isTrue(element.$.section.classList.contains('editingRef'));
+ MockInteractions.tap(element.$.undoEdit);
+ flushAsynchronousOperations();
+ assert.isFalse(element._editingRef);
+ assert.isFalse(element.$.section.classList.contains('editingRef'));
+ assert.equal(element.section.id, 'refs/*');
+ });
+
+ test('remove section', () => {
+ element.editing = true;
+ assert.isFalse(element._deleted);
+ MockInteractions.tap(element.$.deleteBtn);
+ flushAsynchronousOperations();
+ assert.isTrue(element._deleted);
+ assert.isTrue(element.$.section.classList.contains('deleted'));
+ assert.isTrue(element.section.value.deleted);
+
+ MockInteractions.tap(element.$.undoRemoveBtn);
+ flushAsynchronousOperations();
+ assert.isFalse(element._deleted);
+ assert.isNotOk(element.section.value.deleted);
+ });
+ });
+ });
+ });
+</script>