blob: 1f1bef3c616ec24890b7dcbf40c679d333131052 [file] [log] [blame]
/**
* @license
* Copyright 2015 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../../test/common-test-setup';
import './gr-reviewer-list';
import {mockPromise, queryAndAssert} from '../../../test/test-utils';
import {GrReviewerList} from './gr-reviewer-list';
import {
createAccountDetailWithId,
createChange,
} from '../../../test/test-data-generators';
import {GrButton} from '../../shared/gr-button/gr-button';
import {AccountId, EmailAddress} from '../../../types/common';
import './gr-reviewer-list';
import {fixture, html, assert} from '@open-wc/testing';
suite('gr-reviewer-list tests', () => {
let element: GrReviewerList;
setup(async () => {
element = await fixture(html`<gr-reviewer-list></gr-reviewer-list>`);
});
test('render', () => {
assert.shadowDom.equal(
element,
/* HTML */ `
<div class="container">
<div>
<div class="controlsContainer" hidden="">
<gr-button
aria-disabled="false"
class="addReviewer"
id="addReviewer"
link=""
role="button"
tabindex="0"
title="Add reviewer"
>
<div>
<gr-icon icon="edit" filled small></gr-icon>
</div>
</gr-button>
</div>
</div>
<gr-button
aria-disabled="false"
class="hiddenReviewers"
hidden=""
link=""
role="button"
tabindex="0"
>
and 0 more
</gr-button>
</div>
`
);
});
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);
});
});