blob: 762d36c41351844f112c0826a28afa224084ecbc [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 {GrReviewerSuggestionsProvider, SUGGESTIONS_PROVIDERS_USERS_TYPES} from './gr-reviewer-suggestions-provider.js';
import {appContext} from '../../services/app-context.js';
import {stubRestApi} from '../../test/test-utils.js';
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 provider;
let redundantSuggestion1;
let redundantSuggestion2;
let redundantSuggestion3;
let change;
setup(async () => {
owner = makeAccount();
existingReviewer1 = makeAccount();
existingReviewer2 = makeAccount();
suggestion1 = {account: makeAccount()};
suggestion2 = {account: makeAccount()};
suggestion3 = {
group: {
id: 'suggested group id',
name: 'suggested group',
},
};
stubRestApi('getConfig').returns(Promise.resolve({}));
change = {
_number: 42,
owner,
reviewers: {
CC: [existingReviewer1],
REVIEWER: [existingReviewer2],
},
};
await flush();
});
suite('allowAnyUser set to false', () => {
setup(async () => {
provider = GrReviewerSuggestionsProvider.create(
appContext.restApiService, change._number,
SUGGESTIONS_PROVIDERS_USERS_TYPES.REVIEWER);
await provider.init();
});
suite('stubbed values for _getReviewerSuggestions', () => {
let getChangeSuggestedReviewersStub;
setup(() => {
getChangeSuggestedReviewersStub =
stubRestApi('getChangeSuggestedReviewers').callsFake(() => {
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},
});
account3.email = undefined;
suggestion = provider.makeSuggestionItem(account3);
assert.deepEqual(suggestion, {
name: account3.name,
value: {account: account3, count: 1},
});
});
test('getSuggestions', async () => {
const reviewers = await provider.getSuggestions();
// Default is no filtering.
assert.equal(reviewers.length, 6);
assert.deepEqual(reviewers,
[redundantSuggestion1, redundantSuggestion2,
redundantSuggestion3, suggestion1,
suggestion2, suggestion3]);
});
test('getSuggestions short circuits when logged out', () => {
provider.loggedIn = false;
return provider.getSuggestions('').then(() => {
assert.isFalse(getChangeSuggestedReviewersStub.called);
provider.loggedIn = true;
return provider.getSuggestions('').then(() => {
assert.isTrue(getChangeSuggestedReviewersStub.called);
});
});
});
});
test('getChangeSuggestedReviewers is used', async () => {
const suggestReviewerStub = stubRestApi('getChangeSuggestedReviewers')
.returns(Promise.resolve([]));
const suggestAccountStub = stubRestApi('getSuggestedAccounts')
.returns(Promise.resolve([]));
await provider.getSuggestions('');
assert.isTrue(suggestReviewerStub.calledOnce);
assert.isTrue(suggestReviewerStub.calledWith(42, ''));
assert.isFalse(suggestAccountStub.called);
});
});
suite('allowAnyUser set to true', () => {
setup(async () => {
provider = GrReviewerSuggestionsProvider.create(
appContext.restApiService, change._number,
SUGGESTIONS_PROVIDERS_USERS_TYPES.ANY);
await provider.init();
});
test('getSuggestedAccounts is used', async () => {
const suggestReviewerStub = stubRestApi('getChangeSuggestedReviewers')
.returns(Promise.resolve([]));
const suggestAccountStub = stubRestApi('getSuggestedAccounts')
.returns(Promise.resolve([]));
await provider.getSuggestions('');
assert.isFalse(suggestReviewerStub.called);
assert.isTrue(suggestAccountStub.calledOnce);
assert.isTrue(suggestAccountStub.calledWith('cansee:42 '));
});
});
});