blob: c6b1d5f00b76865106b2c12ae3ff0447cd6f0869 [file] [log] [blame]
/**
* @license
* 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.
*/
import '../../../test/common-test-setup-karma';
import './gr-reviewer-list';
import {mockPromise, queryAndAssert} from '../../../test/test-utils';
import {GrReviewerList} from './gr-reviewer-list';
import {
createAccountDetailWithId,
createChange,
createDetailedLabelInfo,
} from '../../../test/test-data-generators';
import {GrButton} from '../../shared/gr-button/gr-button';
import {AccountId, EmailAddress} from '../../../types/common';
import './gr-reviewer-list';
const basicFixture = fixtureFromElement('gr-reviewer-list');
suite('gr-reviewer-list tests', () => {
let element: GrReviewerList;
setup(async () => {
element = basicFixture.instantiate();
await element.updateComplete;
});
test('controls hidden on immutable element', async () => {
element.mutable = false;
await element.updateComplete;
assert.isTrue(
queryAndAssert(element, '.controlsContainer').hasAttribute('hidden')
);
element.mutable = true;
await element.updateComplete;
assert.isFalse(
queryAndAssert(element, '.controlsContainer').hasAttribute('hidden')
);
});
test('add reviewer button opens reply dialog', async () => {
const dialogShown = mockPromise();
element.addEventListener('show-reply-dialog', () => {
dialogShown.resolve();
});
queryAndAssert<GrButton>(element, '.addReviewer').click();
await dialogShown;
});
test('tracking reviewers and ccs', async () => {
let counter = 0;
function makeAccount() {
return {_account_id: counter++ as AccountId};
}
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 = {
...createChange(),
owner,
reviewers,
};
await element.updateComplete;
assert.deepEqual(element.reviewers, [reviewer, cc]);
element.reviewersOnly = true;
element.change = {
...createChange(),
owner,
reviewers,
};
await element.updateComplete;
assert.deepEqual(element.reviewers, [reviewer]);
element.ccsOnly = true;
element.reviewersOnly = false;
element.change = {
...createChange(),
owner,
reviewers,
};
await element.updateComplete;
assert.deepEqual(element.reviewers, [cc]);
});
test('handleAddTap passes mode with event', () => {
const fireStub = sinon.stub(element, 'dispatchEvent');
const e = {...new Event(''), preventDefault() {}};
element.ccsOnly = false;
element.reviewersOnly = false;
element.handleAddTap(e);
assert.equal(fireStub.lastCall.args[0].type, 'show-reply-dialog');
assert.deepEqual((fireStub.lastCall.args[0] as CustomEvent).detail, {
value: {
reviewersOnly: false,
ccsOnly: false,
},
});
element.reviewersOnly = true;
element.handleAddTap(e);
assert.equal(fireStub.lastCall.args[0].type, 'show-reply-dialog');
assert.deepEqual((fireStub.lastCall.args[0] as CustomEvent).detail, {
value: {reviewersOnly: true, ccsOnly: false},
});
element.ccsOnly = true;
element.reviewersOnly = false;
element.handleAddTap(e);
assert.equal(fireStub.lastCall.args[0].type, 'show-reply-dialog');
assert.deepEqual((fireStub.lastCall.args[0] as CustomEvent).detail, {
value: {ccsOnly: true, reviewersOnly: false},
});
});
test('dont show all reviewers button with 4 reviewers', async () => {
const reviewers = [];
for (let i = 0; i < 4; i++) {
reviewers.push({
...createAccountDetailWithId(i),
email: `${i}reviewer@google.com` as EmailAddress,
name: `reviewer${i}`,
});
}
element.ccsOnly = true;
element.change = {
...createChange(),
owner: {
...createAccountDetailWithId(111),
},
reviewers: {
CC: reviewers,
},
};
await element.updateComplete;
assert.equal(element.hiddenReviewerCount, 0);
assert.equal(element.displayedReviewers.length, 4);
assert.equal(element.reviewers.length, 4);
assert.isTrue(queryAndAssert<GrButton>(element, '.hiddenReviewers').hidden);
});
test('account owner comes first in list of reviewers', async () => {
const reviewers = [];
for (let i = 0; i < 4; i++) {
reviewers.push({
...createAccountDetailWithId(i),
email: `${i}reviewer@google.com` as EmailAddress,
name: `reviewer${i}`,
});
}
element.reviewersOnly = true;
element.account = {
...createAccountDetailWithId(1),
};
element.change = {
...createChange(),
owner: {
...createAccountDetailWithId(11),
},
reviewers: {
REVIEWER: reviewers,
},
};
await element.updateComplete;
assert.equal(element.displayedReviewers[0]._account_id, 1 as AccountId);
});
test('show all reviewers button with 9 reviewers', async () => {
const reviewers = [];
for (let i = 0; i < 9; i++) {
reviewers.push({
...createAccountDetailWithId(i),
email: `${i}reviewer@google.com` as EmailAddress,
name: `reviewer${i}`,
});
}
element.ccsOnly = true;
element.change = {
...createChange(),
owner: {
...createAccountDetailWithId(111),
},
reviewers: {
CC: reviewers,
},
};
await element.updateComplete;
assert.equal(element.hiddenReviewerCount, 3);
assert.equal(element.displayedReviewers.length, 6);
assert.equal(element.reviewers.length, 9);
assert.isFalse(
queryAndAssert<GrButton>(element, '.hiddenReviewers').hidden
);
});
test('show all reviewers button', async () => {
const reviewers = [];
for (let i = 0; i < 100; i++) {
reviewers.push({
...createAccountDetailWithId(i),
email: `${i}reviewer@google.com` as EmailAddress,
name: `reviewer${i}`,
});
}
element.ccsOnly = true;
element.change = {
...createChange(),
owner: {
...createAccountDetailWithId(111),
},
reviewers: {
CC: reviewers,
},
};
await element.updateComplete;
assert.equal(element.hiddenReviewerCount, 94);
assert.equal(element.displayedReviewers.length, 6);
assert.equal(element.reviewers.length, 100);
assert.isFalse(
queryAndAssert<GrButton>(element, '.hiddenReviewers').hidden
);
queryAndAssert<GrButton>(element, '.hiddenReviewers').click();
await element.updateComplete;
assert.equal(element.hiddenReviewerCount, 0);
assert.equal(element.displayedReviewers.length, 100);
assert.equal(element.reviewers.length, 100);
assert.isTrue(queryAndAssert<GrButton>(element, '.hiddenReviewers').hidden);
});
test('votable labels', async () => {
element.change = {
...createChange(),
labels: {
Foo: {
...createDetailedLabelInfo(),
all: [
{
_account_id: 7 as AccountId,
permitted_voting_range: {max: 2, min: 0},
},
],
},
Bar: {
...createDetailedLabelInfo(),
all: [
{
...createAccountDetailWithId(1),
permitted_voting_range: {max: 1, min: 0},
},
{
_account_id: 7 as AccountId,
permitted_voting_range: {max: 1, min: 0},
},
],
},
FooBar: {
...createDetailedLabelInfo(),
all: [{_account_id: 7 as AccountId, value: 0}],
},
},
permitted_labels: {
Foo: ['-1', ' 0', '+1', '+2'],
FooBar: ['-1', ' 0'],
},
};
await element.updateComplete;
assert.strictEqual(
element.computeVoteableText({...createAccountDetailWithId(1)}),
'Bar: +1'
);
assert.strictEqual(
element.computeVoteableText({...createAccountDetailWithId(7)}),
'Foo: +2, Bar: +1, FooBar: 0'
);
assert.strictEqual(
element.computeVoteableText({...createAccountDetailWithId(2)}),
''
);
});
test('fails gracefully when all is not included', async () => {
element.change = {
...createChange(),
labels: {Foo: {}},
permitted_labels: {
Foo: ['-1', ' 0', '+1', '+2'],
},
};
await element.updateComplete;
assert.strictEqual(
element.computeVoteableText({...createAccountDetailWithId(1)}),
''
);
});
});