blob: fba4b26acf1fc5d75cd6f5f907fcbaf61db802bf [file] [log] [blame]
/**
* @license
* Copyright (C) 2019 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 '../../elements/shared/gr-rest-api-interface/gr-rest-api-interface.js';
import {GrDisplayNameUtils} from '../gr-display-name-utils/gr-display-name-utils.js';
import {GrReviewerSuggestionsProvider, SUGGESTIONS_PROVIDERS_USERS_TYPES} from './gr-reviewer-suggestions-provider.js';
import {html} from '@polymer/polymer/lib/utils/html-tag.js';
const basicFixture = fixtureFromTemplate(html`
<gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
`);
suite('GrReviewerSuggestionsProvider tests', () => {
let _nextAccountId = 0;
const makeAccount = function(opt_status) {
const accountId = ++_nextAccountId;
return {
_account_id: accountId,
name: 'name ' + accountId,
email: 'email ' + accountId,
status: opt_status,
};
};
let _nextAccountId2 = 0;
const makeAccount2 = function(opt_status) {
const accountId2 = ++_nextAccountId2;
return {
_account_id: accountId2,
name: 'name ' + accountId2,
status: opt_status,
};
};
let owner;
let existingReviewer1;
let existingReviewer2;
let suggestion1;
let suggestion2;
let suggestion3;
let restAPI;
let provider;
let redundantSuggestion1;
let redundantSuggestion2;
let redundantSuggestion3;
let change;
setup(done => {
owner = makeAccount();
existingReviewer1 = makeAccount();
existingReviewer2 = makeAccount();
suggestion1 = {account: makeAccount()};
suggestion2 = {account: makeAccount()};
suggestion3 = {
group: {
id: 'suggested group id',
name: 'suggested group',
},
};
stub('gr-rest-api-interface', {
getLoggedIn() { return Promise.resolve(true); },
getConfig() { return Promise.resolve({}); },
});
restAPI = basicFixture.instantiate();
change = {
_number: 42,
owner,
reviewers: {
CC: [existingReviewer1],
REVIEWER: [existingReviewer2],
},
};
return flush(done);
});
suite('allowAnyUser set to false', () => {
setup(done => {
provider = GrReviewerSuggestionsProvider.create(restAPI, change._number,
SUGGESTIONS_PROVIDERS_USERS_TYPES.REVIEWER);
provider.init().then(done);
});
suite('stubbed values for _getReviewerSuggestions', () => {
setup(() => {
stub('gr-rest-api-interface', {
getChangeSuggestedReviewers() {
redundantSuggestion1 = {account: existingReviewer1};
redundantSuggestion2 = {account: existingReviewer2};
redundantSuggestion3 = {account: owner};
return Promise.resolve([redundantSuggestion1, redundantSuggestion2,
redundantSuggestion3, suggestion1, suggestion2, suggestion3]);
},
});
});
test('makeSuggestionItem formats account or group accordingly', () => {
let account = makeAccount();
const account3 = makeAccount2();
let suggestion = provider.makeSuggestionItem({account});
assert.deepEqual(suggestion, {
name: account.name + ' <' + account.email + '>',
value: {account},
});
const group = {name: 'test'};
suggestion = provider.makeSuggestionItem({group});
assert.deepEqual(suggestion, {
name: group.name + ' (group)',
value: {group},
});
suggestion = provider.makeSuggestionItem(account);
assert.deepEqual(suggestion, {
name: account.name + ' <' + account.email + '>',
value: {account, count: 1},
});
suggestion = provider.makeSuggestionItem({account: {}});
assert.deepEqual(suggestion, {
name: 'Anonymous',
value: {account: {}},
});
provider._config = {
user: {
anonymous_coward_name: 'Anonymous Coward Name',
},
};
suggestion = provider.makeSuggestionItem({account: {}});
assert.deepEqual(suggestion, {
name: 'Anonymous Coward Name',
value: {account: {}},
});
account = makeAccount('OOO');
suggestion = provider.makeSuggestionItem({account});
assert.deepEqual(suggestion, {
name: account.name + ' <' + account.email + '> (OOO)',
value: {account},
});
suggestion = provider.makeSuggestionItem(account);
assert.deepEqual(suggestion, {
name: account.name + ' <' + account.email + '> (OOO)',
value: {account, count: 1},
});
sinon.stub(GrDisplayNameUtils, '_accountEmail').callsFake(
() => '');
suggestion = provider.makeSuggestionItem(account3);
assert.deepEqual(suggestion, {
name: account3.name,
value: {account: account3, count: 1},
});
});
test('getSuggestions', done => {
provider.getSuggestions()
.then(reviewers => {
// Default is no filtering.
assert.equal(reviewers.length, 6);
assert.deepEqual(reviewers,
[redundantSuggestion1, redundantSuggestion2,
redundantSuggestion3, suggestion1,
suggestion2, suggestion3]);
})
.then(done);
});
test('getSuggestions short circuits when logged out', () => {
// API call is already stubbed.
const xhrSpy = restAPI.getChangeSuggestedReviewers;
provider._loggedIn = false;
return provider.getSuggestions('').then(() => {
assert.isFalse(xhrSpy.called);
provider._loggedIn = true;
return provider.getSuggestions('').then(() => {
assert.isTrue(xhrSpy.called);
});
});
});
});
test('getChangeSuggestedReviewers is used', done => {
const suggestReviewerStub =
sinon.stub(restAPI, 'getChangeSuggestedReviewers')
.returns(Promise.resolve([]));
const suggestAccountStub =
sinon.stub(restAPI, 'getSuggestedAccounts')
.returns(Promise.resolve([]));
provider.getSuggestions('').then(() => {
assert.isTrue(suggestReviewerStub.calledOnce);
assert.isTrue(suggestReviewerStub.calledWith(42, ''));
assert.isFalse(suggestAccountStub.called);
done();
});
});
});
suite('allowAnyUser set to true', () => {
setup(done => {
provider = GrReviewerSuggestionsProvider.create(restAPI, change._number,
SUGGESTIONS_PROVIDERS_USERS_TYPES.ANY);
provider.init().then(done);
});
test('getSuggestedAccounts is used', done => {
const suggestReviewerStub =
sinon.stub(restAPI, 'getChangeSuggestedReviewers')
.returns(Promise.resolve([]));
const suggestAccountStub =
sinon.stub(restAPI, 'getSuggestedAccounts')
.returns(Promise.resolve([]));
provider.getSuggestions('').then(() => {
assert.isFalse(suggestReviewerStub.called);
assert.isTrue(suggestAccountStub.calledOnce);
assert.isTrue(suggestAccountStub.calledWith('cansee:42 '));
done();
});
});
});
});