| /** |
| * @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.js'; |
| import './gr-group-members.js'; |
| import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; |
| import {stubBaseUrl} from '../../../test/test-utils.js'; |
| |
| const basicFixture = fixtureFromElement('gr-group-members'); |
| |
| suite('gr-group-members tests', () => { |
| let element; |
| |
| let groups; |
| let groupMembers; |
| let includedGroups; |
| let groupStub; |
| |
| setup(() => { |
| groups = { |
| name: 'Administrators', |
| owner: 'Administrators', |
| group_id: 1, |
| }; |
| |
| groupMembers = [ |
| { |
| _account_id: 1000097, |
| name: 'Jane Roe', |
| email: 'jane.roe@example.com', |
| username: 'jane', |
| }, |
| { |
| _account_id: 1000096, |
| name: 'Test User', |
| email: 'john.doe@example.com', |
| }, |
| { |
| _account_id: 1000095, |
| name: 'Gerrit', |
| }, |
| { |
| _account_id: 1000098, |
| }, |
| ]; |
| |
| includedGroups = [{ |
| url: 'https://group/url', |
| options: {}, |
| id: 'testId', |
| name: 'testName', |
| }, |
| { |
| url: '/group/url', |
| options: {}, |
| id: 'testId2', |
| name: 'testName2', |
| }, |
| { |
| url: '#/group/url', |
| options: {}, |
| id: 'testId3', |
| name: 'testName3', |
| }, |
| ]; |
| |
| stub('gr-rest-api-interface', { |
| getSuggestedAccounts(input) { |
| if (input.startsWith('test')) { |
| return Promise.resolve([ |
| { |
| _account_id: 1000096, |
| name: 'test-account', |
| email: 'test.account@example.com', |
| username: 'test123', |
| }, |
| { |
| _account_id: 1001439, |
| name: 'test-admin', |
| email: 'test.admin@example.com', |
| username: 'test_admin', |
| }, |
| { |
| _account_id: 1001439, |
| name: 'test-git', |
| username: 'test_git', |
| }, |
| ]); |
| } else { |
| return Promise.resolve({}); |
| } |
| }, |
| getSuggestedGroups(input) { |
| if (input.startsWith('test')) { |
| return Promise.resolve({ |
| 'test-admin': { |
| id: '1ce023d3fb4e4260776fb92cd08b52bbd21ce70a', |
| }, |
| 'test/Administrator (admin)': { |
| id: 'test%3Aadmin', |
| }, |
| }); |
| } else { |
| return Promise.resolve({}); |
| } |
| }, |
| getLoggedIn() { return Promise.resolve(true); }, |
| getConfig() { |
| return Promise.resolve(); |
| }, |
| getGroupMembers() { |
| return Promise.resolve(groupMembers); |
| }, |
| getIsGroupOwner() { |
| return Promise.resolve(true); |
| }, |
| getIncludedGroup() { |
| return Promise.resolve(includedGroups); |
| }, |
| getAccountCapabilities() { |
| return Promise.resolve(); |
| }, |
| }); |
| element = basicFixture.instantiate(); |
| stubBaseUrl('https://test/site'); |
| element.groupId = 1; |
| groupStub = sinon.stub( |
| element.$.restAPI, |
| 'getGroupConfig') |
| .callsFake(() => Promise.resolve(groups)); |
| return element._loadGroupDetails(); |
| }); |
| |
| test('_includedGroups', () => { |
| assert.equal(element._includedGroups.length, 3); |
| assert.equal(dom(element.root) |
| .querySelectorAll('.nameColumn a')[0].href, includedGroups[0].url); |
| assert.equal(dom(element.root) |
| .querySelectorAll('.nameColumn a')[1].href, |
| 'https://test/site/group/url'); |
| assert.equal(dom(element.root) |
| .querySelectorAll('.nameColumn a')[2].href, |
| 'https://test/site/group/url'); |
| }); |
| |
| test('save members correctly', () => { |
| element._groupOwner = true; |
| |
| const memberName = 'test-admin'; |
| |
| const saveStub = sinon.stub(element.$.restAPI, 'saveGroupMember') |
| .callsFake(() => Promise.resolve({})); |
| |
| const button = element.$.saveGroupMember; |
| |
| assert.isTrue(button.hasAttribute('disabled')); |
| |
| element.$.groupMemberSearchInput.text = memberName; |
| element.$.groupMemberSearchInput.value = 1234; |
| |
| assert.isFalse(button.hasAttribute('disabled')); |
| |
| return element._handleSavingGroupMember().then(() => { |
| assert.isTrue(button.hasAttribute('disabled')); |
| assert.isFalse(element.$.Title.classList.contains('edited')); |
| assert.isTrue(saveStub.lastCall.calledWithExactly('Administrators', |
| 1234)); |
| }); |
| }); |
| |
| test('save included groups correctly', () => { |
| element._groupOwner = true; |
| |
| const includedGroupName = 'testName'; |
| |
| const saveIncludedGroupStub = sinon.stub( |
| element.$.restAPI, 'saveIncludedGroup') |
| .callsFake(() => Promise.resolve({})); |
| |
| const button = element.$.saveIncludedGroups; |
| |
| assert.isTrue(button.hasAttribute('disabled')); |
| |
| element.$.includedGroupSearchInput.text = includedGroupName; |
| element.$.includedGroupSearchInput.value = 'testId'; |
| |
| assert.isFalse(button.hasAttribute('disabled')); |
| |
| return element._handleSavingIncludedGroups().then(() => { |
| assert.isTrue(button.hasAttribute('disabled')); |
| assert.isFalse(element.$.Title.classList.contains('edited')); |
| assert.equal(saveIncludedGroupStub.lastCall.args[0], 'Administrators'); |
| assert.equal(saveIncludedGroupStub.lastCall.args[1], 'testId'); |
| }); |
| }); |
| |
| test('add included group 404 shows helpful error text', () => { |
| element._groupOwner = true; |
| |
| const memberName = 'bad-name'; |
| const alertStub = sinon.stub(); |
| element.addEventListener('show-alert', alertStub); |
| const errorResponse = { |
| status: 404, |
| ok: false, |
| }; |
| sinon.stub(element.$.restAPI._restApiHelper, 'fetch').callsFake( |
| () => Promise.resolve(errorResponse)); |
| |
| element.$.groupMemberSearchInput.text = memberName; |
| element.$.groupMemberSearchInput.value = 1234; |
| |
| return element._handleSavingIncludedGroups().then(() => { |
| assert.isTrue(alertStub.called); |
| }); |
| }); |
| |
| test('add included group network-error throws an exception', async () => { |
| element._groupOwner = true; |
| |
| const memberName = 'bad-name'; |
| const alertStub = sinon.stub(); |
| element.addEventListener('show-alert', alertStub); |
| const err = new Error(); |
| sinon.stub(element.$.restAPI._restApiHelper, 'fetch').callsFake( |
| () => Promise.reject(err)); |
| |
| element.$.groupMemberSearchInput.text = memberName; |
| element.$.groupMemberSearchInput.value = 1234; |
| |
| let exceptionThrown = false; |
| try { |
| await element._handleSavingIncludedGroups(); |
| } catch (e) { |
| exceptionThrown = true; |
| } |
| assert.isTrue(exceptionThrown); |
| }); |
| |
| test('_getAccountSuggestions empty', done => { |
| element |
| ._getAccountSuggestions('nonexistent').then(accounts => { |
| assert.equal(accounts.length, 0); |
| done(); |
| }); |
| }); |
| |
| test('_getAccountSuggestions non-empty', done => { |
| element |
| ._getAccountSuggestions('test-').then(accounts => { |
| assert.equal(accounts.length, 3); |
| assert.equal(accounts[0].name, |
| 'test-account <test.account@example.com>'); |
| assert.equal(accounts[1].name, 'test-admin <test.admin@example.com>'); |
| assert.equal(accounts[2].name, 'test-git'); |
| done(); |
| }); |
| }); |
| |
| test('_getGroupSuggestions empty', done => { |
| element |
| ._getGroupSuggestions('nonexistent').then(groups => { |
| assert.equal(groups.length, 0); |
| done(); |
| }); |
| }); |
| |
| test('_getGroupSuggestions non-empty', done => { |
| element |
| ._getGroupSuggestions('test').then(groups => { |
| assert.equal(groups.length, 2); |
| assert.equal(groups[0].name, 'test-admin'); |
| assert.equal(groups[1].name, 'test/Administrator (admin)'); |
| done(); |
| }); |
| }); |
| |
| test('_computeHideItemClass returns string for admin', () => { |
| const admin = true; |
| const owner = false; |
| assert.equal(element._computeHideItemClass(owner, admin), ''); |
| }); |
| |
| test('_computeHideItemClass returns hideItem for admin and owner', () => { |
| const admin = false; |
| const owner = false; |
| assert.equal(element._computeHideItemClass(owner, admin), 'canModify'); |
| }); |
| |
| test('_computeHideItemClass returns string for owner', () => { |
| const admin = false; |
| const owner = true; |
| assert.equal(element._computeHideItemClass(owner, admin), ''); |
| }); |
| |
| test('delete member', () => { |
| const deleteBtns = dom(element.root) |
| .querySelectorAll('.deleteMembersButton'); |
| MockInteractions.tap(deleteBtns[0]); |
| assert.equal(element._itemId, '1000097'); |
| assert.equal(element._itemName, 'jane'); |
| MockInteractions.tap(deleteBtns[1]); |
| assert.equal(element._itemId, '1000096'); |
| assert.equal(element._itemName, 'Test User'); |
| MockInteractions.tap(deleteBtns[2]); |
| assert.equal(element._itemId, '1000095'); |
| assert.equal(element._itemName, 'Gerrit'); |
| MockInteractions.tap(deleteBtns[3]); |
| assert.equal(element._itemId, '1000098'); |
| assert.equal(element._itemName, '1000098'); |
| }); |
| |
| test('delete included groups', () => { |
| const deleteBtns = dom(element.root) |
| .querySelectorAll('.deleteIncludedGroupButton'); |
| MockInteractions.tap(deleteBtns[0]); |
| assert.equal(element._itemId, 'testId'); |
| assert.equal(element._itemName, 'testName'); |
| MockInteractions.tap(deleteBtns[1]); |
| assert.equal(element._itemId, 'testId2'); |
| assert.equal(element._itemName, 'testName2'); |
| MockInteractions.tap(deleteBtns[2]); |
| assert.equal(element._itemId, 'testId3'); |
| assert.equal(element._itemName, 'testName3'); |
| }); |
| |
| test('_computeLoadingClass', () => { |
| assert.equal(element._computeLoadingClass(true), 'loading'); |
| |
| assert.equal(element._computeLoadingClass(false), ''); |
| }); |
| |
| test('_computeGroupUrl', () => { |
| assert.isUndefined(element._computeGroupUrl(undefined)); |
| |
| assert.isUndefined(element._computeGroupUrl(false)); |
| |
| let url = '#/admin/groups/uuid-529b3c2605bb1029c8146f9de4a91c776fe64498'; |
| assert.equal(element._computeGroupUrl(url), |
| 'https://test/site/admin/groups/' + |
| 'uuid-529b3c2605bb1029c8146f9de4a91c776fe64498'); |
| |
| url = 'https://gerrit.local/admin/groups/' + |
| 'uuid-529b3c2605bb1029c8146f9de4a91c776fe64498'; |
| assert.equal(element._computeGroupUrl(url), url); |
| }); |
| |
| test('fires page-error', done => { |
| groupStub.restore(); |
| |
| element.groupId = 1; |
| |
| const response = {status: 404}; |
| sinon.stub( |
| element.$.restAPI, 'getGroupConfig') |
| .callsFake((group, errFn) => { |
| errFn(response); |
| }); |
| element.addEventListener('page-error', e => { |
| assert.deepEqual(e.detail.response, response); |
| done(); |
| }); |
| |
| element._loadGroupDetails(); |
| }); |
| }); |
| |