|  | <!DOCTYPE html> | 
|  | <!-- | 
|  | Copyright (C) 2015 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-reviewer-list</title> | 
|  |  | 
|  | <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-reviewer-list.html"> | 
|  |  | 
|  | <script>void(0);</script> | 
|  |  | 
|  | <test-fixture id="basic"> | 
|  | <template> | 
|  | <gr-reviewer-list></gr-reviewer-list> | 
|  | </template> | 
|  | </test-fixture> | 
|  |  | 
|  | <script> | 
|  | suite('gr-reviewer-list tests', () => { | 
|  | let element; | 
|  | let sandbox; | 
|  |  | 
|  | setup(() => { | 
|  | element = fixture('basic'); | 
|  | sandbox = sinon.sandbox.create(); | 
|  | stub('gr-rest-api-interface', { | 
|  | getConfig() { return Promise.resolve({}); }, | 
|  | removeChangeReviewer() { | 
|  | return Promise.resolve({ok: true}); | 
|  | }, | 
|  | }); | 
|  | }); | 
|  |  | 
|  | teardown(() => { | 
|  | sandbox.restore(); | 
|  | }); | 
|  |  | 
|  | test('controls hidden on immutable element', () => { | 
|  | element.mutable = false; | 
|  | assert.isTrue(element.$$('.controlsContainer').hasAttribute('hidden')); | 
|  | element.mutable = true; | 
|  | assert.isFalse(element.$$('.controlsContainer').hasAttribute('hidden')); | 
|  | }); | 
|  |  | 
|  | test('add reviewer button opens reply dialog', done => { | 
|  | element.addEventListener('show-reply-dialog', () => { | 
|  | done(); | 
|  | }); | 
|  | MockInteractions.tap(element.$$('.addReviewer')); | 
|  | }); | 
|  |  | 
|  | test('only show remove for removable reviewers', () => { | 
|  | element.mutable = true; | 
|  | element.change = { | 
|  | owner: { | 
|  | _account_id: 1, | 
|  | }, | 
|  | reviewers: { | 
|  | REVIEWER: [ | 
|  | { | 
|  | _account_id: 2, | 
|  | name: 'Bojack Horseman', | 
|  | email: 'SecretariatRulez96@hotmail.com', | 
|  | }, | 
|  | { | 
|  | _account_id: 3, | 
|  | name: 'Pinky Penguin', | 
|  | }, | 
|  | ], | 
|  | CC: [ | 
|  | { | 
|  | _account_id: 4, | 
|  | name: 'Diane Nguyen', | 
|  | email: 'macarthurfellow2B@juno.com', | 
|  | }, | 
|  | { | 
|  | email: 'test@e.mail', | 
|  | }, | 
|  | ], | 
|  | }, | 
|  | removable_reviewers: [ | 
|  | { | 
|  | _account_id: 3, | 
|  | name: 'Pinky Penguin', | 
|  | }, | 
|  | { | 
|  | _account_id: 4, | 
|  | name: 'Diane Nguyen', | 
|  | email: 'macarthurfellow2B@juno.com', | 
|  | }, | 
|  | { | 
|  | email: 'test@e.mail', | 
|  | }, | 
|  | ], | 
|  | }; | 
|  | flushAsynchronousOperations(); | 
|  | const chips = | 
|  | Polymer.dom(element.root).querySelectorAll('gr-account-chip'); | 
|  | assert.equal(chips.length, 4); | 
|  |  | 
|  | for (const el of Array.from(chips)) { | 
|  | const accountID = el.account._account_id || el.account.email; | 
|  | assert.ok(accountID); | 
|  |  | 
|  | const buttonEl = el.$$('gr-button'); | 
|  | assert.isNotNull(buttonEl); | 
|  | if (accountID == 2) { | 
|  | assert.isTrue(buttonEl.hasAttribute('hidden')); | 
|  | } else { | 
|  | assert.isFalse(buttonEl.hasAttribute('hidden')); | 
|  | } | 
|  | } | 
|  | }); | 
|  |  | 
|  | test('tracking reviewers and ccs', () => { | 
|  | let counter = 0; | 
|  | function makeAccount() { | 
|  | return {_account_id: counter++}; | 
|  | } | 
|  |  | 
|  | const owner = makeAccount(); | 
|  | const reviewer = makeAccount(); | 
|  | const cc = makeAccount(); | 
|  | const reviewers = { | 
|  | REMOVED: [makeAccount()], | 
|  | REVIEWER: [owner, reviewer], | 
|  | CC: [owner, cc], | 
|  | }; | 
|  |  | 
|  | element.ccsOnly = false; | 
|  | element.reviewersOnly = false; | 
|  | element.change = { | 
|  | owner, | 
|  | reviewers, | 
|  | }; | 
|  | assert.deepEqual(element._reviewers, [reviewer, cc]); | 
|  |  | 
|  | element.reviewersOnly = true; | 
|  | element.change = { | 
|  | owner, | 
|  | reviewers, | 
|  | }; | 
|  | assert.deepEqual(element._reviewers, [reviewer]); | 
|  |  | 
|  | element.ccsOnly = true; | 
|  | element.reviewersOnly = false; | 
|  | element.change = { | 
|  | owner, | 
|  | reviewers, | 
|  | }; | 
|  | assert.deepEqual(element._reviewers, [cc]); | 
|  | }); | 
|  |  | 
|  | test('_handleAddTap passes mode with event', () => { | 
|  | const fireStub = sandbox.stub(element, 'fire'); | 
|  | const e = {preventDefault() {}}; | 
|  |  | 
|  | element.ccsOnly = false; | 
|  | element.reviewersOnly = false; | 
|  | element._handleAddTap(e); | 
|  | assert.isTrue(fireStub.calledWith('show-reply-dialog', {value: {}})); | 
|  |  | 
|  | element.reviewersOnly = true; | 
|  | element._handleAddTap(e); | 
|  | assert.isTrue(fireStub.lastCall.calledWith('show-reply-dialog', | 
|  | {value: {reviewersOnly: true}})); | 
|  |  | 
|  | element.ccsOnly = true; | 
|  | element.reviewersOnly = false; | 
|  | element._handleAddTap(e); | 
|  | assert.isTrue(fireStub.lastCall.calledWith('show-reply-dialog', | 
|  | {value: {ccsOnly: true}})); | 
|  | }); | 
|  |  | 
|  | test('no show all reviewers button with 6 reviewers', () => { | 
|  | const reviewers = []; | 
|  | element.maxReviewersDisplayed = 5; | 
|  | for (let i = 0; i < 6; i++) { | 
|  | reviewers.push( | 
|  | {email: i+'reviewer@google.com', name: 'reviewer-' + i}); | 
|  | } | 
|  | element.ccsOnly = true; | 
|  |  | 
|  | element.change = { | 
|  | owner: { | 
|  | _account_id: 1, | 
|  | }, | 
|  | reviewers: { | 
|  | CC: reviewers, | 
|  | }, | 
|  | }; | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(element._hiddenReviewerCount, 0); | 
|  | assert.equal(element._displayedReviewers.length, 6); | 
|  | assert.equal(element._reviewers.length, 6); | 
|  | assert.isTrue(element.$$('.hiddenReviewers').hidden); | 
|  | }); | 
|  |  | 
|  | test('show all reviewers button with 7 reviewers', () => { | 
|  | const reviewers = []; | 
|  | element.maxReviewersDisplayed = 5; | 
|  | for (let i = 0; i < 7; i++) { | 
|  | reviewers.push( | 
|  | {email: i+'reviewer@google.com', name: 'reviewer-' + i}); | 
|  | } | 
|  | element.ccsOnly = true; | 
|  |  | 
|  | element.change = { | 
|  | owner: { | 
|  | _account_id: 1, | 
|  | }, | 
|  | reviewers: { | 
|  | CC: reviewers, | 
|  | }, | 
|  | }; | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(element._hiddenReviewerCount, 2); | 
|  | assert.equal(element._displayedReviewers.length, 5); | 
|  | assert.equal(element._reviewers.length, 7); | 
|  | assert.isFalse(element.$$('.hiddenReviewers').hidden); | 
|  | }); | 
|  |  | 
|  |  | 
|  | test('no maxReviewersDisplayed', () => { | 
|  | const reviewers = []; | 
|  | for (let i = 0; i < 7; i++) { | 
|  | reviewers.push( | 
|  | {email: i+'reviewer@google.com', name: 'reviewer-' + i}); | 
|  | } | 
|  | element.ccsOnly = true; | 
|  |  | 
|  | element.change = { | 
|  | owner: { | 
|  | _account_id: 1, | 
|  | }, | 
|  | reviewers: { | 
|  | CC: reviewers, | 
|  | }, | 
|  | }; | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(element._hiddenReviewerCount, 0); | 
|  | assert.equal(element._displayedReviewers.length, 7); | 
|  | assert.equal(element._reviewers.length, 7); | 
|  | assert.isTrue(element.$$('.hiddenReviewers').hidden); | 
|  | }); | 
|  |  | 
|  | test('show all reviewers button', () => { | 
|  | const reviewers = []; | 
|  | element.maxReviewersDisplayed = 5; | 
|  | for (let i = 0; i < 100; i++) { | 
|  | reviewers.push( | 
|  | {email: i+'reviewer@google.com', name: 'reviewer-' + i}); | 
|  | } | 
|  | element.ccsOnly = true; | 
|  |  | 
|  | element.change = { | 
|  | owner: { | 
|  | _account_id: 1, | 
|  | }, | 
|  | reviewers: { | 
|  | CC: reviewers, | 
|  | }, | 
|  | }; | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(element._hiddenReviewerCount, 95); | 
|  | assert.equal(element._displayedReviewers.length, 5); | 
|  | assert.equal(element._reviewers.length, 100); | 
|  | assert.isFalse(element.$$('.hiddenReviewers').hidden); | 
|  |  | 
|  | MockInteractions.tap(element.$$('.hiddenReviewers')); | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(element._hiddenReviewerCount, 0); | 
|  | assert.equal(element._displayedReviewers.length, 100); | 
|  | assert.equal(element._reviewers.length, 100); | 
|  | assert.isTrue(element.$$('.hiddenReviewers').hidden); | 
|  | }); | 
|  | }); | 
|  | </script> |