Introduce a proper mock for the RestApiService Simplify all stubbing of the REST API in tests by adding a canonical `stubRestApi` method. Make sure to never use the <gr-rest-api-interface> element directly anymore, thus paving the way for converting the element into a service object and moving into to the services directory. The reviewer should with looking at all non-test files first. Change-Id: Ida7c9f0482477a0971fda106f18b8c51e20597c6
diff --git a/polygerrit-ui/app/constants/constants.ts b/polygerrit-ui/app/constants/constants.ts index 061c5cd..50be7ee 100644 --- a/polygerrit-ui/app/constants/constants.ts +++ b/polygerrit-ui/app/constants/constants.ts
@@ -18,6 +18,9 @@ /** * @desc Tab names for primary tabs on change view page. */ +import {DiffPreferencesInfo} from '../types/diff'; +import {EditPreferencesInfo, PreferencesInfo} from '../types/common'; + export enum PrimaryTab { FILES = 'files', /** @@ -390,3 +393,60 @@ REF_UPDATED_AND_CHANGE_REINDEX = 'REF_UPDATED_AND_CHANGE_REINDEX', NEVER = 'NEVER', } + +// TODO(TS): Many properties are omitted here, but they are required. +// Add default values for missing properties. +export function createDefaultPreferences() { + return { + changes_per_page: 25, + default_diff_view: DiffViewMode.SIDE_BY_SIDE, + diff_view: DiffViewMode.SIDE_BY_SIDE, + size_bar_in_change_table: true, + } as PreferencesInfo; +} + +// These defaults should match the defaults in +// java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java +// NOTE: There are some settings that don't apply to PolyGerrit +// (Render mode being at least one of them). +export function createDefaultDiffPrefs(): DiffPreferencesInfo { + return { + auto_hide_diff_table_header: true, + context: 10, + cursor_blink_rate: 0, + font_size: 12, + ignore_whitespace: 'IGNORE_NONE', + intraline_difference: true, + line_length: 100, + line_wrapping: false, + show_line_endings: true, + show_tabs: true, + show_whitespace_errors: true, + syntax_highlighting: true, + tab_size: 8, + theme: 'DEFAULT', + }; +} + +// These defaults should match the defaults in +// java/com/google/gerrit/extensions/client/EditPreferencesInfo.java +export function createDefaultEditPrefs(): EditPreferencesInfo { + return { + auto_close_brackets: false, + cursor_blink_rate: 0, + hide_line_numbers: false, + hide_top_menu: false, + indent_unit: 2, + indent_with_tabs: false, + key_map_type: 'DEFAULT', + line_length: 100, + line_wrapping: false, + match_brackets: true, + show_base: false, + show_tabs: true, + show_whitespace_errors: true, + syntax_highlighting: true, + tab_size: 8, + theme: 'DEFAULT', + }; +}
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.js b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.js index 77a2a41..ed196e4 100644 --- a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.js +++ b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.js
@@ -19,6 +19,7 @@ import './gr-admin-group-list.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import 'lodash/lodash.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-admin-group-list'); @@ -73,24 +74,16 @@ }); suite('list with groups', () => { - setup(done => { + setup(async () => { groups = _.times(26, groupGenerator); - - stub('gr-rest-api-interface', { - getGroups(num, offset) { - return Promise.resolve(groups); - }, - }); - - element._paramsChanged(value).then(() => { flush(done); }); + stubRestApi('getGroups').returns(Promise.resolve(groups)); + element._paramsChanged(value); + await flush(); }); - test('test for test group in the list', done => { - flush(() => { - assert.equal(element._groups[1].name, '1'); - assert.equal(element._groups[1].options.visible_to_all, false); - done(); - }); + test('test for test group in the list', () => { + assert.equal(element._groups[1].name, '1'); + assert.equal(element._groups[1].options.visible_to_all, false); }); test('_shownGroups', () => { @@ -113,13 +106,7 @@ suite('test with less then 25 groups', () => { setup(done => { groups = _.times(25, groupGenerator); - - stub('gr-rest-api-interface', { - getGroups(num, offset) { - return Promise.resolve(groups); - }, - }); - + stubRestApi('getGroups').returns(Promise.resolve(groups)); element._paramsChanged(value).then(() => { flush(done); }); }); @@ -129,20 +116,15 @@ }); suite('filter', () => { - test('_paramsChanged', done => { - sinon.stub( - element.restApiService, - 'getGroups') - .callsFake(() => Promise.resolve(groups)); + test('_paramsChanged', async () => { + const getGroupsStub = stubRestApi('getGroups'); + getGroupsStub.returns(Promise.resolve(groups)); const value = { filter: 'test', offset: 25, }; - element._paramsChanged(value).then(() => { - assert.isTrue(element.restApiService.getGroups.lastCall - .calledWithExactly('test', 25, 25)); - done(); - }); + await element._paramsChanged(value); + assert.isTrue(getGroupsStub.lastCall.calledWithExactly('test', 25, 25)); }); });
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.js b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.js index cac409d..33ad694 100644 --- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.js +++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.js
@@ -22,19 +22,24 @@ import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js'; import {stubBaseUrl} from '../../../test/test-utils.js'; import {GerritView} from '../../../services/router/router-model.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-admin-view'); +function createAdminCapabilities() { + return { + createGroup: true, + createProject: true, + viewPlugins: true, + }; +} + suite('gr-admin-view tests', () => { let element; setup(done => { element = basicFixture.instantiate(); - stub('gr-rest-api-interface', { - getProjectConfig() { - return Promise.resolve({}); - }, - }); + stubRestApi('getProjectConfig').returns(Promise.resolve({})); const pluginsLoaded = Promise.resolve(); sinon.stub(getPluginLoader(), 'awaitPluginsLoaded').returns(pluginsLoaded); pluginsLoaded.then(() => flush(done)); @@ -84,18 +89,11 @@ }); test('_filteredLinks admin', done => { - sinon.stub(element.restApiService, 'getAccount').returns(Promise.resolve({ + stubRestApi('getAccount').returns(Promise.resolve({ name: 'test-user', })); - sinon.stub( - element.restApiService, - 'getAccountCapabilities') - .callsFake(() => Promise.resolve({ - createGroup: true, - createProject: true, - viewPlugins: true, - }) - ); + stubRestApi('getAccountCapabilities').returns( + Promise.resolve(createAdminCapabilities())); element.reload().then(() => { assert.equal(element._filteredLinks.length, 3); @@ -111,38 +109,25 @@ }); }); - test('_filteredLinks non admin authenticated', done => { - sinon.stub(element.restApiService, 'getAccount').returns(Promise.resolve({ - name: 'test-user', - })); - sinon.stub( - element.restApiService, - 'getAccountCapabilities') - .callsFake(() => Promise.resolve({}) - ); - element.reload().then(() => { - assert.equal(element._filteredLinks.length, 2); - - // Repos - assert.isNotOk(element._filteredLinks[0].subsection); - - // Groups - assert.isNotOk(element._filteredLinks[0].subsection); - done(); - }); + test('_filteredLinks non admin authenticated', async () => { + await element.reload(); + assert.equal(element._filteredLinks.length, 2); + // Repos + assert.isNotOk(element._filteredLinks[0].subsection); + // Groups + assert.isNotOk(element._filteredLinks[0].subsection); }); - test('_filteredLinks non admin unathenticated', done => { - element.reload().then(() => { - assert.equal(element._filteredLinks.length, 1); - - // Repos - assert.isNotOk(element._filteredLinks[0].subsection); - done(); - }); + test('_filteredLinks non admin unathenticated', async () => { + stubRestApi('getAccount').returns(Promise.resolve(undefined)); + await element.reload(); + assert.equal(element._filteredLinks.length, 1); + // Repos + assert.isNotOk(element._filteredLinks[0].subsection); }); test('_filteredLinks from plugin', () => { + stubRestApi('getAccount').returns(Promise.resolve(undefined)); sinon.stub(element.$.jsAPI, 'getAdminMenuLinks').returns([ {text: 'internal link text', url: '/internal/link/url'}, {text: 'external link text', url: 'http://external/link/url'}, @@ -172,17 +157,11 @@ test('Repo shows up in nav', done => { element._repoName = 'Test Repo'; - sinon.stub(element.restApiService, 'getAccount').returns(Promise.resolve({ + stubRestApi('getAccount').returns(Promise.resolve({ name: 'test-user', })); - sinon.stub( - element.restApiService, - 'getAccountCapabilities') - .callsFake(() => Promise.resolve({ - createGroup: true, - createProject: true, - viewPlugins: true, - })); + stubRestApi('getAccountCapabilities').returns( + Promise.resolve(createAdminCapabilities())); element.reload().then(() => { flush(); assert.equal(dom(element.root) @@ -197,53 +176,31 @@ }); }); - test('Group shows up in nav', done => { + test('Group shows up in nav', async () => { element._groupId = 'a15262'; element._groupName = 'my-group'; element._groupIsInternal = true; element._isAdmin = true; element._groupOwner = false; - sinon.stub(element.restApiService, 'getAccount').returns(Promise.resolve({ - name: 'test-user', - })); - sinon.stub( - element.restApiService, - 'getAccountCapabilities') - .callsFake(() => Promise.resolve({ - createGroup: true, - createProject: true, - viewPlugins: true, - })); - element.reload().then(() => { - flush(); - assert.equal(element._filteredLinks.length, 3); - - // Repos - assert.isNotOk(element._filteredLinks[0].subsection); - - // Groups - assert.equal(element._filteredLinks[1].subsection.children.length, 2); - assert.equal(element._filteredLinks[1].subsection.name, 'my-group'); - - // Plugins - assert.isNotOk(element._filteredLinks[2].subsection); - done(); - }); + stubRestApi('getAccount').returns(Promise.resolve({name: 'test-user'})); + stubRestApi('getAccountCapabilities').returns( + Promise.resolve(createAdminCapabilities())); + await element.reload(); + await flush(); + assert.equal(element._filteredLinks.length, 3); + // Repos + assert.isNotOk(element._filteredLinks[0].subsection); + // Groups + assert.equal(element._filteredLinks[1].subsection.children.length, 2); + assert.equal(element._filteredLinks[1].subsection.name, 'my-group'); + // Plugins + assert.isNotOk(element._filteredLinks[2].subsection); }); test('Nav is reloaded when repo changes', () => { - sinon.stub( - element.restApiService, - 'getAccountCapabilities') - .callsFake(() => Promise.resolve({ - createGroup: true, - createProject: true, - viewPlugins: true, - })); - sinon.stub( - element.restApiService, - 'getAccount') - .callsFake(() => Promise.resolve({_id: 1})); + stubRestApi('getAccountCapabilities').returns( + Promise.resolve(createAdminCapabilities())); + stubRestApi('getAccount').returns(Promise.resolve({_id: 1})); sinon.stub(element, 'reload'); element.params = {repo: 'Test Repo', view: GerritView.REPO}; assert.equal(element.reload.callCount, 1); @@ -254,18 +211,9 @@ test('Nav is reloaded when group changes', () => { sinon.stub(element, '_computeGroupName'); - sinon.stub( - element.restApiService, - 'getAccountCapabilities') - .callsFake(() => Promise.resolve({ - createGroup: true, - createProject: true, - viewPlugins: true, - })); - sinon.stub( - element.restApiService, - 'getAccount') - .callsFake(() => Promise.resolve({_id: 1})); + stubRestApi('getAccountCapabilities').returns( + Promise.resolve(createAdminCapabilities())); + stubRestApi('getAccount').returns(Promise.resolve({_id: 1})); sinon.stub(element, 'reload'); element.params = {groupId: '1', view: GerritView.GROUP}; assert.equal(element.reload.callCount, 1); @@ -321,18 +269,9 @@ view: GerritNav.View.REPO, detail: GerritNav.RepoDetailView.ACCESS, }; - sinon.stub( - element.restApiService, - 'getAccountCapabilities') - .callsFake(() => Promise.resolve({ - createGroup: true, - createProject: true, - viewPlugins: true, - })); - sinon.stub( - element.restApiService, - 'getAccount') - .callsFake(() => Promise.resolve({_id: 1})); + stubRestApi('getAccountCapabilities').returns( + Promise.resolve(createAdminCapabilities())); + stubRestApi('getAccount').returns(Promise.resolve({_id: 1})); flush(); const expectedFilteredLinks = [ { @@ -484,19 +423,9 @@ suite('_computeSelectedClass', () => { setup(() => { - sinon.stub( - element.restApiService, - 'getAccountCapabilities') - .callsFake(() => Promise.resolve({ - createGroup: true, - createProject: true, - viewPlugins: true, - })); - sinon.stub( - element.restApiService, - 'getAccount') - .callsFake(() => Promise.resolve({_id: 1})); - + stubRestApi('getAccountCapabilities').returns( + Promise.resolve(createAdminCapabilities())); + stubRestApi('getAccount').returns(Promise.resolve({_id: 1})); return element.reload(); }); @@ -569,6 +498,7 @@ }); suite('groups', () => { + let getGroupConfigStub; setup(() => { stub('gr-group', { _loadGroup: () => Promise.resolve({}), @@ -577,12 +507,12 @@ _loadGroupDetails: () => {}, }); - sinon.stub(element.restApiService, 'getGroupConfig') - .returns(Promise.resolve({ - name: 'foo', - id: 'c0f83e941ce90caea30e6ad88f0d4ea0e841a7a9', - })); - sinon.stub(element.restApiService, 'getIsGroupOwner') + getGroupConfigStub = stubRestApi('getGroupConfig'); + getGroupConfigStub.returns(Promise.resolve({ + name: 'foo', + id: 'c0f83e941ce90caea30e6ad88f0d4ea0e841a7a9', + })); + stubRestApi('getIsGroupOwner') .returns(Promise.resolve(true)); return element.reload(); }); @@ -620,12 +550,10 @@ }); test('external group', () => { - element.restApiService.getGroupConfig.restore(); - sinon.stub(element.restApiService, 'getGroupConfig') - .returns(Promise.resolve({ - name: 'foo', - id: 'external-id', - })); + getGroupConfigStub.returns(Promise.resolve({ + name: 'foo', + id: 'external-id', + })); element.params = { view: GerritNav.View.GROUP, groupId: 1234,
diff --git a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog_test.ts b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog_test.ts index 0a4e23d..198794e 100644 --- a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog_test.ts +++ b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog_test.ts
@@ -21,6 +21,7 @@ import {BranchName, GitRef, RepoName} from '../../../types/common'; import {InheritedBooleanInfoConfiguredValue} from '../../../constants/constants'; import {createChange, createConfig} from '../../../test/test-data-generators'; +import {stubRestApi} from '../../../test/test-utils'; const basicFixture = fixtureFromElement('gr-create-change-dialog'); @@ -28,23 +29,18 @@ let element: GrCreateChangeDialog; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { - return Promise.resolve(true); - }, - getRepoBranches(input) { - if (input.startsWith('test')) { - return Promise.resolve([ - { - ref: 'refs/heads/test-branch' as GitRef, - revision: '67ebf73496383c6777035e374d2d664009e2aa5c', - can_delete: true, - }, - ]); - } else { - return Promise.resolve([]); - } - }, + stubRestApi('getRepoBranches').callsFake((input: string) => { + if (input.startsWith('test')) { + return Promise.resolve([ + { + ref: 'refs/heads/test-branch' as GitRef, + revision: '67ebf73496383c6777035e374d2d664009e2aa5c', + can_delete: true, + }, + ]); + } else { + return Promise.resolve([]); + } }); element = basicFixture.instantiate(); element.repoName = 'test-repo' as RepoName; @@ -67,9 +63,9 @@ work_in_progress: true, }; - const saveStub = sinon - .stub(element.restApiService, 'createChange') - .callsFake(() => Promise.resolve(createChange())); + const saveStub = stubRestApi('createChange').returns( + Promise.resolve(createChange()) + ); element.branch = 'test-branch' as BranchName; element.topic = 'test-topic'; @@ -103,9 +99,9 @@ work_in_progress: true, }; - const saveStub = sinon - .stub(element.restApiService, 'createChange') - .callsFake(() => Promise.resolve(createChange())); + const saveStub = stubRestApi('createChange').returns( + Promise.resolve(createChange()) + ); element.branch = 'test-branch' as BranchName; element.topic = 'test-topic';
diff --git a/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog_test.js b/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog_test.js index bf0c244..af33691 100644 --- a/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog_test.js +++ b/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-create-group-dialog.js'; import {page} from '../../../utils/page-wrapper-utils.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-create-group-dialog'); @@ -27,9 +28,6 @@ const GROUP_NAME = 'test-group'; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - }); element = basicFixture.instantiate(); }); @@ -47,11 +45,8 @@ }); test('test for redirecting to group on successful creation', done => { - sinon.stub(element.restApiService, 'createGroup') - .returns(Promise.resolve({status: 201})); - - sinon.stub(element.restApiService, 'getGroupConfig') - .returns(Promise.resolve({group_id: 551})); + stubRestApi('createGroup').returns(Promise.resolve({status: 201})); + stubRestApi('getGroupConfig').returns(Promise.resolve({group_id: 551})); const showStub = sinon.stub(page, 'show'); element.handleCreateGroup() @@ -62,11 +57,8 @@ }); test('test for unsuccessful group creation', done => { - sinon.stub(element.restApiService, 'createGroup') - .returns(Promise.resolve({status: 409})); - - sinon.stub(element.restApiService, 'getGroupConfig') - .returns(Promise.resolve({group_id: 551})); + stubRestApi('createGroup').returns(Promise.resolve({status: 409})); + stubRestApi('getGroupConfig').returns(Promise.resolve({group_id: 551})); const showStub = sinon.stub(page, 'show'); element.handleCreateGroup()
diff --git a/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.js b/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.js index 9c281b1..60af4d5 100644 --- a/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.js +++ b/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-create-pointer-dialog.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-create-pointer-dialog'); @@ -28,17 +29,11 @@ }; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - }); element = basicFixture.instantiate(); }); test('branch created', done => { - sinon.stub( - element.restApiService, - 'createRepoBranch') - .callsFake(() => Promise.resolve({})); + stubRestApi('createRepoBranch').returns(Promise.resolve({})); assert.isFalse(element.hasNewItemName); @@ -57,10 +52,7 @@ }); test('tag created', done => { - sinon.stub( - element.restApiService, - 'createRepoTag') - .callsFake(() => Promise.resolve({})); + stubRestApi('createRepoTag').returns(Promise.resolve({})); assert.isFalse(element.hasNewItemName); @@ -79,10 +71,7 @@ }); test('tag created with annotations', done => { - sinon.stub( - element.restApiService, - 'createRepoTag') - .callsFake(() => Promise.resolve({})); + stubRestApi('createRepoTag').returns(() => Promise.resolve({})); assert.isFalse(element.hasNewItemName);
diff --git a/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog_test.js b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog_test.js index 0af2e23..f10141a 100644 --- a/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog_test.js +++ b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-create-repo-dialog.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-create-repo-dialog'); @@ -24,9 +25,6 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - }); element = basicFixture.instantiate(); }); @@ -44,8 +42,7 @@ owners: ['testId'], }; - const saveStub = sinon.stub(element.restApiService, - 'createRepo').callsFake(() => Promise.resolve({})); + const saveStub = stubRestApi('createRepo').returns(Promise.resolve({})); assert.isFalse(element.hasNewRepoName);
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.js b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.js index ce4e4c3..25fd854 100644 --- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.js +++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-group-audit-log.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-group-audit-log'); @@ -79,11 +80,9 @@ element.groupId = 1; const response = {status: 404}; - sinon.stub( - element.restApiService, 'getGroupAuditLog') - .callsFake((group, errFn) => { - errFn(response); - }); + stubRestApi('getGroupAuditLog').callsFake((group, errFn) => { + errFn(response); + }); element.addEventListener('page-error', e => { assert.deepEqual(e.detail.response, response);
diff --git a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members_test.js b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members_test.js index 59820b8..c09ac1e 100644 --- a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members_test.js +++ b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members_test.js
@@ -18,7 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-group-members.js'; import {dom, flush} from '@polymer/polymer/lib/legacy/polymer.dom.js'; -import {stubBaseUrl} from '../../../test/test-utils.js'; +import {stubBaseUrl, stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-group-members'); @@ -78,70 +78,52 @@ }, ]; - stub('gr-rest-api-interface', { - getSuggestedAccounts(input) { - if (input.startsWith('test')) { - return Promise.resolve([ - { - _account_id: 1000096, - name: 'test-account', - email: 'test.account@example.com', - username: 'test123', - }, - { - _account_id: 1001439, - name: 'test-admin', - email: 'test.admin@example.com', - username: 'test_admin', - }, - { - _account_id: 1001439, - name: 'test-git', - username: 'test_git', - }, - ]); - } else { - return Promise.resolve({}); - } - }, - getSuggestedGroups(input) { - if (input.startsWith('test')) { - return Promise.resolve({ - 'test-admin': { - id: '1ce023d3fb4e4260776fb92cd08b52bbd21ce70a', - }, - 'test/Administrator (admin)': { - id: 'test%3Aadmin', - }, - }); - } else { - return Promise.resolve({}); - } - }, - getLoggedIn() { return Promise.resolve(true); }, - getConfig() { - return Promise.resolve(); - }, - getGroupMembers() { - return Promise.resolve(groupMembers); - }, - getIsGroupOwner() { - return Promise.resolve(true); - }, - getIncludedGroup() { - return Promise.resolve(includedGroups); - }, - getAccountCapabilities() { - return Promise.resolve(); - }, + stubRestApi('getSuggestedAccounts').callsFake(input => { + if (input.startsWith('test')) { + return Promise.resolve([ + { + _account_id: 1000096, + name: 'test-account', + email: 'test.account@example.com', + username: 'test123', + }, + { + _account_id: 1001439, + name: 'test-admin', + email: 'test.admin@example.com', + username: 'test_admin', + }, + { + _account_id: 1001439, + name: 'test-git', + username: 'test_git', + }, + ]); + } else { + return Promise.resolve({}); + } }); + stubRestApi('getSuggestedGroups').callsFake(input => { + if (input.startsWith('test')) { + return Promise.resolve({ + 'test-admin': { + id: '1ce023d3fb4e4260776fb92cd08b52bbd21ce70a', + }, + 'test/Administrator (admin)': { + id: 'test%3Aadmin', + }, + }); + } else { + return Promise.resolve({}); + } + }); + stubRestApi('getGroupMembers').returns(Promise.resolve(groupMembers)); + stubRestApi('getIsGroupOwner').returns(Promise.resolve(true)); + stubRestApi('getIncludedGroup').returns(Promise.resolve(includedGroups)); element = basicFixture.instantiate(); stubBaseUrl('https://test/site'); element.groupId = 1; - groupStub = sinon.stub( - element.restApiService, - 'getGroupConfig') - .callsFake(() => Promise.resolve(groups)); + groupStub = stubRestApi('getGroupConfig').returns(Promise.resolve(groups)); return element._loadGroupDetails(); }); @@ -162,7 +144,7 @@ const memberName = 'test-admin'; - const saveStub = sinon.stub(element.restApiService, 'saveGroupMember') + const saveStub = stubRestApi('saveGroupMember') .callsFake(() => Promise.resolve({})); const button = element.$.saveGroupMember; @@ -187,8 +169,7 @@ const includedGroupName = 'testName'; - const saveIncludedGroupStub = sinon.stub( - element.restApiService, 'saveIncludedGroup') + const saveIncludedGroupStub = stubRestApi('saveIncludedGroup') .callsFake(() => Promise.resolve({})); const button = element.$.saveIncludedGroups; @@ -219,8 +200,14 @@ status: 404, ok: false, }; - sinon.stub(element.restApiService._restApiHelper, 'fetch').callsFake( - () => Promise.resolve(errorResponse)); + stubRestApi('saveIncludedGroup').callsFake(( + groupName, + includedGroup, + errFn + ) => { + errFn(errorResponse); + return Promise.resolve(undefined); + }); element.$.groupMemberSearchInput.text = memberName; element.$.groupMemberSearchInput.value = 1234; @@ -232,13 +219,8 @@ test('add included group network-error throws an exception', async () => { element._groupOwner = true; - const memberName = 'bad-name'; - const alertStub = sinon.stub(); - element.addEventListener('show-alert', alertStub); - const err = new Error(); - sinon.stub(element.restApiService._restApiHelper, 'fetch').callsFake( - () => Promise.reject(err)); + stubRestApi('saveIncludedGroup').throws(new Error()); element.$.groupMemberSearchInput.text = memberName; element.$.groupMemberSearchInput.value = 1234; @@ -366,8 +348,7 @@ element.groupId = 1; const response = {status: 404}; - sinon.stub( - element.restApiService, 'getGroupConfig') + stubRestApi('getGroupConfig') .callsFake((group, errFn) => { errFn(response); });
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.js b/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.js index c006251..4a80946 100644 --- a/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.js +++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-group.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-group'); @@ -36,14 +37,8 @@ }; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - }); element = basicFixture.instantiate(); - groupStub = sinon.stub( - element.restApiService, - 'getGroupConfig') - .callsFake(() => Promise.resolve(group)); + groupStub = stubRestApi('getGroupConfig').returns(Promise.resolve(group)); }); test('loading displays before group config is loaded', () => { @@ -55,10 +50,7 @@ }); test('default values are populated with internal group', done => { - sinon.stub( - element.restApiService, - 'getIsGroupOwner') - .callsFake(() => Promise.resolve(true)); + stubRestApi('getIsGroupOwner').returns(Promise.resolve(true)); element.groupId = 1; element._loadGroup().then(() => { assert.isTrue(element._groupIsInternal); @@ -71,14 +63,9 @@ const groupExternal = {...group}; groupExternal.id = 'external-group-id'; groupStub.restore(); - groupStub = sinon.stub( - element.restApiService, - 'getGroupConfig') - .callsFake(() => Promise.resolve(groupExternal)); - sinon.stub( - element.restApiService, - 'getIsGroupOwner') - .callsFake(() => Promise.resolve(true)); + groupStub = stubRestApi('getGroupConfig').returns( + Promise.resolve(groupExternal)); + stubRestApi('getIsGroupOwner').returns(Promise.resolve(true)); element.groupId = 1; element._loadGroup().then(() => { assert.isFalse(element._groupIsInternal); @@ -96,15 +83,8 @@ }; element._groupName = groupName; - sinon.stub( - element.restApiService, - 'getIsGroupOwner') - .callsFake(() => Promise.resolve(true)); - - sinon.stub( - element.restApiService, - 'saveGroupName') - .callsFake(() => Promise.resolve({status: 200})); + stubRestApi('getIsGroupOwner').returns(Promise.resolve(true)); + stubRestApi('saveGroupName').returns(Promise.resolve({status: 200})); const button = element.$.inputUpdateNameBtn; @@ -135,10 +115,7 @@ element._groupConfigOwner = 'testId'; element._groupOwner = true; - sinon.stub( - element.restApiService, - 'getIsGroupOwner') - .callsFake(() => Promise.resolve({status: 200})); + stubRestApi('getIsGroupOwner').returns(Promise.resolve({status: 200})); const button = element.$.inputUpdateOwnerBtn; @@ -162,10 +139,7 @@ test('test for undefined group name', done => { groupStub.restore(); - sinon.stub( - element.restApiService, - 'getGroupConfig') - .callsFake(() => Promise.resolve({})); + stubRestApi('getGroupConfig').returns(Promise.resolve({})); assert.isUndefined(element.groupId); @@ -189,8 +163,7 @@ name: 'test-group', }; element.groupId = 'gg'; - sinon.stub(element.restApiService, 'saveGroupName') - .returns(Promise.resolve({status: 200})); + stubRestApi('saveGroupName').returns(Promise.resolve({status: 200})); const showStub = sinon.stub(element, 'dispatchEvent'); element._handleSaveName() @@ -239,8 +212,7 @@ element.groupId = 1; const response = {status: 404}; - sinon.stub( - element.restApiService, 'getGroupConfig').callsFake((group, errFn) => { + stubRestApi('getGroupConfig').callsFake((group, errFn) => { errFn(response); });
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.js b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.js index c9b0131..d5668d8 100644 --- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.js +++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-permission.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-permission'); @@ -25,7 +26,7 @@ setup(() => { element = basicFixture.instantiate(); - sinon.stub(element.restApiService, 'getSuggestedGroups').returns( + stubRestApi('getSuggestedGroups').returns( Promise.resolve({ 'Administrators': { id: '4c97682e6ce61b7247f3381b6f1789356666de7f',
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.js b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.js index 6aa247f..82e0f8c 100644 --- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.js +++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-plugin-list.js'; import 'lodash/lodash.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-plugin-list'); @@ -54,13 +55,7 @@ suite('list with plugins', () => { setup(done => { plugins = _.times(26, pluginGenerator); - - stub('gr-rest-api-interface', { - getPlugins(num, offset) { - return Promise.resolve(plugins); - }, - }); - + stubRestApi('getPlugins').returns(Promise.resolve(plugins)); element._paramsChanged(value).then(() => { flush(done); }); }); @@ -113,13 +108,7 @@ suite('list with less then 26 plugins', () => { setup(done => { plugins = _.times(25, pluginGenerator); - - stub('gr-rest-api-interface', { - getPlugins(num, offset) { - return Promise.resolve(plugins); - }, - }); - + stubRestApi('getPlugins').returns(Promise.resolve(plugins)); element._paramsChanged(value).then(() => { flush(done); }); }); @@ -129,24 +118,17 @@ }); suite('filter', () => { - test('_paramsChanged', done => { - sinon.stub( - element.restApiService, - 'getPlugins') - .callsFake(() => Promise.resolve(plugins)); + test('_paramsChanged', async () => { + const getPluginsStub = stubRestApi('getPlugins'); + getPluginsStub.returns(Promise.resolve(plugins)); const value = { filter: 'test', offset: 25, }; - element._paramsChanged(value).then(() => { - assert.equal(element.restApiService.getPlugins.lastCall.args[0], - 'test'); - assert.equal(element.restApiService.getPlugins.lastCall.args[1], - 25); - assert.equal(element.restApiService.getPlugins.lastCall.args[2], - 25); - done(); - }); + await element._paramsChanged(value); + assert.equal(getPluginsStub.lastCall.args[0], 'test'); + assert.equal(getPluginsStub.lastCall.args[1], 25); + assert.equal(getPluginsStub.lastCall.args[2], 25); }); }); @@ -168,7 +150,7 @@ suite('404', () => { test('fires page-error', done => { const response = {status: 404}; - sinon.stub(element.restApiService, 'getPlugins').callsFake( + stubRestApi('getPlugins').callsFake( (filter, pluginsPerPage, opt_offset, errFn) => { errFn(response); });
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.js b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.js index 2af4b6f1..1f73b4c 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.js +++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.js
@@ -20,6 +20,7 @@ import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import {toSortedPermissionsArray} from '../../../utils/access-util.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-repo-access'); @@ -101,11 +102,8 @@ }; setup(() => { element = basicFixture.instantiate(); - stub('gr-rest-api-interface', { - getAccount() { return Promise.resolve(null); }, - }); - repoStub = sinon.stub(element.restApiService, 'getRepo').returns( - Promise.resolve(repoRes)); + stubRestApi('getAccount').returns(Promise.resolve(null)); + repoStub = stubRestApi('getRepo').returns(Promise.resolve(repoRes)); element._loading = false; element._ownerOf = []; element._canUpload = false; @@ -118,14 +116,14 @@ }); test('_repoChanged', done => { - const accessStub = sinon.stub(element.restApiService, + const accessStub = stubRestApi( 'getRepoAccessRights'); accessStub.withArgs('New Repo').returns( Promise.resolve(JSON.parse(JSON.stringify(accessRes)))); accessStub.withArgs('Another New Repo') .returns(Promise.resolve(JSON.parse(JSON.stringify(accessRes2)))); - const capabilitiesStub = sinon.stub(element.restApiService, + const capabilitiesStub = stubRestApi( 'getCapabilities'); capabilitiesStub.returns(Promise.resolve(capabilitiesRes)); @@ -160,9 +158,9 @@ name: 'Access Database', }, }; - const accessStub = sinon.stub(element.restApiService, 'getRepoAccessRights') + const accessStub = stubRestApi('getRepoAccessRights') .returns(Promise.resolve(JSON.parse(JSON.stringify(accessRes2)))); - const capabilitiesStub = sinon.stub(element.restApiService, + const capabilitiesStub = stubRestApi( 'getCapabilities').returns(Promise.resolve(capabilitiesRes)); element._repoChanged().then(() => { @@ -240,11 +238,9 @@ test('fires page-error', done => { const response = {status: 404}; - sinon.stub( - element.restApiService, 'getRepoAccessRights') - .callsFake((repoName, errFn) => { - errFn(response); - }); + stubRestApi('getRepoAccessRights').callsFake((repoName, errFn) => { + errFn(response); + }); element.addEventListener('page-error', e => { assert.deepEqual(e.detail.response, response); @@ -378,7 +374,7 @@ test('_handleSaveForReview', () => { const saveStub = - sinon.stub(element.restApiService, 'setRepoAccessRightsForReview'); + stubRestApi('setRepoAccessRightsForReview'); sinon.stub(element, '_computeAddAndRemove').returns({ add: {}, remove: {}, @@ -1161,11 +1157,11 @@ }, }, }; - sinon.stub(element.restApiService, 'getRepoAccessRights').returns( + stubRestApi('getRepoAccessRights').returns( Promise.resolve(JSON.parse(JSON.stringify(accessRes)))); sinon.stub(GerritNav, 'navigateToChange'); let resolver; - const saveStub = sinon.stub(element.restApiService, + const saveStub = stubRestApi( 'setRepoAccessRights') .returns(new Promise(r => resolver = r)); @@ -1208,11 +1204,11 @@ }, }, }; - sinon.stub(element.restApiService, 'getRepoAccessRights').returns( + stubRestApi('getRepoAccessRights').returns( Promise.resolve(JSON.parse(JSON.stringify(accessRes)))); sinon.stub(GerritNav, 'navigateToChange'); let resolver; - const saveForReviewStub = sinon.stub(element.restApiService, + const saveForReviewStub = stubRestApi( 'setRepoAccessRightsForReview') .returns(new Promise(r => resolver = r));
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands_test.js b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands_test.js index 60d5f20..b01b654 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands_test.js +++ b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-repo-commands.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-repo-commands'); @@ -31,8 +32,7 @@ // Note that this probably does not achieve what it is supposed to, because // getProjectConfig() is called as soon as the element is attached, so // stubbing it here has not effect anymore. - repoStub = sinon.stub(element.restApiService, 'getProjectConfig') - .returns(Promise.resolve({})); + repoStub = stubRestApi('getProjectConfig').returns(Promise.resolve({})); }); suite('create new change dialog', () => { @@ -68,7 +68,7 @@ let alertStub; setup(() => { - createChangeStub = sinon.stub(element.restApiService, 'createChange'); + createChangeStub = stubRestApi('createChange'); urlStub = sinon.stub(GerritNav, 'getEditUrlForDiff'); sinon.stub(GerritNav, 'navigateToRelativeUrl'); handleSpy = sinon.spy(element, '_handleEditRepoConfig'); @@ -118,11 +118,9 @@ element.repo = 'test'; const response = {status: 404}; - sinon.stub( - element.restApiService, 'getProjectConfig') - .callsFake((repo, errFn) => { - errFn(response); - }); + stubRestApi('getProjectConfig').callsFake((repo, errFn) => { + errFn(response); + }); element.addEventListener('page-error', e => { assert.deepEqual(e.detail.response, response); done();
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.js b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.js index f5d4365..b84b6b4 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.js +++ b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-repo-dashboards.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-repo-dashboards'); @@ -30,7 +31,7 @@ suite('dashboard table', () => { setup(() => { - sinon.stub(element.restApiService, 'getRepoDashboards').returns( + stubRestApi('getRepoDashboards').returns( Promise.resolve([ { id: 'default:contributor', @@ -123,11 +124,9 @@ suite('404', () => { test('fires page-error', done => { const response = {status: 404}; - sinon.stub( - element.restApiService, 'getRepoDashboards') - .callsFake((repo, errFn) => { - errFn(response); - }); + stubRestApi('getRepoDashboards').callsFake((repo, errFn) => { + errFn(response); + }); element.addEventListener('page-error', e => { assert.deepEqual(e.detail.response, response);
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.js b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.js index f20fd1e..ed8b762 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.js +++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.js
@@ -20,6 +20,7 @@ import 'lodash/lodash.js'; import {page} from '../../../utils/page-wrapper-utils.js'; import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-repo-detail-list'); @@ -74,18 +75,12 @@ ref: 'HEAD', revision: 'master', }].concat(_.times(25, branchGenerator)); - - stub('gr-rest-api-interface', { - getRepoBranches(num, project, offset) { - return Promise.resolve(branches); - }, - }); + stubRestApi('getRepoBranches').returns(Promise.resolve(branches)); const params = { repo: 'test', detail: 'branches', }; - element._paramsChanged(params).then(() => { flush(done); }); }); @@ -118,7 +113,7 @@ test('Edit HEAD button not admin', done => { sinon.stub(element, '_getLoggedIn').returns(Promise.resolve(true)); - sinon.stub(element.restApiService, 'getRepoAccess').returns( + stubRestApi('getRepoAccess').returns( Promise.resolve({ test: {is_owner: false}, })); @@ -142,7 +137,7 @@ .querySelector('.revisionWithEditing'); sinon.stub(element, '_getLoggedIn').returns(Promise.resolve(true)); - sinon.stub(element.restApiService, 'getRepoAccess').returns( + stubRestApi('getRepoAccess').returns( Promise.resolve({ test: {is_owner: true}, })); @@ -219,7 +214,7 @@ test('_handleSaveRevision with invalid rev', done => { const event = {model: {set: sinon.stub()}}; element._isEditing = true; - sinon.stub(element.restApiService, 'setRepoHead').returns( + stubRestApi('setRepoHead').returns( Promise.resolve({ status: 400, }) @@ -235,7 +230,7 @@ test('_handleSaveRevision with valid rev', done => { const event = {model: {set: sinon.stub()}}; element._isEditing = true; - sinon.stub(element.restApiService, 'setRepoHead').returns( + stubRestApi('setRepoHead').returns( Promise.resolve({ status: 200, }) @@ -257,12 +252,7 @@ suite('list with less then 25 branches', () => { setup(done => { branches = _.times(25, branchGenerator); - - stub('gr-rest-api-interface', { - getRepoBranches(num, repo, offset) { - return Promise.resolve(branches); - }, - }); + stubRestApi('getRepoBranches').returns(Promise.resolve(branches)); const params = { repo: 'test', @@ -278,35 +268,27 @@ }); suite('filter', () => { - test('_paramsChanged', done => { - sinon.stub( - element.restApiService, - 'getRepoBranches') - .callsFake(() => Promise.resolve(branches)); + test('_paramsChanged', async () => { + const stub = stubRestApi('getRepoBranches').returns( + Promise.resolve(branches)); const params = { detail: 'branches', repo: 'test', filter: 'test', offset: 25, }; - element._paramsChanged(params).then(() => { - assert.equal(element.restApiService.getRepoBranches.lastCall.args[0], - 'test'); - assert.equal(element.restApiService.getRepoBranches.lastCall.args[1], - 'test'); - assert.equal(element.restApiService.getRepoBranches.lastCall.args[2], - 25); - assert.equal(element.restApiService.getRepoBranches.lastCall.args[3], - 25); - done(); - }); + await element._paramsChanged(params); + assert.equal(stub.lastCall.args[0], 'test'); + assert.equal(stub.lastCall.args[1], 'test'); + assert.equal(stub.lastCall.args[2], 25); + assert.equal(stub.lastCall.args[3], 25); }); }); suite('404', () => { test('fires page-error', done => { const response = {status: 404}; - sinon.stub(element.restApiService, 'getRepoBranches').callsFake( + stubRestApi('getRepoBranches').callsFake( (filter, repo, reposBranchesPerPage, opt_offset, errFn) => { errFn(response); }); @@ -360,12 +342,7 @@ suite('list of repo tags', () => { setup(done => { tags = _.times(26, tagGenerator); - - stub('gr-rest-api-interface', { - getRepoTags(num, repo, offset) { - return Promise.resolve(tags); - }, - }); + stubRestApi('getRepoTags').returns(Promise.resolve(tags)); const params = { repo: 'test', @@ -435,12 +412,7 @@ suite('list with less then 25 tags', () => { setup(done => { tags = _.times(25, tagGenerator); - - stub('gr-rest-api-interface', { - getRepoTags(num, project, offset) { - return Promise.resolve(tags); - }, - }); + stubRestApi('getRepoTags').returns(Promise.resolve(tags)); const params = { repo: 'test', @@ -456,28 +428,19 @@ }); suite('filter', () => { - test('_paramsChanged', done => { - sinon.stub( - element.restApiService, - 'getRepoTags') - .callsFake(() => Promise.resolve(tags)); + test('_paramsChanged', async () => { + const stub = stubRestApi('getRepoTags').returns(Promise.resolve(tags)); const params = { repo: 'test', detail: 'tags', filter: 'test', offset: 25, }; - element._paramsChanged(params).then(() => { - assert.equal(element.restApiService.getRepoTags.lastCall.args[0], - 'test'); - assert.equal(element.restApiService.getRepoTags.lastCall.args[1], - 'test'); - assert.equal(element.restApiService.getRepoTags.lastCall.args[2], - 25); - assert.equal(element.restApiService.getRepoTags.lastCall.args[3], - 25); - done(); - }); + await element._paramsChanged(params); + assert.equal(stub.lastCall.args[0], 'test'); + assert.equal(stub.lastCall.args[1], 'test'); + assert.equal(stub.lastCall.args[2], 25); + assert.equal(stub.lastCall.args[3], 25); }); }); @@ -520,7 +483,7 @@ suite('404', () => { test('fires page-error', done => { const response = {status: 404}; - sinon.stub(element.restApiService, 'getRepoTags').callsFake( + stubRestApi('getRepoTags').callsFake( (filter, repo, reposTagsPerPage, opt_offset, errFn) => { errFn(response); });
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.js b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.js index baa33a7..6bf73d1 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.js +++ b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.js
@@ -19,6 +19,7 @@ import './gr-repo-list.js'; import {page} from '../../../utils/page-wrapper-utils.js'; import 'lodash/lodash.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-repo-list'); @@ -51,11 +52,7 @@ suite('list with repos', () => { setup(done => { repos = _.times(26, repoGenerator); - stub('gr-rest-api-interface', { - getRepos(num, offset) { - return Promise.resolve(repos); - }, - }); + stubRestApi('getRepos').returns(Promise.resolve(repos)); element._paramsChanged(value).then(() => { flush(done); }); }); @@ -86,13 +83,7 @@ suite('list with less then 25 repos', () => { setup(done => { repos = _.times(25, repoGenerator); - - stub('gr-rest-api-interface', { - getRepos(num, offset) { - return Promise.resolve(repos); - }, - }); - + stubRestApi('getRepos').returns(Promise.resolve(repos)); element._paramsChanged(value).then(() => { flush(done); }); }); @@ -108,22 +99,19 @@ reposFiltered = _.times(1, repoGenerator); }); - test('_paramsChanged', done => { - sinon.stub(element.restApiService, 'getRepos') - .callsFake( () => Promise.resolve(repos)); + test('_paramsChanged', async () => { + const repoStub = stubRestApi('getRepos'); + repoStub.returns(Promise.resolve(repos)); const value = { filter: 'test', offset: 25, }; - element._paramsChanged(value).then(() => { - assert.isTrue(element.restApiService.getRepos.lastCall - .calledWithExactly('test', 25, 25)); - done(); - }); + await element._paramsChanged(value); + assert.isTrue(repoStub.lastCall.calledWithExactly('test', 25, 25)); }); test('latest repos requested are always set', done => { - const repoStub = sinon.stub(element.restApiService, 'getRepos'); + const repoStub = stubRestApi('getRepos'); repoStub.withArgs('test').returns(Promise.resolve(repos)); repoStub.withArgs('filter').returns(Promise.resolve(reposFiltered)); element._filter = 'test';
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.js b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.js index 29a83941..e2b26df 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.js +++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.js
@@ -18,12 +18,13 @@ import '../../../test/common-test-setup-karma.js'; import './gr-repo.js'; import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-repo'); suite('gr-repo tests', () => { let element; - + let loggedInStub; let repoStub; const repoConf = { description: 'Access inherited by all other projects.', @@ -98,17 +99,11 @@ } setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(false); }, - getConfig() { - return Promise.resolve({download: {}}); - }, - }); + loggedInStub = stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getConfig').returns(Promise.resolve({download: {}})); + repoStub = + stubRestApi('getProjectConfig').returns(Promise.resolve(repoConf)); element = basicFixture.instantiate(); - repoStub = sinon.stub( - element.restApiService, - 'getProjectConfig') - .callsFake(() => Promise.resolve(repoConf)); }); test('_computePluginData', () => { @@ -159,37 +154,28 @@ assert.isTrue(element._readOnly); }); - test('form defaults to read only when not logged in', done => { + test('form defaults to read only when not logged in', async () => { element.repo = REPO; - element._loadRepo().then(() => { - assert.isTrue(element._readOnly); - done(); - }); + await element._loadRepo(); + assert.isTrue(element._readOnly); }); - test('form defaults to read only when logged in and not admin', done => { + test('form defaults to read only when logged in and not admin', async () => { element.repo = REPO; - sinon.stub(element, '_getLoggedIn').callsFake(() => Promise.resolve(true)); - sinon.stub( - element.restApiService, - 'getRepoAccess') + stubRestApi('getRepoAccess') .callsFake(() => Promise.resolve({'test-repo': {}})); - element._loadRepo().then(() => { - assert.isTrue(element._readOnly); - done(); - }); + await element._loadRepo(); + assert.isTrue(element._readOnly); }); - test('all form elements are disabled when not admin', done => { + test('all form elements are disabled when not admin', async () => { element.repo = REPO; - element._loadRepo().then(() => { - flush(); - const formFields = getFormFields(); - for (const field of formFields) { - assert.isTrue(field.hasAttribute('disabled')); - } - done(); - }); + await element._loadRepo(); + flush(); + const formFields = getFormFields(); + for (const field of formFields) { + assert.isTrue(field.hasAttribute('disabled')); + } }); test('_formatBooleanSelect', () => { @@ -246,8 +232,7 @@ element.repo = 'test'; const response = {status: 404}; - sinon.stub( - element.restApiService, 'getProjectConfig').callsFake((repo, errFn) => { + stubRestApi('getProjectConfig').callsFake((repo, errFn) => { errFn(response); }); element.addEventListener('page-error', e => { @@ -261,48 +246,38 @@ suite('admin', () => { setup(() => { element.repo = REPO; - sinon.stub(element, '_getLoggedIn') - .callsFake(() => Promise.resolve(true)); - sinon.stub( - element.restApiService, - 'getRepoAccess') - .callsFake(() => Promise.resolve({'test-repo': {is_owner: true}})); + loggedInStub.returns(Promise.resolve(true)); + stubRestApi('getRepoAccess') + .returns(Promise.resolve({'test-repo': {is_owner: true}})); }); - test('all form elements are enabled', done => { - element._loadRepo().then(() => { - flush(); - const formFields = getFormFields(); - for (const field of formFields) { - assert.isFalse(field.hasAttribute('disabled')); - } - assert.isFalse(element._loading); - done(); - }); + test('all form elements are enabled', async () => { + await element._loadRepo(); + await flush(); + const formFields = getFormFields(); + for (const field of formFields) { + assert.isFalse(field.hasAttribute('disabled')); + } + assert.isFalse(element._loading); }); - test('state gets set correctly', done => { - element._loadRepo().then(() => { - assert.equal(element._repoConfig.state, 'ACTIVE'); - assert.equal(element.$.stateSelect.bindValue, 'ACTIVE'); - done(); - }); + test('state gets set correctly', async () => { + await element._loadRepo(); + assert.equal(element._repoConfig.state, 'ACTIVE'); + assert.equal(element.$.stateSelect.bindValue, 'ACTIVE'); }); - test('inherited submit type value is calculated correctly', done => { - element - ._loadRepo().then(() => { - const sel = element.$.submitTypeSelect; - assert.equal(sel.bindValue, 'INHERIT'); - assert.equal( - sel.nativeSelect.options[0].text, - 'Inherit (Merge if necessary)' - ); - done(); - }); + test('inherited submit type value is calculated correctly', async () => { + await element._loadRepo(); + const sel = element.$.submitTypeSelect; + assert.equal(sel.bindValue, 'INHERIT'); + assert.equal( + sel.nativeSelect.options[0].text, + 'Inherit (Merge if necessary)' + ); }); - test('fields update and save correctly', () => { + test('fields update and save correctly', async () => { const configInputObj = { description: 'new description', use_contributor_agreements: 'TRUE', @@ -322,59 +297,57 @@ enable_reviewer_by_email: 'TRUE', }; - const saveStub = sinon.stub(element.restApiService, 'saveRepoConfig') + const saveStub = stubRestApi('saveRepoConfig') .callsFake(() => Promise.resolve({})); const button = element.root.querySelector('gr-button'); - return element._loadRepo().then(() => { - assert.isTrue(button.hasAttribute('disabled')); - assert.isFalse(element.$.Title.classList.contains('edited')); - element.$.descriptionInput.bindValue = configInputObj.description; - element.$.stateSelect.bindValue = configInputObj.state; - element.$.submitTypeSelect.bindValue = configInputObj.submit_type; - element.$.contentMergeSelect.bindValue = - configInputObj.use_content_merge; - element.$.newChangeSelect.bindValue = - configInputObj.create_new_change_for_all_not_in_target; - element.$.requireChangeIdSelect.bindValue = - configInputObj.require_change_id; - element.$.enableSignedPush.bindValue = - configInputObj.enable_signed_push; - element.$.requireSignedPush.bindValue = - configInputObj.require_signed_push; - element.$.rejectImplicitMergesSelect.bindValue = - configInputObj.reject_implicit_merges; - element.$.setAllnewChangesPrivateByDefaultSelect.bindValue = - configInputObj.private_by_default; - element.$.matchAuthoredDateWithCommitterDateSelect.bindValue = - configInputObj.match_author_to_committer_date; - const inputElement = PolymerElement ? - element.$.maxGitObjSizeIronInput : element.$.maxGitObjSizeInput; - inputElement.bindValue = configInputObj.max_object_size_limit; - element.$.contributorAgreementSelect.bindValue = - configInputObj.use_contributor_agreements; - element.$.useSignedOffBySelect.bindValue = - configInputObj.use_signed_off_by; - element.$.rejectEmptyCommitSelect.bindValue = - configInputObj.reject_empty_commit; - element.$.unRegisteredCcSelect.bindValue = - configInputObj.enable_reviewer_by_email; + await element._loadRepo(); + assert.isTrue(button.hasAttribute('disabled')); + assert.isFalse(element.$.Title.classList.contains('edited')); + element.$.descriptionInput.bindValue = configInputObj.description; + element.$.stateSelect.bindValue = configInputObj.state; + element.$.submitTypeSelect.bindValue = configInputObj.submit_type; + element.$.contentMergeSelect.bindValue = + configInputObj.use_content_merge; + element.$.newChangeSelect.bindValue = + configInputObj.create_new_change_for_all_not_in_target; + element.$.requireChangeIdSelect.bindValue = + configInputObj.require_change_id; + element.$.enableSignedPush.bindValue = + configInputObj.enable_signed_push; + element.$.requireSignedPush.bindValue = + configInputObj.require_signed_push; + element.$.rejectImplicitMergesSelect.bindValue = + configInputObj.reject_implicit_merges; + element.$.setAllnewChangesPrivateByDefaultSelect.bindValue = + configInputObj.private_by_default; + element.$.matchAuthoredDateWithCommitterDateSelect.bindValue = + configInputObj.match_author_to_committer_date; + const inputElement = PolymerElement ? + element.$.maxGitObjSizeIronInput : element.$.maxGitObjSizeInput; + inputElement.bindValue = configInputObj.max_object_size_limit; + element.$.contributorAgreementSelect.bindValue = + configInputObj.use_contributor_agreements; + element.$.useSignedOffBySelect.bindValue = + configInputObj.use_signed_off_by; + element.$.rejectEmptyCommitSelect.bindValue = + configInputObj.reject_empty_commit; + element.$.unRegisteredCcSelect.bindValue = + configInputObj.enable_reviewer_by_email; - assert.isFalse(button.hasAttribute('disabled')); - assert.isTrue(element.$.configurations.classList.contains('edited')); + assert.isFalse(button.hasAttribute('disabled')); + assert.isTrue(element.$.configurations.classList.contains('edited')); - const formattedObj = - element._formatRepoConfigForSave(element._repoConfig); - assert.deepEqual(formattedObj, configInputObj); + const formattedObj = + element._formatRepoConfigForSave(element._repoConfig); + assert.deepEqual(formattedObj, configInputObj); - return element._handleSaveRepoConfig().then(() => { - assert.isTrue(button.hasAttribute('disabled')); - assert.isFalse(element.$.Title.classList.contains('edited')); - assert.isTrue(saveStub.lastCall.calledWithExactly(REPO, - configInputObj)); - }); - }); + await element._handleSaveRepoConfig(); + assert.isTrue(button.hasAttribute('disabled')); + assert.isFalse(element.$.Title.classList.contains('edited')); + assert.isTrue(saveStub.lastCall.calledWithExactly(REPO, + configInputObj)); }); }); });
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.js b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.js index 38cc772..acf71c3 100644 --- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.js +++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.js
@@ -19,6 +19,7 @@ import './gr-change-list-item.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import {LabelCategory} from './gr-change-list-item.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-change-list-item'); @@ -26,10 +27,8 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getLoggedIn() { return Promise.resolve(false); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); element = basicFixture.instantiate(); });
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.js b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.js index af3acd8..445254a 100644 --- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.js +++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.js
@@ -20,6 +20,7 @@ import {page} from '../../../utils/page-wrapper-utils.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import 'lodash/lodash.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-change-list-view'); @@ -30,14 +31,10 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(false); }, - getChanges(num, query) { - return Promise.resolve([]); - }, - getAccountDetails() { return Promise.resolve({}); }, - getAccountStatus() { return Promise.resolve({}); }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getChanges').returns(Promise.resolve([])); + stubRestApi('getAccountDetails').returns(Promise.resolve({})); + stubRestApi('getAccountStatus').returns(Promise.resolve({})); element = basicFixture.instantiate(); });
diff --git a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.js b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.js index 1f5d519..35d69f6 100644 --- a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.js +++ b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.js
@@ -23,6 +23,7 @@ import {changeIsOpen} from '../../../utils/change-util.js'; import {ChangeStatus} from '../../../constants/constants.js'; import {createAccountWithId} from '../../../test/test-data-generators.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-dashboard-view'); @@ -33,16 +34,14 @@ let getChangesStub; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(false); }, - getAccountDetails() { return Promise.resolve({}); }, - getAccountStatus() { return Promise.resolve(false); }, - }); - element = basicFixture.instantiate(); - - getChangesStub = sinon.stub(element.restApiService, 'getChanges').callsFake( + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getAccountDetails').returns(Promise.resolve({})); + stubRestApi('getAccountStatus').returns(Promise.resolve(false)); + getChangesStub= stubRestApi('getChanges').callsFake( (_, qs) => Promise.resolve(qs.map(() => []))); + element = basicFixture.instantiate(); + let resolver; paramsChangedPromise = new Promise(resolve => { resolver = resolve; @@ -125,15 +124,14 @@ const deleteDraftCommentsPromise = new Promise(resolve => { deleteDraftCommentsPromiseResolver = resolve; }); - sinon.stub(element.restApiService, 'deleteDraftComments') + const deleteStub = stubRestApi('deleteDraftComments') .returns(deleteDraftCommentsPromise); // Open confirmation dialog and tap confirm button. await element.$.confirmDeleteOverlay.open(); MockInteractions.tap(element.$.confirmDeleteDialog.$.confirm); flush(); - assert.isTrue(element.restApiService.deleteDraftComments - .calledWithExactly('-is:open')); + assert.isTrue(deleteStub.calledWithExactly('-is:open')); assert.isTrue(element.$.confirmDeleteDialog.disabled); assert.equal(element._reload.callCount, 0); @@ -255,7 +253,7 @@ suite('_getProjectDashboard', () => { test('dashboard with foreach', () => { - sinon.stub(element.restApiService, 'getDashboard') + stubRestApi('getDashboard') .callsFake( () => Promise.resolve({ title: 'title', foreach: 'foreach for ${project}', @@ -281,7 +279,7 @@ }); test('dashboard without foreach', () => { - sinon.stub(element.restApiService, 'getDashboard').callsFake( + stubRestApi('getDashboard').callsFake( () => Promise.resolve({ title: 'title', sections: [ @@ -309,7 +307,7 @@ {name: 'test2', query: 'test2', hideIfEmpty: true}, ]; getChangesStub.restore(); - sinon.stub(element.restApiService, 'getChanges') + stubRestApi('getChanges') .returns(Promise.resolve([[], ['nonempty']])); return element._fetchDashboardChanges({sections}, false).then(() => { @@ -324,7 +322,7 @@ {name: 'test2', query: 'test2'}, ]; getChangesStub.restore(); - sinon.stub(element.restApiService, 'getChanges') + stubRestApi('getChanges') .returns(Promise.resolve([[], []])); return element._fetchDashboardChanges({sections}, false).then(() => { @@ -375,7 +373,7 @@ test('404 page', done => { const response = {status: 404}; - sinon.stub(element.restApiService, 'getDashboard').callsFake( + stubRestApi('getDashboard').callsFake( async (project, dashboard, errFn) => { errFn(response); }); @@ -390,16 +388,19 @@ }; }); - test('params change triggers dashboardDisplayed()', () => { + test('params change triggers dashboardDisplayed()', async () => { + stubRestApi('getDashboard').returns(Promise.resolve({ + title: 'title', + sections: [], + })); sinon.stub(element.reporting, 'dashboardDisplayed'); element.params = { view: GerritNav.View.DASHBOARD, project: 'project', dashboard: 'dashboard', }; - return paramsChangedPromise.then(() => { - assert.isTrue(element.reporting.dashboardDisplayed.calledOnce); - }); + await paramsChangedPromise; + assert.isTrue(element.reporting.dashboardDisplayed.calledOnce); }); });
diff --git a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header_test.js b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header_test.js index 78560907..4ec799f 100644 --- a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header_test.js +++ b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-user-header.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-user-header'); @@ -28,7 +29,7 @@ }); test('loads and clears account info', done => { - sinon.stub(element.restApiService, 'getAccountDetails') + stubRestApi('getAccountDetails') .returns(Promise.resolve({ name: 'foo', email: 'bar',
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.js b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.js index f7bca82..0641182 100644 --- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.js +++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.js
@@ -27,8 +27,8 @@ createChangeMessages, createRevisions, } from '../../../test/test-data-generators.js'; -import {appContext} from '../../../services/app-context.js'; import {ChangeStatus} from '../../../constants/constants.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-change-actions'); @@ -42,56 +42,50 @@ suite('basic tests', () => { setup(() => { - stub('gr-rest-api-interface', { - getChangeRevisionActions() { + stubRestApi('getChangeRevisionActions').returns(Promise.resolve({ + cherrypick: { + method: 'POST', + label: 'Cherry Pick', + title: 'Cherry pick change to a different branch', + enabled: true, + }, + rebase: { + method: 'POST', + label: 'Rebase', + title: 'Rebase onto tip of branch or parent change', + enabled: true, + }, + submit: { + method: 'POST', + label: 'Submit', + title: 'Submit patch set 2 into master', + enabled: true, + }, + revert_submission: { + method: 'POST', + label: 'Revert submission', + title: 'Revert this submission', + enabled: true, + }, + })); + stubRestApi('send').callsFake((method, url, payload) => { + if (method !== 'POST') { + return Promise.reject(new Error('bad method')); + } + if (url === '/changes/test~42/revisions/2/submit') { return Promise.resolve({ - cherrypick: { - method: 'POST', - label: 'Cherry Pick', - title: 'Cherry pick change to a different branch', - enabled: true, - }, - rebase: { - method: 'POST', - label: 'Rebase', - title: 'Rebase onto tip of branch or parent change', - enabled: true, - }, - submit: { - method: 'POST', - label: 'Submit', - title: 'Submit patch set 2 into master', - enabled: true, - }, - revert_submission: { - method: 'POST', - label: 'Revert submission', - title: 'Revert this submission', - enabled: true, - }, + ok: true, + text() { return Promise.resolve(')]}\'\n{}'); }, }); - }, - send(method, url, payload) { - if (method !== 'POST') { - return Promise.reject(new Error('bad method')); - } - - if (url === '/changes/test~42/revisions/2/submit') { - return Promise.resolve({ - ok: true, - text() { return Promise.resolve(')]}\'\n{}'); }, - }); - } else if (url === '/changes/test~42/revisions/2/rebase') { - return Promise.resolve({ - ok: true, - text() { return Promise.resolve(')]}\'\n{}'); }, - }); - } - - return Promise.reject(new Error('bad url')); - }, - getProjectConfig() { return Promise.resolve({}); }, + } else if (url === '/changes/test~42/revisions/2/rebase') { + return Promise.resolve({ + ok: true, + text() { return Promise.resolve(')]}\'\n{}'); }, + }); + } + return Promise.reject(new Error('bad url')); }); + stubRestApi('getProjectConfig').returns(Promise.resolve({})); sinon.stub(getPluginLoader(), 'awaitPluginsLoaded') .returns(Promise.resolve()); @@ -111,8 +105,7 @@ element.account = { _account_id: 123, }; - sinon.stub(appContext.restApiService, 'getRepoBranches').returns( - Promise.resolve([])); + stubRestApi('getRepoBranches').returns(Promise.resolve([])); return element.reload(); }); @@ -148,14 +141,14 @@ }); test('plugin revision actions', done => { - sinon.stub(element.restApiService, 'getChangeActionURL').returns( + const stub = stubRestApi('getChangeActionURL').returns( Promise.resolve('the-url')); element.revisionActions = { 'plugin~action': {}, }; assert.isOk(element.revisionActions['plugin~action']); flush(() => { - assert.isTrue(element.restApiService.getChangeActionURL.calledWith( + assert.isTrue(stub.calledWith( element.changeNum, element.latestPatchNum, '/plugin~action')); assert.equal(element.revisionActions['plugin~action'].__url, 'the-url'); done(); @@ -163,14 +156,14 @@ }); test('plugin change actions', async () => { - sinon.stub(element.restApiService, 'getChangeActionURL').returns( + const stub = stubRestApi('getChangeActionURL').returns( Promise.resolve('the-url')); element.actions = { 'plugin~action': {}, }; assert.isOk(element.actions['plugin~action']); await flush(); - assert.isTrue(element.restApiService.getChangeActionURL.calledWith( + assert.isTrue(stub.calledWith( element.changeNum, undefined, '/plugin~action')); assert.equal(element.actions['plugin~action'].__url, 'the-url'); }); @@ -278,7 +271,7 @@ test('submit change', () => { const showSpy = sinon.spy(element, '_showActionDialog'); - sinon.stub(element.restApiService, 'getFromProjectLookup') + stubRestApi('getFromProjectLookup') .returns(Promise.resolve('test')); sinon.stub(element.$.overlay, 'open').returns(Promise.resolve()); element.change = { @@ -300,7 +293,7 @@ test('submit change, tap on icon', done => { sinon.stub(element.$.confirmSubmitDialog, 'resetFocus').callsFake( done); - sinon.stub(element.restApiService, 'getFromProjectLookup') + stubRestApi('getFromProjectLookup') .returns(Promise.resolve('test')); sinon.stub(element.$.overlay, 'open').returns(Promise.resolve()); element.change = { @@ -404,7 +397,7 @@ test('rebase change fires reload event', done => { const eventStub = sinon.stub(element, 'dispatchEvent'); - sinon.stub(element.restApiService, 'getResponseObject').returns( + stubRestApi('getResponseObject').returns( Promise.resolve({})); element._handleResponse({__key: 'rebase'}, {}); flush(() => { @@ -443,7 +436,7 @@ MockInteractions.tap(rebaseButton); await flush(); assert.isFalse(element.$.confirmRebase.hidden); - sinon.stub(element.restApiService, 'getChanges') + stubRestApi('getChanges') .returns(Promise.resolve([])); element._handleCherrypickTap(); await flush(); @@ -475,7 +468,7 @@ const labels = {'Foo': 1, 'Bar-Baz': -2}; const changeId = 1234; sinon.stub(element.$.jsAPI, 'getLabelValuesPostRevert').returns(labels); - const saveStub = sinon.stub(element.restApiService, 'saveChangeReview') + const saveStub = stubRestApi('saveChangeReview') .returns(Promise.resolve()); return element._setLabelValuesOnRevert(changeId).then(() => { assert.isTrue(saveStub.calledOnce); @@ -750,7 +743,7 @@ }, ]; setup(done => { - sinon.stub(element.restApiService, 'getChanges') + stubRestApi('getChanges') .returns(Promise.resolve(changes)); element._handleCherrypickTap(); flush(() => { @@ -996,7 +989,7 @@ element.change = { current_revision: 'abc1234', }; - sinon.stub(element.restApiService, 'getChanges') + stubRestApi('getChanges') .returns(Promise.resolve([ {change_id: '12345678901234', topic: 'T', subject: 'random'}, {change_id: '23456', topic: 'T', subject: 'a'.repeat(100)}, @@ -1021,7 +1014,7 @@ submission_id: '199 0', current_revision: '2000', }; - getChangesStub = sinon.stub(element.restApiService, 'getChanges') + getChangesStub = stubRestApi('getChanges') .returns(Promise.resolve([ {change_id: '12345678901234', topic: 'T', subject: 'random'}, {change_id: '23456', topic: 'T', subject: 'a'.repeat(100)}, @@ -1131,7 +1124,7 @@ submission_id: '199', current_revision: '2000', }; - sinon.stub(element.restApiService, 'getChanges') + stubRestApi('getChanges') .returns(Promise.resolve([ {change_id: '12345678901234', topic: 'T', subject: 'random'}, ])); @@ -1875,7 +1868,7 @@ }; test('succeed', () => { - sinon.stub(element.restApiService, 'getChange') + stubRestApi('getChange') .callsFake( makeGetChange(5)); return element._waitForChangeReachable(123).then(success => { assert.isTrue(success); @@ -1883,7 +1876,7 @@ }); test('fail', () => { - sinon.stub(element.restApiService, 'getChange') + stubRestApi('getChange') .callsFake( makeGetChange(6)); return element._waitForChangeReachable(123).then(success => { assert.isFalse(success); @@ -1920,16 +1913,16 @@ suite('happy path', () => { let sendStub; setup(() => { - sinon.stub(element.restApiService, 'getChangeDetail') + stubRestApi('getChangeDetail') .returns(Promise.resolve({ ...createChange(), // element has latest info revisions: createRevisions(element.latestPatchNum), messages: createChangeMessages(1), })); - sendStub = sinon.stub(element.restApiService, 'executeChangeAction') + sendStub = stubRestApi('executeChangeAction') .returns(Promise.resolve({})); - getResponseObjectStub = sinon.stub(element.restApiService, + getResponseObjectStub = stubRestApi( 'getResponseObject'); sinon.stub(GerritNav, 'navigateToChange').returns(Promise.resolve(true)); @@ -1947,7 +1940,7 @@ setup(() => { element.change.submission_id = '199'; element.change.current_revision = '2000'; - sinon.stub(element.restApiService, 'getChanges') + stubRestApi('getChanges') .returns(Promise.resolve([ {change_id: '12345678901234', topic: 'T', subject: 'random'}, {change_id: '23456', topic: 'T', subject: 'a'.repeat(100)}, @@ -2039,14 +2032,14 @@ suite('failure modes', () => { test('non-latest', () => { - sinon.stub(element.restApiService, 'getChangeDetail') + stubRestApi('getChangeDetail') .returns(Promise.resolve({ ...createChange(), // new patchset was uploaded revisions: createRevisions(element.latestPatchNum + 1), messages: createChangeMessages(1), })); - const sendStub = sinon.stub(element.restApiService, + const sendStub = stubRestApi( 'executeChangeAction'); return element._send('DELETE', payload, '/endpoint', true, cleanup) @@ -2059,14 +2052,14 @@ }); test('send fails', () => { - sinon.stub(element.restApiService, 'getChangeDetail') + stubRestApi('getChangeDetail') .returns(Promise.resolve({ ...createChange(), // element has latest info revisions: createRevisions(element.latestPatchNum), messages: createChangeMessages(1), })); - const sendStub = sinon.stub(element.restApiService, + const sendStub = stubRestApi( 'executeChangeAction').callsFake( (num, method, patchNum, endpoint, payload, onErr) => { onErr(); @@ -2107,15 +2100,10 @@ let changeRevisionActions; setup(() => { - stub('gr-rest-api-interface', { - getChangeRevisionActions() { - return Promise.resolve(changeRevisionActions); - }, - send(method, url, payload) { - return Promise.reject(new Error('error')); - }, - getProjectConfig() { return Promise.resolve({}); }, - }); + stubRestApi('getChangeRevisionActions').returns( + Promise.resolve(changeRevisionActions)); + stubRestApi('send').returns(Promise.reject(new Error('error'))); + stubRestApi('getProjectConfig').returns(Promise.resolve({})); sinon.stub(getPluginLoader(), 'awaitPluginsLoaded') .returns(Promise.resolve()); @@ -2127,8 +2115,7 @@ element.changeNum = '42'; element.latestPatchNum = '2'; - sinon.stub(appContext.restApiService, 'getRepoBranches').returns( - Promise.resolve([])); + stubRestApi('getRepoBranches').returns(Promise.resolve([])); return element.reload(); });
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.js b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.js index e812657..e71c086 100644 --- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.js +++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.js
@@ -21,6 +21,7 @@ import {resetPlugins} from '../../../test/test-utils.js'; import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js'; import {_testOnly_initGerritPluginApi} from '../../shared/gr-js-api-interface/gr-gerrit.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const testHtmlPlugin = document.createElement('dom-module'); testHtmlPlugin.innerHTML = ` @@ -86,11 +87,9 @@ } setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getLoggedIn() { return Promise.resolve(false); }, - deleteVote() { return Promise.resolve({ok: true}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('deleteVote').returns(Promise.resolve({ok: true})); }); teardown(() => {
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts index ab7d09b..6a16040 100644 --- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts +++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
@@ -64,6 +64,7 @@ import {GrEditableLabel} from '../../shared/gr-editable-label/gr-editable-label'; import {PluginApi} from '../../plugins/gr-plugin-types'; import {GrEndpointDecorator} from '../../plugins/gr-endpoint-decorator/gr-endpoint-decorator'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-change-metadata'); @@ -73,21 +74,16 @@ let element: GrChangeMetadata; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { - return Promise.resolve({ - ...createServerInfo(), - user: { - ...createUserConfig(), - anonymous_coward_name: 'test coward name', - }, - }); - }, - getLoggedIn() { - return Promise.resolve(false); - }, - }); - + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getConfig').returns( + Promise.resolve({ + ...createServerInfo(), + user: { + ...createUserConfig(), + anonymous_coward_name: 'test coward name', + }, + }) + ); element = basicFixture.instantiate(); }); @@ -803,8 +799,8 @@ let setStub: SinonStubbedMember<RestApiService['setAssignee']>; setup(() => { - deleteStub = sinon.stub(element.restApiService, 'deleteAssignee'); - setStub = sinon.stub(element.restApiService, 'setAssignee'); + deleteStub = stubRestApi('deleteAssignee'); + setStub = stubRestApi('setAssignee'); element.serverConfig = { ...createServerInfo(), change: { @@ -850,9 +846,9 @@ test('changing topic', () => { const newTopic = 'the new topic' as TopicName; - const setChangeTopicStub = sinon - .stub(element.restApiService, 'setChangeTopic') - .returns(Promise.resolve(newTopic)); + const setChangeTopicStub = stubRestApi('setChangeTopic').returns( + Promise.resolve(newTopic) + ); element._handleTopicChanged(new CustomEvent('test', {detail: newTopic})); const topicChangedSpy = sinon.spy(); element.addEventListener('topic-changed', topicChangedSpy); @@ -867,9 +863,9 @@ test('topic removal', () => { const newTopic = 'the new topic' as TopicName; - const setChangeTopicStub = sinon - .stub(element.restApiService, 'setChangeTopic') - .returns(Promise.resolve(newTopic)); + const setChangeTopicStub = stubRestApi('setChangeTopic').returns( + Promise.resolve(newTopic) + ); const chip = element.shadowRoot!.querySelector('gr-linked-chip'); const remove = chip!.$.remove; const topicChangedSpy = sinon.spy(); @@ -888,9 +884,9 @@ flush(); element._newHashtag = 'new hashtag' as Hashtag; const newHashtag: Hashtag[] = ['new hashtag' as Hashtag]; - const setChangeHashtagStub = sinon - .stub(element.restApiService, 'setChangeHashtag') - .returns(Promise.resolve(newHashtag)); + const setChangeHashtagStub = stubRestApi('setChangeHashtag').returns( + Promise.resolve(newHashtag) + ); element._handleHashtagChanged(); assert.isTrue( setChangeHashtagStub.calledWith(42 as NumericChangeId, {
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts index 5cb84b4..0fc470f 100644 --- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts +++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
@@ -36,7 +36,10 @@ import {EventType, PluginApi} from '../../plugins/gr-plugin-types'; import 'lodash/lodash'; -import {TestKeyboardShortcutBinder} from '../../../test/test-utils'; +import { + stubRestApi, + TestKeyboardShortcutBinder, +} from '../../../test/test-utils'; import {SPECIAL_PATCH_SET_NUM} from '../../../utils/patch-set-util'; import {Shortcut} from '../../../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin'; import { @@ -72,7 +75,6 @@ GitRef, NumericChangeId, ParentPatchSetNum, - ParsedJSON, PatchRange, PatchSetNum, RevisionInfo, @@ -366,29 +368,19 @@ _testOnly_resetEndpoints(); navigateToChangeStub = sinon.stub(GerritNav, 'navigateToChange'); - function getCommentsStub() { - return Promise.resolve({}); - } - stub('gr-rest-api-interface', { - getConfig() { - return Promise.resolve({ - ...createServerInfo(), - user: { - ...createUserConfig(), - anonymous_coward_name: 'test coward name', - }, - }); - }, - getAccount() { - return Promise.resolve(undefined); - }, - getDiffComments: (getCommentsStub as unknown) as RestApiService['getDiffComments'], - getDiffRobotComments: (getCommentsStub as unknown) as RestApiService['getDiffRobotComments'], - getDiffDrafts: (getCommentsStub as unknown) as RestApiService['getDiffDrafts'], - _fetchSharedCacheURL() { - return Promise.resolve({} as ParsedJSON); - }, - }); + stubRestApi('getConfig').returns( + Promise.resolve({ + ...createServerInfo(), + user: { + ...createUserConfig(), + anonymous_coward_name: 'test coward name', + }, + }) + ); + stubRestApi('getAccount').returns(Promise.resolve(undefined)); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); element = fixture.instantiate(); element._changeNum = 1 as NumericChangeId; sinon.stub(element.$.actions, 'reload').returns(Promise.resolve()); @@ -705,7 +697,7 @@ messages: createChangeMessages(1), }; element._change.labels = {}; - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), // element has latest info @@ -1420,15 +1412,17 @@ }); test('change num change', () => { + const change = { + ...createChange(), + labels: {}, + } as ParsedChangeInfo; + stubRestApi('getChangeDetail').returns(Promise.resolve(change)); element._changeNum = undefined; element._patchRange = { basePatchNum: ParentPatchSetNum, patchNum: 2 as PatchSetNum, }; - element._change = { - ...createChange(), - labels: {}, - }; + element._change = change; element.viewState.changeNum = null; element.viewState.diffMode = DiffViewMode.UNIFIED; assert.equal(element.viewState.numFilesShown, 200); @@ -1474,9 +1468,7 @@ }); test('diffMode defaults to side by side without preferences', done => { - sinon - .stub(element.restApiService, 'getPreferences') - .returns(Promise.resolve(createPreferences())); + stubRestApi('getPreferences').returns(Promise.resolve(createPreferences())); // No user prefs or diff view mode set. element._setDiffViewMode()!.then(() => { @@ -1486,7 +1478,7 @@ }); test('diffMode defaults to preference when not already set', done => { - sinon.stub(element.restApiService, 'getPreferences').returns( + stubRestApi('getPreferences').returns( Promise.resolve({ ...createPreferences(), default_diff_view: DiffViewMode.UNIFIED, @@ -1501,7 +1493,7 @@ test('existing diffMode overrides preference', done => { element.viewState.diffMode = DiffViewMode.SIDE_BY_SIDE; - sinon.stub(element.restApiService, 'getPreferences').returns( + stubRestApi('getPreferences').returns( Promise.resolve({ ...createPreferences(), default_diff_view: DiffViewMode.UNIFIED, @@ -1647,9 +1639,9 @@ test('_handleCommitMessageSave trims trailing whitespace', () => { element._change = createChange(); // Response code is 500, because we want to avoid window reloading - const putStub = sinon - .stub(element.restApiService, 'putChangeCommitMessage') - .returns(Promise.resolve(new Response(null, {status: 500}))); + const putStub = stubRestApi('putChangeCommitMessage').returns( + Promise.resolve(new Response(null, {status: 500})) + ); const mockEvent = (content: string) => { return new CustomEvent('', {detail: {content}}); @@ -1765,7 +1757,7 @@ test('topic is coalesced to null', done => { sinon.stub(element, '_changeChanged'); - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').returns( Promise.resolve({ ...createChange(), labels: {}, @@ -1782,7 +1774,7 @@ test('commit sha is populated from getChangeDetail', done => { sinon.stub(element, '_changeChanged'); - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), labels: {}, @@ -1800,7 +1792,7 @@ test('edit is added to change', () => { sinon.stub(element, '_changeChanged'); const changeRevision = createRevision(); - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), labels: {}, @@ -1957,9 +1949,7 @@ }); test('revert dialog opened with revert param', done => { - sinon - .stub(element.restApiService, 'getLoggedIn') - .callsFake(() => Promise.resolve(true)); + stubRestApi('getLoggedIn').returns(Promise.resolve(true)); const awaitPluginsLoadedStub = sinon .stub(getPluginLoader(), 'awaitPluginsLoaded') .callsFake(() => Promise.resolve()); @@ -2035,7 +2025,7 @@ messages: createChangeMessages(1), }; element._change.labels = {}; - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), // element has latest info @@ -2127,7 +2117,7 @@ messages: createChangeMessages(1), }; element._change.labels = {}; - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), // new patchset was uploaded @@ -2306,17 +2296,15 @@ }); test('_startUpdateCheckTimer negative delay', () => { - const getChangeDetailStub = sinon - .stub(element.restApiService, 'getChangeDetail') - .callsFake(() => - Promise.resolve({ - ...createChange(), - // element has latest info - revisions: {rev1: createRevision()}, - messages: createChangeMessages(1), - current_revision: 'rev1' as CommitId, - }) - ); + const getChangeDetailStub = stubRestApi('getChangeDetail').returns( + Promise.resolve({ + ...createChange(), + // element has latest info + revisions: {rev1: createRevision()}, + messages: createChangeMessages(1), + current_revision: 'rev1' as CommitId, + }) + ); element._serverConfig = { ...createServerInfo(), @@ -2328,9 +2316,8 @@ }); test('_startUpdateCheckTimer up-to-date', async () => { - const getChangeDetailStub = sinon - .stub(element.restApiService, 'getChangeDetail') - .callsFake(() => + const getChangeDetailStub = stubRestApi('getChangeDetail').callsFake( + () => Promise.resolve({ ...createChange(), // element has latest info @@ -2338,7 +2325,7 @@ messages: createChangeMessages(1), current_revision: 'rev1' as CommitId, }) - ); + ); element._serverConfig = { ...createServerInfo(), @@ -2352,7 +2339,7 @@ }); test('_startUpdateCheckTimer out-of-date shows an alert', done => { - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), // new patchset was uploaded @@ -2375,7 +2362,7 @@ }); test('_startUpdateCheckTimer respects _loading', async () => { - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), // new patchset was uploaded @@ -2397,7 +2384,7 @@ }); test('_startUpdateCheckTimer new status shows an alert', done => { - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), // element has latest info @@ -2419,7 +2406,7 @@ }); test('_startUpdateCheckTimer new messages shows an alert', done => { - sinon.stub(element.restApiService, 'getChangeDetail').callsFake(() => + stubRestApi('getChangeDetail').callsFake(() => Promise.resolve({ ...createChange(), revisions: {rev1: createRevision()}, @@ -2661,7 +2648,7 @@ test('_selectedRevision updates when patchNum is changed', () => { const revision1: RevisionInfo = createRevision(1); const revision2: RevisionInfo = createRevision(2); - sinon.stub(element.restApiService, 'getChangeDetail').returns( + stubRestApi('getChangeDetail').returns( Promise.resolve({ ...createChange(), revisions: { @@ -2690,7 +2677,7 @@ const revision1 = createRevision(1); const revision2 = createRevision(2); const revision3 = createEditRevision(); - sinon.stub(element.restApiService, 'getChangeDetail').returns( + stubRestApi('getChangeDetail').returns( Promise.resolve({ ...createChange(), revisions: { @@ -2839,9 +2826,9 @@ let getMergeableStub: SinonStubbedMember<RestApiService['getMergeable']>; setup(() => { element._change = {...createChange(), labels: {}}; - getMergeableStub = sinon - .stub(element.restApiService, 'getMergeable') - .returns(Promise.resolve({...createMergeable(), mergeable: true})); + getMergeableStub = stubRestApi('getMergeable').returns( + Promise.resolve({...createMergeable(), mergeable: true}) + ); }); test('merged change', () => { @@ -2874,16 +2861,14 @@ test('_paramsChanged sets in projectLookup', () => { sinon.stub(element.$.relatedChanges, 'reload'); sinon.stub(element, '_reload').returns(Promise.resolve([])); - const setStub = sinon.stub(element.restApiService, 'setInProjectLookup'); + const setStub = stubRestApi('setInProjectLookup'); element._paramsChanged({ view: GerritNav.View.CHANGE, changeNum: 101 as NumericChangeId, project: TEST_PROJECT_NAME, }); assert.isTrue(setStub.calledOnce); - assert.isTrue( - setStub.calledWith(101 as NumericChangeId, TEST_PROJECT_NAME) - ); + assert.isTrue(setStub.calledWith(101 as never, TEST_PROJECT_NAME as never)); }); test('_handleToggleStar called when star is tapped', () => { @@ -2911,9 +2896,12 @@ sinon.stub(element, '_reloadComments').returns(Promise.resolve()); sinon.stub(element, '_getMergeability').returns(Promise.resolve()); sinon.stub(element, '_getLatestCommitMessage').returns(Promise.resolve()); + sinon + .stub(element, '_reloadPatchNumDependentResources') + .returns(Promise.resolve([undefined, undefined])); }); - test("don't report changedDisplayed on reply", done => { + test("don't report changeDisplayed on reply", done => { const changeDisplayStub = sinon.stub( element.reporting, 'changeDisplayed' @@ -2930,7 +2918,7 @@ }); }); - test('report changedDisplayed on _paramsChanged', done => { + test('report changeDisplayed on _paramsChanged', done => { const changeDisplayStub = sinon.stub( element.reporting, 'changeDisplayed'
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.js b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.js index 5564fcf..e4ed533 100644 --- a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.js +++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-confirm-cherrypick-dialog.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-confirm-cherrypick-dialog'); @@ -28,20 +29,18 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getRepoBranches(input) { - if (input.startsWith('test')) { - return Promise.resolve([ - { - ref: 'refs/heads/test-branch', - revision: '67ebf73496383c6777035e374d2d664009e2aa5c', - can_delete: true, - }, - ]); - } else { - return Promise.resolve({}); - } - }, + stubRestApi('getRepoBranches').callsFake(input => { + if (input.startsWith('test')) { + return Promise.resolve([ + { + ref: 'refs/heads/test-branch', + revision: '67ebf73496383c6777035e374d2d664009e2aa5c', + can_delete: true, + }, + ]); + } else { + return Promise.resolve({}); + } }); element = basicFixture.instantiate(); element.project = 'test-project'; @@ -116,7 +115,7 @@ test('cherry pick topic submit', done => { element.branch = 'master'; - const executeChangeActionStub = sinon.stub(element.restApiService, + const executeChangeActionStub = stubRestApi( 'executeChangeAction').returns(Promise.resolve([])); MockInteractions.tap(element.shadowRoot. querySelector('gr-dialog').$.confirm); @@ -134,7 +133,7 @@ test('deselecting a change removes it from being cherry picked', () => { element.branch = 'master'; - const executeChangeActionStub = sinon.stub(element.restApiService, + const executeChangeActionStub = stubRestApi( 'executeChangeAction').returns(Promise.resolve([])); const checkboxes = element.shadowRoot.querySelectorAll( 'input[type="checkbox"]'); @@ -149,7 +148,7 @@ test('deselecting all change shows error message', () => { element.branch = 'master'; - const executeChangeActionStub = sinon.stub(element.restApiService, + const executeChangeActionStub = stubRestApi( 'executeChangeAction').returns(Promise.resolve([])); const checkboxes = element.shadowRoot.querySelectorAll( 'input[type="checkbox"]');
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.js b/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.js index 43bde75..db00f6b 100644 --- a/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.js +++ b/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-confirm-move-dialog.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-confirm-move-dialog'); @@ -24,20 +25,18 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getRepoBranches(input) { - if (input.startsWith('test')) { - return Promise.resolve([ - { - ref: 'refs/heads/test-branch', - revision: '67ebf73496383c6777035e374d2d664009e2aa5c', - can_delete: true, - }, - ]); - } else { - return Promise.resolve(undefined); - } - }, + stubRestApi('getRepoBranches').callsFake(input => { + if (input.startsWith('test')) { + return Promise.resolve([ + { + ref: 'refs/heads/test-branch', + revision: '67ebf73496383c6777035e374d2d664009e2aa5c', + can_delete: true, + }, + ]); + } else { + return Promise.resolve(undefined); + } }); element = basicFixture.instantiate(); element.project = 'test-project';
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.js b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.js index 8b3b73a..0faf604 100644 --- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.js +++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-confirm-rebase-dialog.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-confirm-rebase-dialog'); @@ -102,6 +103,7 @@ suite('parent suggestions', () => { let recentChanges; + let getChangesStub; setup(() => { recentChanges = [ { @@ -118,7 +120,7 @@ }, ]; - sinon.stub(element.restApiService, 'getChanges').returns(Promise.resolve( + getChangesStub = stubRestApi('getChanges').returns(Promise.resolve( [ { _number: 123, @@ -141,29 +143,26 @@ return element._getRecentChanges() .then(() => { assert.deepEqual(element._recentChanges, recentChanges); - assert.equal(element.restApiService.getChanges.callCount, 1); + assert.equal(getChangesStub.callCount, 1); // When called a second time, should not re-request recent changes. element._getRecentChanges(); }) .then(() => { assert.equal(element._getRecentChanges.callCount, 2); - assert.equal(element.restApiService.getChanges.callCount, 1); + assert.equal(getChangesStub.callCount, 1); }); }); test('_filterChanges', () => { assert.equal(element._filterChanges('123', recentChanges).length, 1); assert.equal(element._filterChanges('12', recentChanges).length, 2); - assert.equal(element._filterChanges('awesome', recentChanges).length, - 3); - assert.equal(element._filterChanges('third', recentChanges).length, - 1); + assert.equal(element._filterChanges('awesome', recentChanges).length, 3); + assert.equal(element._filterChanges('third', recentChanges).length, 1); element.changeNumber = 123; assert.equal(element._filterChanges('123', recentChanges).length, 0); assert.equal(element._filterChanges('124', recentChanges).length, 1); - assert.equal(element._filterChanges('awesome', recentChanges).length, - 2); + assert.equal(element._filterChanges('awesome', recentChanges).length, 2); }); test('input text change triggers function', () => {
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.js b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.js index b8670c0..f877527 100644 --- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.js +++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.js
@@ -21,6 +21,7 @@ import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import 'lodash/lodash.js'; import {createRevisions} from '../../../test/test-data-generators.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-file-list-header'); @@ -28,11 +29,8 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({test: 'config'}); }, - getAccount() { return Promise.resolve(null); }, - _fetchSharedCacheURL() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({test: 'config'})); + stubRestApi('getAccount').returns(Promise.resolve(null)); element = basicFixture.instantiate(); }); @@ -86,7 +84,7 @@ }); test('description editing', () => { - const putDescStub = sinon.stub(element.restApiService, 'setDescription') + const putDescStub = stubRestApi('setDescription') .returns(Promise.resolve({ok: true})); element.changeNum = '42';
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js index d0ae833..77855df 100644 --- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js +++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js
@@ -26,7 +26,7 @@ import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import {runA11yAudit} from '../../../test/a11y-test-utils.js'; import {html} from '@polymer/polymer/lib/utils/html-tag.js'; -import {TestKeyboardShortcutBinder} from '../../../test/test-utils.js'; +import {TestKeyboardShortcutBinder, stubRestApi, spyRestApi} from '../../../test/test-utils.js'; import {Shortcut} from '../../../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin.js'; import {createCommentThreads} from '../../../utils/comment-util.js'; import {createChangeComments} from '../../../test/test-data-generators.js'; @@ -80,15 +80,12 @@ suite('basic tests', () => { setup(done => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - getPreferences() { return Promise.resolve({}); }, - getDiffPreferences() { return Promise.resolve({}); }, - getDiffComments() { return Promise.resolve({}); }, - getDiffRobotComments() { return Promise.resolve({}); }, - getDiffDrafts() { return Promise.resolve({}); }, - getAccountCapabilities() { return Promise.resolve({}); }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(true)); + stubRestApi('getPreferences').returns(Promise.resolve({})); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); + stubRestApi('getAccountCapabilities').returns(Promise.resolve({})); stub('gr-date-formatter', { _loadTimeFormat() { return Promise.resolve(''); }, }); @@ -1419,13 +1416,10 @@ } setup(done => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - getPreferences() { return Promise.resolve({}); }, - getDiffComments() { return Promise.resolve({}); }, - getDiffRobotComments() { return Promise.resolve({}); }, - getDiffDrafts() { return Promise.resolve({}); }, - }); + stubRestApi('getPreferences').returns(Promise.resolve({})); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); stub('gr-date-formatter', { _loadTimeFormat() { return Promise.resolve(''); }, }); @@ -1674,7 +1668,7 @@ }); test('_getReviewedFiles does not call API', () => { - const apiSpy = sinon.spy(element.restApiService, 'getReviewedFiles'); + const apiSpy = spyRestApi('getReviewedFiles'); element.editMode = true; return element._getReviewedFiles().then(files => { assert.equal(files.length, 0);
diff --git a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores_test.js b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores_test.js index ae639e1..5135e439 100644 --- a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores_test.js +++ b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-label-scores.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-label-scores'); @@ -24,9 +25,7 @@ let element; setup(done => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(false); }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); element = basicFixture.instantiate(); element.change = { _number: '123',
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message_test.js b/polygerrit-ui/app/elements/change/gr-message/gr-message_test.js index facde01..e2c7e86 100644 --- a/polygerrit-ui/app/elements/change/gr-message/gr-message_test.js +++ b/polygerrit-ui/app/elements/change/gr-message/gr-message_test.js
@@ -19,6 +19,7 @@ import './gr-message.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import {createChange, createRevisions} from '../../../test/test-data-generators.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-message'); @@ -27,13 +28,11 @@ suite('when admin and logged in', () => { setup(done => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - getPreferences() { return Promise.resolve({}); }, - getConfig() { return Promise.resolve({}); }, - getIsAdmin() { return Promise.resolve(true); }, - deleteChangeCommitMessage() { return Promise.resolve({}); }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(true)); + stubRestApi('getPreferences').returns(Promise.resolve({})); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getIsAdmin').returns(Promise.resolve(true)); + stubRestApi('deleteChangeCommitMessage').returns(Promise.resolve({})); element = basicFixture.instantiate(); flush(done); }); @@ -415,13 +414,11 @@ suite('when not logged in', () => { setup(done => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(false); }, - getPreferences() { return Promise.resolve({}); }, - getConfig() { return Promise.resolve({}); }, - getIsAdmin() { return Promise.resolve(false); }, - deleteChangeCommitMessage() { return Promise.resolve({}); }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getPreferences').returns(Promise.resolve({})); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getIsAdmin').returns(Promise.resolve(false)); + stubRestApi('deleteChangeCommitMessage').returns(Promise.resolve({})); element = basicFixture.instantiate(); flush(done); }); @@ -510,15 +507,13 @@ }); suite('when logged in but not admin', () => { - setup(done => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - getConfig() { return Promise.resolve({}); }, - getIsAdmin() { return Promise.resolve(false); }, - deleteChangeCommitMessage() { return Promise.resolve({}); }, - }); + setup(async () => { + stubRestApi('getLoggedIn').returns(Promise.resolve(true)); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getIsAdmin').returns(Promise.resolve(false)); + stubRestApi('deleteChangeCommitMessage').returns(Promise.resolve({})); element = basicFixture.instantiate(); - flush(done); + await flush(); }); test('can see reply but not delete button', () => {
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.js b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.js index c27f9fd..d22c7d0 100644 --- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.js +++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.js
@@ -22,6 +22,7 @@ import {TEST_ONLY} from './gr-messages-list.js'; import {MessageTag} from '../../../constants/constants.js'; import {html} from '@polymer/polymer/lib/utils/html-tag.js'; +import {stubRestApi} from '../../../test/test-utils.js'; createCommentApiMockWithTemplateElement( 'gr-messages-list-comment-mock-api', html` @@ -132,13 +133,11 @@ suite('basic tests', () => { setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getLoggedIn() { return Promise.resolve(false); }, - getDiffComments() { return Promise.resolve(comments); }, - getDiffRobotComments() { return Promise.resolve({}); }, - getDiffDrafts() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getDiffComments').returns(Promise.resolve(comments)); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); messages = generateRandomMessages(3); // Element must be wrapped in an element with direct access to the @@ -441,13 +440,11 @@ let commentApiWrapper; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getLoggedIn() { return Promise.resolve(false); }, - getDiffComments() { return Promise.resolve({}); }, - getDiffRobotComments() { return Promise.resolve({}); }, - getDiffDrafts() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); messages = [ randomMessage(),
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.js b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.js index e71df971..f54b819 100644 --- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.js +++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.js
@@ -21,6 +21,7 @@ import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js'; import {_testOnly_initGerritPluginApi} from '../../shared/gr-js-api-interface/gr-gerrit.js'; import {resetPlugins} from '../../../test/test-utils.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const pluginApi = _testOnly_initGerritPluginApi(); @@ -237,14 +238,10 @@ }; element.mergeable = true; element.addEventListener('new-section-loaded', loadedStub); - sinon.stub(element.restApiService, 'getRelatedChanges') - .returns(Promise.resolve({changes: []})); - sinon.stub(element.restApiService, 'getChangesSubmittedTogether') - .returns(Promise.resolve()); - sinon.stub(element.restApiService, 'getChangeCherryPicks') - .returns(Promise.resolve()); - sinon.stub(element.restApiService, 'getChangeConflicts') - .returns(Promise.resolve()); + stubRestApi('getRelatedChanges').returns(Promise.resolve({changes: []})); + stubRestApi('getChangesSubmittedTogether').returns(Promise.resolve()); + stubRestApi('getChangeCherryPicks').returns(Promise.resolve()); + stubRestApi('getChangeConflicts').returns(Promise.resolve()); return element.reload().then(() => { assert.equal(loadedStub.callCount, 4); @@ -257,14 +254,10 @@ setup(() => { element = basicFixture.instantiate(); - sinon.stub(element.restApiService, 'getRelatedChanges') - .returns(Promise.resolve({changes: []})); - sinon.stub(element.restApiService, 'getChangesSubmittedTogether') - .returns(Promise.resolve()); - sinon.stub(element.restApiService, 'getChangeCherryPicks') - .returns(Promise.resolve()); - sinon.stub(element.restApiService, 'getChangeConflicts') - .returns(Promise.resolve()); + stubRestApi('getRelatedChanges').returns(Promise.resolve({changes: []})); + stubRestApi('getChangesSubmittedTogether').returns(Promise.resolve()); + stubRestApi('getChangeCherryPicks').returns(Promise.resolve()); + stubRestApi('getChangeConflicts').returns(Promise.resolve()); }); test('_conflicts are an empty array', () => { @@ -286,14 +279,11 @@ setup(() => { element = basicFixture.instantiate(); - sinon.stub(element.restApiService, 'getRelatedChanges') - .returns(Promise.resolve({changes: []})); - sinon.stub(element.restApiService, 'getChangesSubmittedTogether') - .returns(Promise.resolve()); - sinon.stub(element.restApiService, 'getChangeCherryPicks') - .returns(Promise.resolve()); - conflictsStub = sinon.stub(element.restApiService, 'getChangeConflicts') - .returns(Promise.resolve()); + stubRestApi('getRelatedChanges').returns(Promise.resolve({changes: []})); + stubRestApi('getChangesSubmittedTogether').returns(Promise.resolve()); + stubRestApi('getChangeCherryPicks').returns(Promise.resolve()); + conflictsStub = stubRestApi('getChangeConflicts').returns( + Promise.resolve()); }); test('request conflicts if open and mergeable', () => {
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog-it_test.js b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog-it_test.js index 8a4b1f6..b09510ba 100644 --- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog-it_test.js +++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog-it_test.js
@@ -21,6 +21,8 @@ import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js'; import {_testOnly_initGerritPluginApi} from '../../shared/gr-js-api-interface/gr-gerrit.js'; +import {stubRestApi} from '../../../test/test-utils.js'; + const basicFixture = fixtureFromElement('gr-reply-dialog'); const pluginApi = _testOnly_initGerritPluginApi(); @@ -73,10 +75,8 @@ changeNum = 42; patchNum = 1; - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getAccount() { return Promise.resolve({_account_id: 42}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getAccount').returns(Promise.resolve({_account_id: 42})); element = basicFixture.instantiate(); setupElement(element);
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.js b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.js index 09f8636..7b045a7 100644 --- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.js +++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.js
@@ -22,6 +22,8 @@ import {SpecialFilePath} from '../../../constants/constants.js'; import {appContext} from '../../../services/app-context.js'; import {addListenerForTest} from '../../../test/test-utils.js'; +import {stubRestApi} from '../../../test/test-utils.js'; +import {JSON_PREFIX} from '../../shared/gr-rest-api-interface/gr-rest-api-interface.js'; const basicFixture = fixtureFromElement('gr-reply-dialog'); @@ -61,12 +63,10 @@ changeNum = 42; patchNum = 1; - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getAccount() { return Promise.resolve({}); }, - getChange() { return Promise.resolve({}); }, - getChangeSuggestedReviewers() { return Promise.resolve([]); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getAccount').returns(Promise.resolve({})); + stubRestApi('getChange').returns(Promise.resolve({})); + stubRestApi('getChangeSuggestedReviewers').returns(Promise.resolve([])); sinon.stub(appContext.flagsService, 'isEnabled').returns(true); @@ -131,8 +131,7 @@ .callsFake(review => new Promise((resolve, reject) => { try { const result = jsonResponseProducer(review) || {}; - const resultStr = - element.restApiService.JSON_PREFIX + JSON.stringify(result); + const resultStr = JSON_PREFIX + JSON.stringify(result); resolve({ ok: true, text() { @@ -780,10 +779,15 @@ }); test('400 converts to human-readable server-error', done => { - sinon.stub(window, 'fetch').callsFake(() => { - const text = '....{"reviewers":{"id1":{"error":"human readable"}}}'; - return Promise.resolve(cloneableResponse(400, text)); - }); + stubRestApi('saveChangeReview').callsFake( + (changeNum, patchNum, review, errFn) => { + errFn(cloneableResponse( + 400, + '....{"reviewers":{"id1":{"error":"human readable"}}}' + )); + return Promise.resolve(undefined); + } + ); const listener = event => { if (event.target !== document) return; @@ -799,10 +803,12 @@ }); test('non-json 400 is treated as a normal server-error', done => { - sinon.stub(window, 'fetch').callsFake(() => { - const text = 'Comment validation error!'; - return Promise.resolve(cloneableResponse(400, text)); - }); + stubRestApi('saveChangeReview').callsFake( + (changeNum, patchNum, review, errFn) => { + errFn(cloneableResponse(400, 'Comment validation error!')); + return Promise.resolve(undefined); + } + ); const listener = event => { if (event.target !== document) return; @@ -978,7 +984,7 @@ }); test('_removeAccount', done => { - sinon.stub(element.restApiService, 'removeChangeReviewer') + stubRestApi('removeChangeReviewer') .returns(Promise.resolve({ok: true})); const arr = [makeAccount(), makeAccount()]; element.change.reviewers = { @@ -1338,32 +1344,29 @@ }); suite('pending diff drafts?', () => { - test('yes', () => { + test('yes', async () => { const promise = mockPromise(); - const refreshHandler = sinon.stub(); + const refreshSpy = sinon.spy(); + element.addEventListener('comment-refresh', refreshSpy); + stubRestApi('hasPendingDiffDrafts').returns(true); + stubRestApi('awaitPendingDiffDrafts').returns(promise); - element.addEventListener('comment-refresh', refreshHandler); - sinon.stub(element.restApiService, 'hasPendingDiffDrafts').returns( - true); - element.restApiService._pendingRequests.sendDiffDraft = [promise]; element.open(); - assert.isFalse(refreshHandler.called); + assert.isFalse(refreshSpy.called); assert.isTrue(element._savingComments); promise.resolve(); + await flush(); - return element.restApiService.awaitPendingDiffDrafts().then(() => { - assert.isTrue(refreshHandler.called); - assert.isFalse(element._savingComments); - }); + assert.isTrue(refreshSpy.called); + assert.isFalse(element._savingComments); }); test('no', () => { - sinon.stub(element.restApiService, 'hasPendingDiffDrafts').returns( - false); + stubRestApi('hasPendingDiffDrafts').returns(false); element.open(); - assert.notOk(element._savingComments); + assert.isFalse(element._savingComments); }); }); });
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.js b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.js index 89332c2..f77f736 100644 --- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.js +++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-reviewer-list.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-reviewer-list'); @@ -27,12 +28,8 @@ element = basicFixture.instantiate(); element.serverConfig = {}; - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - removeChangeReviewer() { - return Promise.resolve({ok: true}); - }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('removeChangeReviewer').returns(Promise.resolve({ok: true})); }); test('controls hidden on immutable element', () => {
diff --git a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown_test.js b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown_test.js index a8f206c..dc5d1b4 100644 --- a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown_test.js +++ b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-account-dropdown.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-account-dropdown'); @@ -24,9 +25,7 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); element = basicFixture.instantiate(); });
diff --git a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.ts b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.ts index e868f03..8e5a2b3 100644 --- a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.ts +++ b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.ts
@@ -28,9 +28,6 @@ import {appContext} from '../../../services/app-context'; import {IronA11yAnnouncer} from '@polymer/iron-a11y-announcer/iron-a11y-announcer'; import {customElement, property} from '@polymer/decorators'; -import {ReportingService} from '../../../services/gr-reporting/gr-reporting'; -import {AuthService} from '../../../services/gr-auth/gr-auth'; -import {EventEmitterService} from '../../../services/gr-event-interface/gr-event-interface'; import {GrOverlay} from '../../shared/gr-overlay/gr-overlay'; import {GrErrorDialog} from '../gr-error-dialog/gr-error-dialog'; import {GrAlert} from '../../shared/gr-alert/gr-alert'; @@ -105,23 +102,16 @@ @property({type: String}) loginUrl = '/login'; - reporting: ReportingService; + private readonly reporting = appContext.reportingService; - _authService: AuthService; + private readonly _authService = appContext.authService; - eventEmitter: EventEmitterService; + private readonly eventEmitter = appContext.eventEmitter; _authErrorHandlerDeregistrationHook?: Function; private readonly restApiService = appContext.restApiService; - constructor() { - super(); - this._authService = appContext.authService; - this.reporting = appContext.reportingService; - this.eventEmitter = appContext.eventEmitter; - } - /** @override */ attached() { super.attached();
diff --git a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.js b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.js index 7fc35c6..092daa2 100644 --- a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.js +++ b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.js
@@ -19,6 +19,8 @@ import './gr-error-manager.js'; import {_testOnly_initGerritPluginApi} from '../../shared/gr-js-api-interface/gr-gerrit.js'; import {__testOnly_ErrorType} from './gr-error-manager.js'; +import {stubRestApi} from '../../../test/test-utils.js'; +import {appContext} from '../../../services/app-context.js'; const basicFixture = fixtureFromElement('gr-error-manager'); @@ -30,10 +32,14 @@ suite('when authed', () => { let toastSpy; let openOverlaySpy; + let fetchStub; + let getLoggedInStub; setup(() => { - sinon.stub(window, 'fetch') + fetchStub = sinon.stub(window, 'fetch') .returns(Promise.resolve({ok: true, status: 204})); + getLoggedInStub = stubRestApi('getLoggedIn') + .callsFake(() => appContext.authService.authCheck()); element = basicFixture.instantiate(); element._authService.clearCache(); toastSpy = sinon.spy(element, '_createToastAlert'); @@ -67,8 +73,7 @@ element, '_showAuthErrorAlert' ); const responseText = Promise.resolve('Authentication required\n'); - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(true)); + getLoggedInStub.returns(Promise.resolve(true)); element.dispatchEvent( new CustomEvent('server-error', { detail: @@ -81,36 +86,33 @@ }); }); - test('recheck auth for 403 with auth error if authed before', done => { - // starts with authed state - element.restApiService.getLoggedIn(); + test('recheck auth for 403 with auth error if authed before', async () => { + // Set status to AUTHED. + appContext.authService.authCheck(); const responseText = Promise.resolve('Authentication required\n'); - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(true)); + getLoggedInStub.returns(Promise.resolve(true)); element.dispatchEvent( new CustomEvent('server-error', { detail: {response: {status: 403, text() { return responseText; }}}, composed: true, bubbles: true, })); - flush(() => { - assert.isTrue(element.restApiService.getLoggedIn.calledOnce); - done(); - }); + await flush(); + assert.isTrue(getLoggedInStub.calledOnce); }); test('show logged in error', () => { - sinon.stub(element, '_showAuthErrorAlert'); + const spy = sinon.spy(element, '_showAuthErrorAlert'); element.dispatchEvent( new CustomEvent('show-auth-required', { composed: true, bubbles: true, })); - assert.isTrue(element._showAuthErrorAlert.calledWithExactly( + assert.isTrue(spy.calledWithExactly( 'Log in is required to perform that action.', 'Log in.')); }); test('show normal Error', done => { - const showErrorStub = sinon.stub(element, '_showErrorDialog'); + const showErrorSpy = sinon.spy(element, '_showErrorDialog'); const textSpy = sinon.spy(() => Promise.resolve('ZOMG')); element.dispatchEvent( new CustomEvent('server-error', { @@ -120,8 +122,8 @@ assert.isTrue(textSpy.called); flush(() => { - assert.isTrue(showErrorStub.calledOnce); - assert.isTrue(showErrorStub.lastCall.calledWithExactly( + assert.isTrue(showErrorSpy.calledOnce); + assert.isTrue(showErrorSpy.lastCall.calledWithExactly( 'Error 500: ZOMG')); done(); }); @@ -240,27 +242,27 @@ }); test('show auth refresh toast', async () => { - // starts with authed state - element.restApiService.getLoggedIn(); - const refreshStub = sinon.stub(element.restApiService, + // Set status to AUTHED. + appContext.authService.authCheck(); + const refreshStub = stubRestApi( 'getAccount').callsFake( () => Promise.resolve({})); const windowOpen = sinon.stub(window, 'open'); const responseText = Promise.resolve('Authentication required\n'); // fake failed auth - window.fetch.returns(Promise.resolve({status: 403})); + fetchStub.returns(Promise.resolve({status: 403})); element.dispatchEvent( new CustomEvent('server-error', { detail: {response: {status: 403, text() { return responseText; }}}, composed: true, bubbles: true, })); - assert.equal(window.fetch.callCount, 1); + assert.equal(fetchStub.callCount, 1); await flush(); // here needs two flush as there are two chanined // promises on server-error handler and flush only flushes one - assert.equal(window.fetch.callCount, 2); + assert.equal(fetchStub.callCount, 2); await flush(); // Sometime overlay opens with delay, waiting while open is complete await openOverlaySpy.lastCall.returnValue; @@ -294,7 +296,7 @@ const hideToastSpy = sinon.spy(toast, 'hide'); // now fake authed - window.fetch.returns(Promise.resolve({status: 204})); + fetchStub.returns(Promise.resolve({status: 204})); element._handleWindowFocus(); element.flushDebouncer('checkLoggedIn'); await flush(); @@ -313,8 +315,8 @@ }); test('auth toast should dismiss existing toast', async () => { - // starts with authed state - element.restApiService.getLoggedIn(); + // Set status to AUTHED. + appContext.authService.authCheck(); const responseText = Promise.resolve('Authentication required\n'); // fake an alert @@ -329,18 +331,18 @@ toast.root.textContent, 'test reload'); // fake auth - window.fetch.returns(Promise.resolve({status: 403})); + fetchStub.returns(Promise.resolve({status: 403})); element.dispatchEvent( new CustomEvent('server-error', { detail: {response: {status: 403, text() { return responseText; }}}, composed: true, bubbles: true, })); - assert.equal(window.fetch.callCount, 1); + assert.equal(fetchStub.callCount, 1); await flush(); // here needs two flush as there are two chained // promises on server-error handler and flush only flushes one - assert.equal(window.fetch.callCount, 2); + assert.equal(fetchStub.callCount, 2); await flush(); // Sometime overlay opens with delay, waiting while open is complete await openOverlaySpy.lastCall.returnValue; @@ -353,8 +355,8 @@ }); test('regular toast should dismiss regular toast', () => { - // starts with authed state - element.restApiService.getLoggedIn(); + // Set status to AUTHED. + appContext.authService.authCheck(); // fake an alert element.dispatchEvent( @@ -379,23 +381,23 @@ }); test('regular toast should not dismiss auth toast', done => { - // starts with authed state - element.restApiService.getLoggedIn(); + // Set status to AUTHED. + appContext.authService.authCheck(); const responseText = Promise.resolve('Authentication required\n'); // fake auth - window.fetch.returns(Promise.resolve({status: 403})); + fetchStub.returns(Promise.resolve({status: 403})); element.dispatchEvent( new CustomEvent('server-error', { detail: {response: {status: 403, text() { return responseText; }}}, composed: true, bubbles: true, })); - assert.equal(window.fetch.callCount, 1); + assert.equal(fetchStub.callCount, 1); flush(() => { // here needs two flush as there are two chained // promises on server-error handler and flush only flushes one - assert.equal(window.fetch.callCount, 2); + assert.equal(fetchStub.callCount, 2); flush(() => { let toast = toastSpy.lastCall.returnValue; assert.include( @@ -457,7 +459,7 @@ test('refreshes with same credentials', done => { const accountPromise = Promise.resolve({_account_id: 1234}); - sinon.stub(element.restApiService, 'getAccount') + stubRestApi('getAccount') .returns(accountPromise); const requestCheckStub = sinon.stub(element, '_requestCheckLoggedIn'); const handleRefreshStub = sinon.stub(element, @@ -514,7 +516,7 @@ test('reloads when refreshed credentials differ', done => { const accountPromise = Promise.resolve({_account_id: 1234}); - sinon.stub(element.restApiService, 'getAccount') + stubRestApi('getAccount') .returns(accountPromise); const requestCheckStub = sinon.stub( element, @@ -539,9 +541,7 @@ suite('when not authed', () => { let toastSpy; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(false); }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); element = basicFixture.instantiate(); toastSpy = sinon.spy(element, '_createToastAlert'); });
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.ts b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.ts index 3ab40e9..b13e2e6 100644 --- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.ts +++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.ts
@@ -16,7 +16,7 @@ */ import '../../../test/common-test-setup-karma'; -import {isHidden, query} from '../../../test/test-utils'; +import {isHidden, query, stubRestApi} from '../../../test/test-utils'; import './gr-main-header'; import {GrMainHeader} from './gr-main-header'; import { @@ -33,14 +33,7 @@ let element: GrMainHeader; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { - return Promise.resolve(createServerInfo()); - }, - probePath(_) { - return Promise.resolve(false); - }, - }); + stubRestApi('probePath').returns(Promise.resolve(false)); stub('gr-main-header', { _loadAccount() { return Promise.resolve();
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.js b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.js index ff8f8df..16d6370 100644 --- a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.js +++ b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.js
@@ -21,6 +21,7 @@ import {GerritNav} from '../gr-navigation/gr-navigation.js'; import {stubBaseUrl} from '../../../test/test-utils.js'; import {_testOnly_RoutePattern} from './gr-router.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-router'); @@ -229,7 +230,7 @@ }); test('_redirectIfNotLoggedIn while logged in', () => { - sinon.stub(element.restApiService, 'getLoggedIn') + stubRestApi('getLoggedIn') .returns(Promise.resolve(true)); const data = {canonicalPath: ''}; const redirectStub = sinon.stub(element, '_redirectToLogin'); @@ -239,7 +240,7 @@ }); test('_redirectIfNotLoggedIn while logged out', () => { - sinon.stub(element.restApiService, 'getLoggedIn') + stubRestApi('getLoggedIn') .returns(Promise.resolve(false)); const redirectStub = sinon.stub(element, '_redirectToLogin'); const data = {canonicalPath: ''}; @@ -523,8 +524,7 @@ let generateUrlStub; setup(() => { - projectLookupStub = sinon - .stub(element.restApiService, 'getFromProjectLookup'); + projectLookupStub = stubRestApi('getFromProjectLookup'); generateUrlStub = sinon.stub(element, '_generateUrl'); }); @@ -794,8 +794,7 @@ }); test('redirects to dashboard if logged in', () => { - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(true)); + stubRestApi('getLoggedIn').returns(Promise.resolve(true)); const data = { canonicalPath: '/', path: '/', querystring: '', hash: '', }; @@ -807,8 +806,7 @@ }); test('redirects to open changes if not logged in', () => { - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(false)); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); const data = { canonicalPath: '/', path: '/', querystring: '', hash: '', }; @@ -905,8 +903,7 @@ }); test('own dashboard but signed out redirects to login', () => { - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(false)); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); const data = {canonicalPath: '/dashboard/', params: {0: 'seLF'}}; return element._handleDashboardRoute(data, '').then(() => { assert.isTrue(redirectToLoginStub.calledOnce); @@ -916,8 +913,7 @@ }); test('non-self dashboard but signed out does not redirect', () => { - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(false)); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); const data = {canonicalPath: '/dashboard/', params: {0: 'foo'}}; return element._handleDashboardRoute(data, '').then(() => { assert.isFalse(redirectToLoginStub.called); @@ -928,8 +924,7 @@ }); test('dashboard while signed in sets params', () => { - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(true)); + stubRestApi('getLoggedIn').returns(Promise.resolve(true)); const data = {canonicalPath: '/dashboard/', params: {0: 'foo'}}; return element._handleDashboardRoute(data, '').then(() => { assert.isFalse(redirectToLoginStub.called); @@ -1444,7 +1439,7 @@ setup(() => { normalizeRangeStub = sinon.stub(element, '_normalizePatchRangeParams'); - sinon.stub(element.restApiService, 'setInProjectLookup'); + stubRestApi('setInProjectLookup'); }); test('needs redirect', () => { @@ -1498,7 +1493,7 @@ setup(() => { normalizeRangeStub = sinon.stub(element, '_normalizePatchRangeParams'); - sinon.stub(element.restApiService, 'setInProjectLookup'); + stubRestApi('setInProjectLookup'); }); test('needs redirect', () => { @@ -1551,7 +1546,7 @@ test('_handleDiffEditRoute', () => { const normalizeRangeSpy = sinon.spy(element, '_normalizePatchRangeParams'); - sinon.stub(element.restApiService, 'setInProjectLookup'); + stubRestApi('setInProjectLookup'); const ctx = { params: [ 'foo/bar', // 0 Project @@ -1580,7 +1575,7 @@ test('_handleDiffEditRoute with lineNum', () => { const normalizeRangeSpy = sinon.spy(element, '_normalizePatchRangeParams'); - sinon.stub(element.restApiService, 'setInProjectLookup'); + stubRestApi('setInProjectLookup'); const ctx = { params: [ 'foo/bar', // 0 Project @@ -1610,7 +1605,7 @@ test('_handleChangeEditRoute', () => { const normalizeRangeSpy = sinon.spy(element, '_normalizePatchRangeParams'); - sinon.stub(element.restApiService, 'setInProjectLookup'); + stubRestApi('setInProjectLookup'); const ctx = { params: [ 'foo/bar', // 0 Project
diff --git a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar_test.js b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar_test.js index e470618..e553402 100644 --- a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar_test.js +++ b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar_test.js
@@ -21,6 +21,7 @@ import {TestKeyboardShortcutBinder} from '../../../test/test-utils.js'; import {Shortcut} from '../../../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin.js'; import {_testOnly_clearDocsBaseUrlCache} from '../../../utils/url-util.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-search-bar'); @@ -123,6 +124,12 @@ }); suite('_getSearchSuggestions', () => { + setup(() => { + // Ensure that config.change.mergeability_computation_behavior is not set. + stubRestApi('getConfig').returns(Promise.resolve({})); + element = basicFixture.instantiate(); + }); + test('Autocompletes accounts', () => { sinon.stub(element, 'accountSuggestions').callsFake(() => Promise.resolve([{text: 'owner:fred@goog.co'}]) @@ -188,15 +195,11 @@ ].forEach(mergeability => { suite(`mergeability as ${mergeability}`, () => { setup(done => { - stub('gr-rest-api-interface', { - getConfig() { - return Promise.resolve({ - change: { - mergeability_computation_behavior: mergeability, - }, - }); + stubRestApi('getConfig').returns(Promise.resolve({ + change: { + mergeability_computation_behavior: mergeability, }, - }); + })); element = basicFixture.instantiate(); flush(done); @@ -217,15 +220,11 @@ suite('doc url', () => { setup(done => { - stub('gr-rest-api-interface', { - getConfig() { - return Promise.resolve({ - gerrit: { - doc_url: 'https://doc.com/', - }, - }); + stubRestApi('getConfig').returns(Promise.resolve({ + gerrit: { + doc_url: 'https://doc.com/', }, - }); + })); _testOnly_clearDocsBaseUrlCache(); element = basicFixture.instantiate();
diff --git a/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search_test.js b/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search_test.js index d7e6c27..f3a9965 100644 --- a/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search_test.js +++ b/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-smart-search.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-smart-search'); @@ -28,7 +29,7 @@ }); test('Autocompletes accounts', () => { - sinon.stub(element.restApiService, 'getSuggestedAccounts').callsFake(() => + stubRestApi('getSuggestedAccounts').callsFake(() => Promise.resolve([ { name: 'fred', @@ -42,7 +43,7 @@ }); test('Inserts self as option when valid', () => { - sinon.stub(element.restApiService, 'getSuggestedAccounts').callsFake( () => + stubRestApi('getSuggestedAccounts').callsFake( () => Promise.resolve([ { name: 'fred', @@ -62,7 +63,7 @@ }); test('Inserts me as option when valid', () => { - sinon.stub(element.restApiService, 'getSuggestedAccounts').callsFake( () => + stubRestApi('getSuggestedAccounts').callsFake( () => Promise.resolve([ { name: 'fred', @@ -82,7 +83,7 @@ }); test('Autocompletes groups', () => { - sinon.stub(element.restApiService, 'getSuggestedGroups').callsFake( () => + stubRestApi('getSuggestedGroups').callsFake( () => Promise.resolve({ Polygerrit: 0, gerrit: 0, @@ -95,7 +96,7 @@ }); test('Autocompletes projects', () => { - sinon.stub(element.restApiService, 'getSuggestedProjects').callsFake( () => + stubRestApi('getSuggestedProjects').callsFake( () => Promise.resolve({Polygerrit: 0})); return element._fetchProjects('project', 'pol').then(s => { assert.deepEqual(s[0], {text: 'project:Polygerrit'}); @@ -103,7 +104,7 @@ }); test('Autocomplete doesnt override exact matches to input', () => { - sinon.stub(element.restApiService, 'getSuggestedGroups').callsFake( () => + stubRestApi('getSuggestedGroups').callsFake( () => Promise.resolve({ Polygerrit: 0, gerrit: 0, @@ -118,7 +119,7 @@ }); test('Autocompletes accounts with no email', () => { - sinon.stub(element.restApiService, 'getSuggestedAccounts').callsFake( () => + stubRestApi('getSuggestedAccounts').callsFake( () => Promise.resolve([{name: 'fred'}])); return element._fetchAccounts('owner', 'fr').then(s => { assert.deepEqual(s[0], {text: 'owner:"fred"', label: 'fred'}); @@ -126,7 +127,7 @@ }); test('Autocompletes accounts with email', () => { - sinon.stub(element.restApiService, 'getSuggestedAccounts').callsFake( () => + stubRestApi('getSuggestedAccounts').callsFake( () => Promise.resolve([{email: 'fred@goog.co'}])); return element._fetchAccounts('owner', 'fr').then(s => { assert.deepEqual(s[0], {text: 'owner:fred@goog.co', label: ''});
diff --git a/polygerrit-ui/app/elements/custom-dark-theme_test.js b/polygerrit-ui/app/elements/custom-dark-theme_test.js index ad12e14..d4b05e2 100644 --- a/polygerrit-ui/app/elements/custom-dark-theme_test.js +++ b/polygerrit-ui/app/elements/custom-dark-theme_test.js
@@ -17,7 +17,6 @@ import '../test/common-test-setup-karma.js'; import {getComputedStyleValue} from '../utils/dom-util.js'; -import './shared/gr-rest-api-interface/gr-rest-api-interface.js'; import './gr-app.js'; import {getPluginLoader} from './shared/gr-js-api-interface/gr-plugin-loader.js'; import {removeTheme} from '../styles/themes/dark-theme.js';
diff --git a/polygerrit-ui/app/elements/custom-light-theme_test.js b/polygerrit-ui/app/elements/custom-light-theme_test.js index 6d5b61e..35bc3a6 100644 --- a/polygerrit-ui/app/elements/custom-light-theme_test.js +++ b/polygerrit-ui/app/elements/custom-light-theme_test.js
@@ -17,9 +17,9 @@ import '../test/common-test-setup-karma.js'; import {getComputedStyleValue} from '../utils/dom-util.js'; -import './shared/gr-rest-api-interface/gr-rest-api-interface.js'; import './gr-app.js'; import {getPluginLoader} from './shared/gr-js-api-interface/gr-plugin-loader.js'; +import {stubRestApi} from '../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-app'); @@ -27,14 +27,11 @@ let element; setup(done => { window.localStorage.removeItem('dark-theme'); - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({test: 'config'}); }, - getAccount() { return Promise.resolve({}); }, - getDiffComments() { return Promise.resolve({}); }, - getDiffRobotComments() { return Promise.resolve({}); }, - getDiffDrafts() { return Promise.resolve({}); }, - _fetchSharedCacheURL() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({test: 'config'})); + stubRestApi('getAccount').returns(Promise.resolve({})); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); element = basicFixture.instantiate(); getPluginLoader().loadPlugins([]); getPluginLoader().awaitPluginsLoaded()
diff --git a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.js b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.js index 869b518..d78961c 100644 --- a/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.js +++ b/polygerrit-ui/app/elements/diff/gr-apply-fix-dialog/gr-apply-fix-dialog_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-apply-fix-dialog.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-apply-fix-dialog'); @@ -56,7 +57,7 @@ suite('dialog open', () => { setup(() => { - sinon.stub(element.restApiService, 'getRobotCommentFixPreview') + stubRestApi('getRobotCommentFixPreview') .returns(Promise.resolve({ f1: { meta_a: {}, @@ -147,8 +148,7 @@ }); test('next button state updated when suggestions changed', done => { - sinon.stub(element.restApiService, 'getRobotCommentFixPreview') - .returns(Promise.resolve({})); + stubRestApi('getRobotCommentFixPreview').returns(Promise.resolve({})); sinon.stub(element.$.applyFixOverlay, 'open').returns(Promise.resolve()); element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT_WITH_ONE_FIX}}) @@ -162,38 +162,24 @@ }); }); - test('preview endpoint throws error should reset dialog', done => { - sinon.stub(window, 'fetch').callsFake((url => { - if (url.endsWith('/preview')) { - return Promise.reject(new Error('backend error')); - } - return Promise.resolve({ - ok: true, - text() { return Promise.resolve(''); }, - status: 200, - }); - })); - const errorStub = sinon.stub(); - document.addEventListener('network-error', errorStub); + test('preview endpoint throws error should reset dialog', async () => { + stubRestApi('getRobotCommentFixPreview').returns( + Promise.reject(new Error('backend error'))); element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT_WITH_TWO_FIXES}}); - flush(() => { - assert.isTrue(errorStub.called); - assert.equal(element._currentFix, undefined); - done(); - }); + await flush(); + assert.equal(element._currentFix, undefined); }); test('apply fix button should call apply ' + 'and navigate to change view', () => { - sinon.stub(element.restApiService, 'applyFixSuggestion') - .returns(Promise.resolve({ok: true})); + const stub = stubRestApi('applyFixSuggestion').returns( + Promise.resolve({ok: true})); sinon.stub(GerritNav, 'navigateToChange'); element._currentFix = {fix_id: '123'}; return element._handleApplyFix().then(() => { - assert.isTrue(element.restApiService.applyFixSuggestion - .calledWithExactly('1', 2, '123')); + assert.isTrue(stub.calledWithExactly('1', 2, '123')); assert.isTrue(GerritNav.navigateToChange.calledWithExactly({ _number: '1', project: 'project', @@ -211,14 +197,12 @@ }); test('should not navigate to change view if incorect reponse', done => { - sinon.stub(element.restApiService, 'applyFixSuggestion') - .returns(Promise.resolve({})); + const stub = stubRestApi('applyFixSuggestion').returns(Promise.resolve({})); sinon.stub(GerritNav, 'navigateToChange'); element._currentFix = {fix_id: '123'}; element._handleApplyFix().then(() => { - assert.isTrue(element.restApiService.applyFixSuggestion - .calledWithExactly('1', 2, '123')); + assert.isTrue(stub.calledWithExactly('1', 2, '123')); assert.isTrue(GerritNav.navigateToChange.notCalled); assert.equal(element._isApplyFixLoading, false); @@ -227,7 +211,7 @@ }); test('select fix forward and back of multiple suggested fixes', done => { - sinon.stub(element.restApiService, 'getRobotCommentFixPreview') + stubRestApi('getRobotCommentFixPreview') .returns(Promise.resolve({ f1: { meta_a: {}, @@ -273,18 +257,8 @@ }); test('server-error should throw for failed apply call', async () => { - sinon.stub(window, 'fetch').callsFake((url => { - if (url.endsWith('/apply')) { - return Promise.reject(new Error('backend error')); - } - return Promise.resolve({ - ok: true, - text() { return Promise.resolve(''); }, - status: 200, - }); - })); - const errorStub = sinon.stub(); - document.addEventListener('network-error', errorStub); + stubRestApi('applyFixSuggestion').returns( + Promise.reject(new Error('backend error'))); sinon.stub(GerritNav, 'navigateToChange'); element._currentFix = {fix_id: '123'}; let expectedError; @@ -293,7 +267,6 @@ }); assert.isOk(expectedError); assert.isFalse(GerritNav.navigateToChange.called); - assert.isTrue(errorStub.called); }); });
diff --git a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api_test.js b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api_test.js index e107c16..94ec78f 100644 --- a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api_test.js +++ b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api_test.js
@@ -21,6 +21,7 @@ import {isInRevisionOfPatchRange, isInBaseOfPatchRange, isDraftThread, isUnresolved, createCommentThreads} from '../../../utils/comment-util.js'; import {createDraft, createComment, createChangeComments, createCommentThread} from '../../../test/test-data-generators.js'; import {CommentSide, Side} from '../../../constants/constants.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-comment-api'); @@ -36,25 +37,20 @@ test('loads logged-out', () => { const changeNum = 1234; - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(false)); - sinon.stub(element.restApiService, 'getDiffComments') - .returns(Promise.resolve({ + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + const diffCommentsSpy = stubRestApi('getDiffComments').returns( + Promise.resolve({ 'foo.c': [{id: '123', message: 'foo bar', in_reply_to: '321'}], })); - sinon.stub(element.restApiService, 'getDiffRobotComments') - .returns(Promise.resolve({'foo.c': [{id: '321', message: 'done'}]})); - sinon.stub(element.restApiService, 'getDiffDrafts') - .returns(Promise.resolve({})); + const diffRobotCommentsSpy = stubRestApi('getDiffRobotComments').returns( + Promise.resolve({'foo.c': [{id: '321', message: 'done'}]})); + const diffDraftsSpy = stubRestApi('getDiffDrafts').returns( + Promise.resolve({})); return element.loadAll(changeNum).then(() => { - assert.isTrue(element.restApiService.getDiffComments.calledWithExactly( - changeNum)); - assert.isTrue( - element.restApiService.getDiffRobotComments.calledWithExactly( - changeNum)); - assert.isTrue(element.restApiService.getDiffDrafts.calledWithExactly( - changeNum)); + assert.isTrue(diffCommentsSpy.calledWithExactly(changeNum)); + assert.isTrue(diffRobotCommentsSpy.calledWithExactly(changeNum)); + assert.isTrue(diffDraftsSpy.calledWithExactly(changeNum)); assert.isOk(element._changeComments._comments); assert.isOk(element._changeComments._robotComments); assert.deepEqual(element._changeComments._drafts, {}); @@ -64,25 +60,21 @@ test('loads logged-in', () => { const changeNum = 1234; - sinon.stub(element.restApiService, 'getLoggedIn') - .returns(Promise.resolve(true)); - sinon.stub(element.restApiService, 'getDiffComments') - .returns(Promise.resolve({ + stubRestApi('getLoggedIn').returns(Promise.resolve(true)); + const getCommentsStub = stubRestApi('getDiffComments').returns( + Promise.resolve({ 'foo.c': [{id: '123', message: 'foo bar', in_reply_to: '321'}], - })); - sinon.stub(element.restApiService, 'getDiffRobotComments') + }) + ); + const getRobotCommentsStub = stubRestApi('getDiffRobotComments') .returns(Promise.resolve({'foo.c': [{id: '321', message: 'done'}]})); - sinon.stub(element.restApiService, 'getDiffDrafts') + const getDraftsStub = stubRestApi('getDiffDrafts') .returns(Promise.resolve({'foo.c': [{id: '555', message: 'ack'}]})); return element.loadAll(changeNum).then(() => { - assert.isTrue(element.restApiService.getDiffComments.calledWithExactly( - changeNum)); - assert.isTrue( - element.restApiService.getDiffRobotComments.calledWithExactly( - changeNum)); - assert.isTrue(element.restApiService.getDiffDrafts.calledWithExactly( - changeNum)); + assert.isTrue(getCommentsStub.calledWithExactly(changeNum)); + assert.isTrue(getRobotCommentsStub.calledWithExactly(changeNum)); + assert.isTrue(getDraftsStub.calledWithExactly(changeNum)); assert.isOk(element._changeComments._comments); assert.isOk(element._changeComments._robotComments); assert.notDeepEqual(element._changeComments._drafts, {}); @@ -94,11 +86,11 @@ let robotCommentStub; let draftStub; setup(() => { - commentStub = sinon.stub(element.restApiService, 'getDiffComments') + commentStub = stubRestApi('getDiffComments') .returns(Promise.resolve({})); - robotCommentStub = sinon.stub(element.restApiService, + robotCommentStub = stubRestApi( 'getDiffRobotComments').returns(Promise.resolve({})); - draftStub = sinon.stub(element.restApiService, 'getDiffDrafts') + draftStub = stubRestApi('getDiffDrafts') .returns(Promise.resolve({})); }); @@ -138,11 +130,9 @@ suite('_changeComment methods', () => { setup(done => { const changeNum = 1234; - stub('gr-rest-api-interface', { - getDiffComments() { return Promise.resolve({}); }, - getDiffRobotComments() { return Promise.resolve({}); }, - getDiffDrafts() { return Promise.resolve({}); }, - }); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); element.loadAll(changeNum).then(() => { done(); });
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element_test.js b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element_test.js index b10b251..532922c 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element_test.js +++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-element_test.js
@@ -18,7 +18,6 @@ import '../../../test/common-test-setup-karma.js'; import '../gr-diff/gr-diff-group.js'; import './gr-diff-builder.js'; -import '../../shared/gr-rest-api-interface/gr-rest-api-interface.js'; import {getMockDiffResponse} from '../../../test/mocks/diff-response.js'; import './gr-diff-builder-element.js'; import {stubBaseUrl} from '../../../test/test-utils.js'; @@ -29,6 +28,7 @@ import {GrDiffBuilder} from './gr-diff-builder.js'; import {GrDiffBuilderSideBySide} from './gr-diff-builder-side-by-side.js'; import {html} from '@polymer/polymer/lib/utils/html-tag.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromTemplate(html` <gr-diff-builder> @@ -60,10 +60,8 @@ setup(() => { element = basicFixture.instantiate(); - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(false); }, - getProjectConfig() { return Promise.resolve({}); }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getProjectConfig').returns(Promise.resolve({})); stubBaseUrl('/r'); prefs = { line_length: 10,
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor_test.js b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor_test.js index 1e1d17e..3b366ce 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor_test.js +++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor_test.js
@@ -18,11 +18,10 @@ import '../../../test/common-test-setup-karma.js'; import '../gr-diff/gr-diff.js'; import './gr-diff-cursor.js'; -import '../../shared/gr-rest-api-interface/gr-rest-api-interface.js'; import {html} from '@polymer/polymer/lib/utils/html-tag.js'; import {listenOnce} from '../../../test/test-utils.js'; import {getMockDiffResponse} from '../../../test/mocks/diff-response.js'; -import {appContext} from '../../../services/app-context.js'; +import {createDefaultDiffPrefs} from '../../../constants/constants.js'; const basicFixture = fixtureFromTemplate(html` <gr-diff></gr-diff> @@ -40,7 +39,6 @@ const fixtureElems = basicFixture.instantiate(); diffElement = fixtureElems[0]; cursorElement = fixtureElems[1]; - const restAPI = appContext.restApiService; // Register the diff with the cursor. cursorElement.push('diffs', diffElement); @@ -61,10 +59,8 @@ diffElement.addEventListener('render', setupDone); diff = getMockDiffResponse(); - restAPI.getDiffPreferences().then(prefs => { - diffElement.prefs = prefs; - diffElement.diff = diff; - }); + diffElement.prefs = createDefaultDiffPrefs(); + diffElement.diff = diff; }); test('diff cursor functionality (side-by-side)', () => { @@ -572,20 +568,17 @@ let diffElements; - setup(async () => { + setup(() => { const fixtureElems = multiDiffFixture.instantiate(); diffElements = fixtureElems.slice(0, 3); cursorElement = fixtureElems[3]; - const restAPI = appContext.restApiService; // Register the diff with the cursor. cursorElement.push('diffs', ...diffElements); - await restAPI.getDiffPreferences().then(prefs => { - for (const el of diffElements) { - el.prefs = prefs; - } - }); + for (const el of diffElements) { + el.prefs = createDefaultDiffPrefs(); + } }); function getTargetDiffIndex() {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js index d09c811..99e6391 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js +++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js
@@ -25,6 +25,8 @@ import {createChange} from '../../../test/test-data-generators.js'; import {FILE} from '../gr-diff/gr-diff-line.js'; import {CoverageType} from '../../../types/types.js'; +import {stubRestApi} from '../../../test/test-utils.js'; +import {createDefaultDiffPrefs} from '../../../constants/constants.js'; const basicFixture = fixtureFromElement('gr-diff-host'); @@ -35,9 +37,7 @@ setup(() => { getLoggedIn = false; - stub('gr-rest-api-interface', { - async getLoggedIn() { return getLoggedIn; }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(getLoggedIn)); element = basicFixture.instantiate(); element.changeNum = 123; element.path = 'some/path'; @@ -130,18 +130,16 @@ test('ends total and syntax timer after syntax layer', async () => { sinon.stub(element.reporting, 'diffViewContentDisplayed'); let notifySyntaxProcessed; - sinon.stub(element.$.syntaxLayer, 'process').returns(new Promise( - resolve => { + sinon.stub(element.$.syntaxLayer, 'process').returns( + new Promise(resolve => { notifySyntaxProcessed = resolve; - })); - sinon.stub(element.restApiService, 'getDiff').returns( - Promise.resolve({content: []})); + }) + ); + stubRestApi('getDiff').returns(Promise.resolve({content: []})); element.patchRange = {}; element.change = createChange(); - element.restApiService.getDiffPreferences().then(prefs => { - element.prefs = prefs; - return element.reload(true); - }); + element.prefs = createDefaultDiffPrefs(); + element.reload(true); // Multiple cascading microtasks are scheduled. await flush(); notifySyntaxProcessed(); @@ -155,8 +153,7 @@ }); test('ends total timer w/ no syntax layer processing', async () => { - sinon.stub(element.restApiService, 'getDiff').returns( - Promise.resolve({content: []})); + stubRestApi('getDiff').returns(Promise.resolve({content: []})); element.patchRange = {}; element.change = createChange(); element.reload(); @@ -177,19 +174,15 @@ resolve => { notifySyntaxProcessed = resolve; })); - sinon.stub(element.restApiService, 'getDiff').returns( + stubRestApi('getDiff').returns( Promise.resolve({content: []})); element.patchRange = {}; element.change = createChange(); let reloadComplete = false; - element.restApiService.getDiffPreferences() - .then(prefs => { - element.prefs = prefs; - return element.reload(); - }) - .then(() => { - reloadComplete = true; - }); + element.prefs = createDefaultDiffPrefs(); + element.reload().then(() => { + reloadComplete = true; + }); // Multiple cascading microtasks are scheduled. await flush(); assert.isFalse(reloadComplete); @@ -231,7 +224,7 @@ test('reload() loads files weblinks', () => { const weblinksStub = sinon.stub(GerritNav, '_generateWeblinks') .returns({name: 'stubb', url: '#s'}); - sinon.stub(element.restApiService, 'getDiff').returns(Promise.resolve({ + stubRestApi('getDiff').returns(Promise.resolve({ content: [], })); element.projectName = 'test-project'; @@ -264,7 +257,7 @@ }); test('prefetch getDiff', done => { - const diffRestApiStub = sinon.stub(element.restApiService, 'getDiff') + const diffRestApiStub = stubRestApi('getDiff') .returns(Promise.resolve({content: []})); element.changeNum = 123; element.patchRange = {basePatchNum: 1, patchNum: 2}; @@ -277,9 +270,7 @@ }); test('_getDiff handles null diff responses', done => { - stub('gr-rest-api-interface', { - getDiff() { return Promise.resolve(null); }, - }); + stubRestApi('getDiff').returns(Promise.resolve(null)); element.changeNum = 123; element.patchRange = {basePatchNum: 1, patchNum: 2}; element.path = 'file.txt'; @@ -289,7 +280,7 @@ test('reload resolves on error', () => { const onErrStub = sinon.stub(element, '_handleGetDiffError'); const error = new Response(null, {ok: false, status: 500}); - sinon.stub(element.restApiService, 'getDiff').callsFake( + stubRestApi('getDiff').callsFake( (changeNum, basePatchNum, patchNum, path, whitespace, onErr) => { onErr(error); }); @@ -352,12 +343,6 @@ 'wsAAAAAAAAAAAAA/////w==', type: 'image/bmp', }; - sinon.stub(element.restApiService, - 'getB64FileContents') - .callsFake( - (changeId, patchNum, path, opt_parentIndex) => Promise.resolve( - opt_parentIndex === 1 ? mockFile1 : mockFile2) - ); element.patchRange = {basePatchNum: 'PARENT', patchNum: 1}; element.change = createChange(); @@ -385,8 +370,19 @@ content: [{skip: 66}], binary: true, }; - sinon.stub(element.restApiService, 'getDiff') - .returns(Promise.resolve(mockDiff)); + stubRestApi('getDiff').returns(Promise.resolve(mockDiff)); + stubRestApi('getImagesForDiff').returns(Promise.resolve({ + baseImage: { + ...mockFile1, + _expectedType: 'image/jpeg', + _name: 'carrot.jpg', + }, + revisionImage: { + ...mockFile2, + _expectedType: 'image/jpeg', + _name: 'carrot.jpg', + }, + })); const rendered = () => { // Recognizes that it should be an image diff. @@ -442,11 +438,8 @@ }; element.addEventListener('render', rendered); - - element.restApiService.getDiffPreferences().then(prefs => { - element.prefs = prefs; - element.reload(); - }); + element.prefs = createDefaultDiffPrefs(); + element.reload(); }); test('renders image diffs with a different file name', done => { @@ -466,8 +459,19 @@ content: [{skip: 66}], binary: true, }; - sinon.stub(element.restApiService, 'getDiff') - .returns(Promise.resolve(mockDiff)); + stubRestApi('getDiff').returns(Promise.resolve(mockDiff)); + stubRestApi('getImagesForDiff').returns(Promise.resolve({ + baseImage: { + ...mockFile1, + _expectedType: 'image/jpeg', + _name: 'carrot.jpg', + }, + revisionImage: { + ...mockFile2, + _expectedType: 'image/jpeg', + _name: 'carrot2.jpg', + }, + })); const rendered = () => { // Recognizes that it should be an image diff. @@ -525,11 +529,8 @@ }; element.addEventListener('render', rendered); - - element.restApiService.getDiffPreferences().then(prefs => { - element.prefs = prefs; - element.reload(); - }); + element.prefs = createDefaultDiffPrefs(); + element.reload(); }); test('renders added image', done => { @@ -548,8 +549,15 @@ content: [{skip: 66}], binary: true, }; - sinon.stub(element.restApiService, 'getDiff') - .returns(Promise.resolve(mockDiff)); + stubRestApi('getDiff').returns(Promise.resolve(mockDiff)); + stubRestApi('getImagesForDiff').returns(Promise.resolve({ + baseImage: null, + revisionImage: { + ...mockFile2, + _expectedType: 'image/jpeg', + _name: 'carrot2.jpg', + }, + })); element.addEventListener('render', () => { // Recognizes that it should be an image diff. @@ -567,10 +575,8 @@ done(); }); - element.restApiService.getDiffPreferences().then(prefs => { - element.prefs = prefs; - element.reload(); - }); + element.prefs = createDefaultDiffPrefs(); + element.reload(); }); test('renders removed image', done => { @@ -589,8 +595,15 @@ content: [{skip: 66}], binary: true, }; - sinon.stub(element.restApiService, 'getDiff') - .returns(Promise.resolve(mockDiff)); + stubRestApi('getDiff').returns(Promise.resolve(mockDiff)); + stubRestApi('getImagesForDiff').returns(Promise.resolve({ + baseImage: { + ...mockFile1, + _expectedType: 'image/jpeg', + _name: 'carrot.jpg', + }, + revisionImage: null, + })); element.addEventListener('render', () => { // Recognizes that it should be an image diff. @@ -608,10 +621,8 @@ done(); }); - element.restApiService.getDiffPreferences().then(prefs => { - element.prefs = prefs; - element.reload(); - }); + element.prefs = createDefaultDiffPrefs(); + element.reload(); }); test('does not render disallowed image type', done => { @@ -632,8 +643,15 @@ }; mockFile1.type = 'image/jpeg-evil'; - sinon.stub(element.restApiService, 'getDiff') - .returns(Promise.resolve(mockDiff)); + stubRestApi('getDiff').returns(Promise.resolve(mockDiff)); + stubRestApi('getImagesForDiff').returns(Promise.resolve({ + baseImage: { + ...mockFile1, + _expectedType: 'image/jpeg', + _name: 'carrot.jpg', + }, + revisionImage: null, + })); element.addEventListener('render', () => { // Recognizes that it should be an image diff. @@ -646,10 +664,8 @@ done(); }); - element.restApiService.getDiffPreferences().then(prefs => { - element.prefs = prefs; - element.reload(); - }); + element.prefs = createDefaultDiffPrefs(); + element.reload(); }); }); }); @@ -707,7 +723,7 @@ const mockBlame = [{id: 'commit id', ranges: [{start: 1, end: 2}]}]; const showAlertStub = sinon.stub(); element.addEventListener('show-alert', showAlertStub); - const getBlameStub = sinon.stub(element.restApiService, 'getBlame') + const getBlameStub = stubRestApi('getBlame') .returns(Promise.resolve(mockBlame)); element.changeNum = 42; element.patchRange = {patchNum: 5, basePatchNum: 4}; @@ -725,7 +741,7 @@ const mockBlame = []; const showAlertStub = sinon.stub(); element.addEventListener('show-alert', showAlertStub); - sinon.stub(element.restApiService, 'getBlame') + stubRestApi('getBlame') .returns(Promise.resolve(mockBlame)); element.changeNum = 42; element.patchRange = {patchNum: 5, basePatchNum: 4}; @@ -1272,7 +1288,7 @@ test('starts syntax layer processing on render event', async () => { sinon.stub(element.$.syntaxLayer, 'process') .returns(Promise.resolve()); - sinon.stub(element.restApiService, 'getDiff').returns( + stubRestApi('getDiff').returns( Promise.resolve({content: []})); element.reload(); await flush();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector_test.js b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector_test.js index 049f01d..f554227 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector_test.js +++ b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-diff-mode-selector.js'; import {DiffViewMode} from '../../../constants/constants.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-diff-mode-selector'); @@ -40,7 +41,7 @@ }); test('setMode', () => { - const saveStub = sinon.stub(element.restApiService, 'savePreferences'); + const saveStub = stubRestApi('savePreferences'); // Setting the mode initially does not save prefs. element.saveOnChange = true;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js index 72e1a8f..91d0187 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js +++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
@@ -29,6 +29,7 @@ createRevisions, createComment, } from '../../../test/test-data-generators.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-diff-view'); @@ -88,43 +89,24 @@ }; } + let getDiffChangeDetailStub; + let getReviewedFilesStub; setup(async () => { clock = sinon.useFakeTimers(); - stub('gr-rest-api-interface', { - getConfig() { - return Promise.resolve({change: {}}); - }, - getLoggedIn() { - return Promise.resolve(false); - }, - getProjectConfig() { - return Promise.resolve({}); - }, - getDiffChangeDetail() { - return Promise.resolve({}); - }, - getChangeFiles() { - return Promise.resolve({}); - }, - saveFileReviewed() { - return Promise.resolve(); - }, - getDiffComments() { - return Promise.resolve({}); - }, - getDiffRobotComments() { - return Promise.resolve({}); - }, - getDiffDrafts() { - return Promise.resolve({}); - }, - getPortedComments() { - return Promise.resolve({}); - }, - getReviewedFiles() { - return Promise.resolve([]); - }, - }); + stubRestApi('getConfig').returns(Promise.resolve({change: {}})); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('getProjectConfig').returns(Promise.resolve({})); + getDiffChangeDetailStub = stubRestApi('getDiffChangeDetail').returns( + Promise.resolve({})); + stubRestApi('getChangeFiles').returns(Promise.resolve({})); + stubRestApi('saveFileReviewed').returns(Promise.resolve()); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); + stubRestApi('getPortedComments').returns(Promise.resolve({})); + getReviewedFilesStub = stubRestApi('getReviewedFiles').returns( + Promise.resolve([])); + element = basicFixture.instantiate(); element._changeNum = '42'; element._path = 'some/path.txt'; @@ -345,13 +327,11 @@ sinon.stub(element, '_loadBlame'); sinon.stub(element.$.diffHost, 'reload').returns(Promise.resolve()); sinon.spy(element, '_paramsChanged'); - element.restApiService.getDiffChangeDetail.restore(); - sinon.stub(element.restApiService, 'getDiffChangeDetail') - .returns( - Promise.resolve({ - ...createChange(), - revisions: createRevisions(11), - })); + getDiffChangeDetailStub.returns( + Promise.resolve({ + ...createChange(), + revisions: createRevisions(11), + })); element._patchRange = { patchNum: 2, basePatchNum: 1, @@ -1218,7 +1198,7 @@ const prefsPromise = new Promise(resolve => { resolvePrefs = resolve; }); - sinon.stub(element.restApiService, 'getPreferences') + stubRestApi('getPreferences') .callsFake(() => prefsPromise); // Attach a new gr-diff-view so we can intercept the preferences fetch. @@ -1607,10 +1587,7 @@ test('_getReviewedStatus', () => { const promises = []; - element.restApiService.getReviewedFiles.restore(); - - sinon.stub(element.restApiService, 'getReviewedFiles') - .returns(Promise.resolve(['path'])); + getReviewedFilesStub.returns(Promise.resolve(['path'])); promises.push(element._getReviewedStatus(true, null, null, 'path') .then(reviewed => assert.isFalse(reviewed))); @@ -1674,7 +1651,7 @@ test('_paramsChanged sets in projectLookup', () => { sinon.stub(element, '_initLineOfInterestAndCursor'); - const setStub = sinon.stub(element.restApiService, 'setInProjectLookup'); + const setStub = stubRestApi('setInProjectLookup'); element._paramsChanged({ view: GerritNav.View.DIFF, changeNum: 101, @@ -1851,18 +1828,17 @@ 'file1.txt': {}, 'a/b/test.c': {}, }; - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({change: {}}); }, - getLoggedIn() { return Promise.resolve(false); }, - getProjectConfig() { return Promise.resolve({}); }, - getDiffChangeDetail() { return Promise.resolve({}); }, - getChangeFiles() { return Promise.resolve(changedFiles); }, - saveFileReviewed() { return Promise.resolve(); }, - getDiffComments() { return Promise.resolve({}); }, - getDiffRobotComments() { return Promise.resolve({}); }, - getDiffDrafts() { return Promise.resolve({}); }, - getReviewedFiles() { return Promise.resolve([]); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({change: {}})); + stubRestApi('getLoggedIn').returns(Promise.resolve(true)); + stubRestApi('getProjectConfig').returns(Promise.resolve({})); + stubRestApi('getDiffChangeDetail').returns(Promise.resolve({})); + stubRestApi('getChangeFiles').returns(Promise.resolve(changedFiles)); + stubRestApi('saveFileReviewed').returns(Promise.resolve()); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); + stubRestApi('getReviewedFiles').returns( + Promise.resolve([])); element = basicFixture.instantiate(); element._changeNum = '42'; return element._loadComments();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.js index c5a8db4..fbe996d 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.js +++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.js
@@ -16,7 +16,6 @@ */ import '../../../test/common-test-setup-karma.js'; -import '../../shared/gr-rest-api-interface/gr-rest-api-interface.js'; import {getMockDiffResponse} from '../../../test/mocks/diff-response.js'; import './gr-diff.js'; import {flush} from '@polymer/polymer/lib/legacy/polymer.dom.js'; @@ -26,6 +25,7 @@ import {runA11yAudit} from '../../../test/a11y-test-utils.js'; import '@polymer/paper-button/paper-button.js'; import {SPECIAL_PATCH_SET_NUM} from '../../../utils/patch-set-util.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-diff'); @@ -176,9 +176,7 @@ suite('not logged in', () => { setup(() => { const getLoggedInPromise = Promise.resolve(false); - stub('gr-rest-api-interface', { - getLoggedIn() { return getLoggedInPromise; }, - }); + stubRestApi('getLoggedIn').returns(getLoggedInPromise); element = basicFixture.instantiate(); return getLoggedInPromise; });
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.js b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.js index 15841d9..8b40db3 100644 --- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.js +++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.js
@@ -26,6 +26,7 @@ import {html} from '@polymer/polymer/lib/utils/html-tag.js'; import {SPECIAL_PATCH_SET_NUM} from '../../../utils/patch-set-util.js'; import {ChangeComments} from '../gr-comment-api/gr-comment-api.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const commentApiMockElement = createCommentApiMockWithTemplateElement( 'gr-patch-range-select-comment-api-mock', html` @@ -50,11 +51,9 @@ } setup(() => { - stub('gr-rest-api-interface', { - getDiffComments() { return Promise.resolve({}); }, - getDiffRobotComments() { return Promise.resolve({}); }, - getDiffDrafts() { return Promise.resolve({}); }, - }); + stubRestApi('getDiffComments').returns(Promise.resolve({})); + stubRestApi('getDiffRobotComments').returns(Promise.resolve({})); + stubRestApi('getDiffDrafts').returns(Promise.resolve({})); // Element must be wrapped in an element with direct access to the // comment API.
diff --git a/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search_test.js b/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search_test.js index 79d40b5..f5e47ca 100644 --- a/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search_test.js +++ b/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search_test.js
@@ -19,6 +19,7 @@ import './gr-documentation-search.js'; import {page} from '../../../utils/page-wrapper-utils.js'; import 'lodash/lodash.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-documentation-search'); @@ -45,11 +46,8 @@ suite('list with searches for documentation', () => { setup(done => { documentationSearches = _.times(26, documentationGenerator); - stub('gr-rest-api-interface', { - getDocumentationSearches() { - return Promise.resolve(documentationSearches); - }, - }); + stubRestApi('getDocumentationSearches').returns( + Promise.resolve(documentationSearches)); element._paramsChanged(value).then(() => { flush(done); }); }); @@ -70,19 +68,12 @@ _.times(1, documentationSearches); }); - test('_paramsChanged', done => { - sinon.stub( - element.restApiService, - 'getDocumentationSearches') - .callsFake(() => Promise.resolve(documentationSearches)); - const value = { - filter: 'test', - }; - element._paramsChanged(value).then(() => { - assert.isTrue(element.restApiService.getDocumentationSearches.lastCall - .calledWithExactly('test')); - done(); - }); + test('_paramsChanged', async () => { + const stub = stubRestApi('getDocumentationSearches').returns( + Promise.resolve(documentationSearches)); + const value = {filter: 'test'}; + await element._paramsChanged(value); + assert.isTrue(stub.lastCall.calledWithExactly('test')); }); });
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.js b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.js index e366233..be6ffc4 100644 --- a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.js +++ b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.js
@@ -19,6 +19,7 @@ import './gr-edit-controls.js'; import {PolymerElement} from '@polymer/polymer/polymer-element.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-edit-controls'); @@ -35,8 +36,7 @@ showDialogSpy = sinon.spy(element, '_showDialog'); closeDialogSpy = sinon.spy(element, '_closeDialog'); sinon.stub(element, '_hideAllDialogs'); - queryStub = sinon.stub(element.restApiService, 'queryChangeFiles') - .returns(Promise.resolve([])); + queryStub = stubRestApi('queryChangeFiles').returns(Promise.resolve([])); flush(); }); @@ -114,7 +114,7 @@ setup(() => { navStub = sinon.stub(GerritNav, 'navigateToChange'); - deleteStub = sinon.stub(element.restApiService, 'deleteFileInChangeEdit'); + deleteStub = stubRestApi('deleteFileInChangeEdit'); deleteAutocomplete = element.$.deleteDialog.querySelector('gr-autocomplete'); }); @@ -198,7 +198,7 @@ setup(() => { navStub = sinon.stub(GerritNav, 'navigateToChange'); - renameStub = sinon.stub(element.restApiService, 'renameFileInChangeEdit'); + renameStub = stubRestApi('renameFileInChangeEdit'); renameAutocomplete = element.$.renameDialog.querySelector('gr-autocomplete'); }); @@ -291,7 +291,7 @@ setup(() => { navStub = sinon.stub(GerritNav, 'navigateToChange'); - restoreStub = sinon.stub(element.restApiService, + restoreStub = stubRestApi( 'restoreFileInChangeEdit'); }); @@ -356,7 +356,7 @@ setup(() => { navStub = sinon.stub(GerritNav, 'navigateToChange'); - fileStub = sinon.stub(element.restApiService, 'saveFileUploadChangeEdit'); + fileStub = stubRestApi('saveFileUploadChangeEdit'); }); test('_handleUploadConfirm', () => {
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.js b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.js index 419e63e..03e0b4c 100644 --- a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.js +++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.js
@@ -20,6 +20,7 @@ import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import {SPECIAL_PATCH_SET_NUM} from '../../../utils/patch-set-util.js'; import {HttpMethod} from '../../../constants/constants.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-editor-view'); @@ -37,15 +38,10 @@ }; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - getEditPreferences() { return Promise.resolve({}); }, - }); - element = basicFixture.instantiate(); - savePathStub = sinon.stub(element.restApiService, 'renameFileInChangeEdit'); - saveFileStub = sinon.stub(element.restApiService, 'saveChangeEdit'); - changeDetailStub = sinon.stub(element.restApiService, + savePathStub = stubRestApi('renameFileInChangeEdit'); + saveFileStub = stubRestApi('saveChangeEdit'); + changeDetailStub = stubRestApi( 'getDiffChangeDetail'); navigateStub = sinon.stub(element, '_viewEditInChangeView'); }); @@ -200,7 +196,7 @@ const saveSpy = sinon.spy(element, '_saveEdit'); const alertStub = sinon.stub(element, '_showAlert'); const changeActionsStub = - sinon.stub(element.restApiService, 'executeChangeAction'); + stubRestApi('executeChangeAction'); saveFileStub.returns(Promise.resolve({ok: true})); element._newContent = newText; flush(); @@ -256,7 +252,7 @@ }); test('res.ok', () => { - sinon.stub(element.restApiService, 'getFileContent') + stubRestApi('getFileContent') .returns(Promise.resolve({ ok: true, type: 'text/javascript', @@ -272,7 +268,7 @@ }); test('!res.ok', () => { - sinon.stub(element.restApiService, 'getFileContent') + stubRestApi('getFileContent') .returns(Promise.resolve({})); // Ensure no data is set with a bad response. @@ -284,7 +280,7 @@ }); test('content is undefined', () => { - sinon.stub(element.restApiService, 'getFileContent') + stubRestApi('getFileContent') .returns(Promise.resolve({ ok: true, type: 'text/javascript', @@ -298,7 +294,7 @@ }); test('content and type is undefined', () => { - sinon.stub(element.restApiService, 'getFileContent') + stubRestApi('getFileContent') .returns(Promise.resolve({ ok: true, })); @@ -383,7 +379,7 @@ test('local edit exists', () => { sinon.stub(element.$.storage, 'getEditableContentItem') .returns({message: 'pending edit'}); - sinon.stub(element.restApiService, 'getFileContent') + stubRestApi('getFileContent') .returns(Promise.resolve({ ok: true, type: 'text/javascript', @@ -406,7 +402,7 @@ test('local edit exists, is same as remote edit', () => { sinon.stub(element.$.storage, 'getEditableContentItem') .returns({message: 'pending edit'}); - sinon.stub(element.restApiService, 'getFileContent') + stubRestApi('getFileContent') .returns(Promise.resolve({ ok: true, type: 'text/javascript',
diff --git a/polygerrit-ui/app/elements/gr-app-global-var-init.ts b/polygerrit-ui/app/elements/gr-app-global-var-init.ts index 7a27b03..8a632bb 100644 --- a/polygerrit-ui/app/elements/gr-app-global-var-init.ts +++ b/polygerrit-ui/app/elements/gr-app-global-var-init.ts
@@ -36,7 +36,6 @@ import {GrPluginActionContext} from './shared/gr-js-api-interface/gr-plugin-action-context'; import { getPluginNameFromUrl, - getRestAPI, PLUGIN_LOADING_TIMEOUT_MS, PRELOADED_PROTOCOL, send, @@ -62,7 +61,6 @@ window._apiUtils = { getPluginNameFromUrl, send, - getRestAPI, getBaseUrl, PRELOADED_PROTOCOL, PLUGIN_LOADING_TIMEOUT_MS,
diff --git a/polygerrit-ui/app/elements/gr-app_test.js b/polygerrit-ui/app/elements/gr-app_test.js index 013d9387..1a04411 100644 --- a/polygerrit-ui/app/elements/gr-app_test.js +++ b/polygerrit-ui/app/elements/gr-app_test.js
@@ -20,11 +20,13 @@ import {appContext} from '../services/app-context.js'; import {GerritNav} from './core/gr-navigation/gr-navigation.js'; import {html} from '@polymer/polymer/lib/utils/html-tag.js'; +import {stubRestApi} from '../test/test-utils.js'; const basicFixture = fixtureFromTemplate(html`<gr-app id="app"></gr-app>`); suite('gr-app tests', () => { let element; + let configStub; setup(done => { sinon.stub(appContext.reportingService, 'appStarted'); @@ -34,23 +36,17 @@ stub('gr-router', { start: sinon.stub(), }); - stub('gr-rest-api-interface', { - getAccount() { return Promise.resolve({}); }, - getAccountCapabilities() { return Promise.resolve({}); }, - getConfig() { - return Promise.resolve({ - plugin: {}, - auth: { - auth_type: undefined, - }, - }); + stubRestApi('getAccount').returns(Promise.resolve({})); + stubRestApi('getAccountCapabilities').returns(Promise.resolve({})); + configStub = stubRestApi('getConfig').returns(Promise.resolve({ + plugin: {}, + auth: { + auth_type: undefined, }, - getPreferences() { return Promise.resolve({my: []}); }, - getDiffPreferences() { return Promise.resolve({}); }, - getEditPreferences() { return Promise.resolve({}); }, - getVersion() { return Promise.resolve(42); }, - probePath() { return Promise.resolve(42); }, - }); + })); + stubRestApi('getPreferences').returns(Promise.resolve({my: []})); + stubRestApi('getVersion').returns(Promise.resolve(42)); + stubRestApi('probePath').returns(Promise.resolve(42)); element = basicFixture.instantiate(); flush(done); @@ -69,12 +65,11 @@ sinon.assert.callOrder(appStartedStub, routerStartStub); }); - test('passes config to gr-plugin-host', () => { - const config = appElement().restApiService.getConfig; - return config.lastCall.returnValue.then(config => { + test('passes config to gr-plugin-host', () => + configStub.lastCall.returnValue.then(config => { assert.deepEqual(appElement().$.plugins.config, config); - }); - }); + }) + ); test('_paramsChanged sets search page', () => { appElement()._paramsChanged({base: {view: GerritNav.View.CHANGE}});
diff --git a/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info_test.js b/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info_test.js index a92c023..c7cb44e 100644 --- a/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info_test.js +++ b/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-account-info.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-account-info'); @@ -46,13 +47,11 @@ }; config = {auth: {editable_account_fields: []}}; - stub('gr-rest-api-interface', { - getAccount() { return Promise.resolve(account); }, - getConfig() { return Promise.resolve(config); }, - getPreferences() { - return Promise.resolve({time_format: 'HHMM_12'}); - }, - }); + stubRestApi('getAccount').returns(Promise.resolve(account)); + stubRestApi('getConfig').returns(Promise.resolve(config)); + stubRestApi('getPreferences').returns( + Promise.resolve({time_format: 'HHMM_12'})); + element = basicFixture.instantiate(); // Allow the element to render. element.loadData().then(() => { flush(done); }); @@ -133,11 +132,11 @@ element.set('_serverConfig', {auth: {editable_account_fields: ['FULL_NAME', 'USER_NAME']}}); - nameStub = sinon.stub(element.restApiService, 'setAccountName').callsFake( + nameStub = stubRestApi('setAccountName').callsFake( name => Promise.resolve()); - usernameStub = sinon.stub(element.restApiService, 'setAccountUsername') + usernameStub = stubRestApi('setAccountUsername') .callsFake(username => Promise.resolve()); - statusStub = sinon.stub(element.restApiService, + statusStub = stubRestApi( 'setAccountStatus').callsFake( status => Promise.resolve()); }); @@ -218,12 +217,12 @@ element.set('_serverConfig', {auth: {editable_account_fields: ['FULL_NAME']}}); - nameStub = sinon.stub(element.restApiService, 'setAccountName').callsFake( + nameStub = stubRestApi('setAccountName').callsFake( name => Promise.resolve()); - statusStub = sinon.stub(element.restApiService, + statusStub = stubRestApi( 'setAccountStatus').callsFake( status => Promise.resolve()); - sinon.stub(element.restApiService, 'setAccountUsername').callsFake( + stubRestApi('setAccountUsername').callsFake( username => Promise.resolve()); }); @@ -263,7 +262,7 @@ element.set('_serverConfig', {auth: {editable_account_fields: []}}); - statusStub = sinon.stub(element.restApiService, + statusStub = stubRestApi( 'setAccountStatus').callsFake( status => Promise.resolve()); });
diff --git a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list_test.js b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list_test.js index 0c785aa..c8ce574 100644 --- a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list_test.js +++ b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-agreements-list.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-agreements-list'); @@ -31,9 +32,7 @@ name: 'Agreements 1', }]; - stub('gr-rest-api-interface', { - getAccountAgreements() { return Promise.resolve(agreements); }, - }); + stubRestApi('getAccountAgreements').returns(Promise.resolve(agreements)); element = basicFixture.instantiate();
diff --git a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view_test.js b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view_test.js index aeacea4..7c11136 100644 --- a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view_test.js +++ b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-cla-view.js'; import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-cla-view'); @@ -105,11 +106,10 @@ ]; setup(done => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve(config); }, - getAccountGroups() { return Promise.resolve(groups); }, - getAccountAgreements() { return Promise.resolve(signedAgreements); }, - }); + stubRestApi('getConfig').returns(Promise.resolve(config)); + stubRestApi('getAccountGroups').returns(Promise.resolve(groups)); + stubRestApi('getAccountAgreements').returns( + Promise.resolve(signedAgreements)); element = basicFixture.instantiate(); element.loadData().then(() => { flush(done); }); });
diff --git a/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences_test.js b/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences_test.js index 01c6861..cffd1ae 100644 --- a/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences_test.js +++ b/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-edit-preferences.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-edit-preferences'); @@ -56,11 +57,7 @@ theme: 'DEFAULT', }; - stub('gr-rest-api-interface', { - getEditPreferences() { - return Promise.resolve(editPreferences); - }, - }); + stubRestApi('getEditPreferences').returns(Promise.resolve(editPreferences)); element = basicFixture.instantiate(); @@ -92,7 +89,7 @@ }); test('save changes', () => { - sinon.stub(element.restApiService, 'saveEditPreferences') + stubRestApi('saveEditPreferences') .returns(Promise.resolve()); const showTabsCheckbox = valueOf('Show tabs', 'editPreferences') .firstElementChild;
diff --git a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.ts b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.ts index 143d49c..bc4a4d2 100644 --- a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.ts +++ b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.ts
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-email-editor.js'; import {GrEmailEditor} from './gr-email-editor'; +import {spyRestApi, stubRestApi} from '../../../test/test-utils'; const basicFixture = fixtureFromElement('gr-email-editor'); @@ -31,11 +32,7 @@ {email: 'email@three.com'}, ]; - stub('gr-rest-api-interface', { - getAccountEmails() { - return Promise.resolve(emails); - }, - }); + stubRestApi('getAccountEmails').returns(Promise.resolve(emails)); element = basicFixture.instantiate(); @@ -113,15 +110,9 @@ assert.equal(element._emailsToRemove[0].email, 'email@three.com'); }); - test('save changes', done => { - const deleteEmailStub = sinon.stub( - element.restApiService, - 'deleteAccountEmail' - ); - const setPreferredStub = sinon.stub( - element.restApiService, - 'setPreferredAccountEmail' - ); + test('save changes', async () => { + const deleteEmailSpy = spyRestApi('deleteAccountEmail'); + const setPreferredSpy = spyRestApi('setPreferredAccountEmail'); const rows = element .shadowRoot!.querySelector('table')! @@ -142,15 +133,10 @@ assert.equal(element._emailsToRemove[0].email, 'email@one.com'); assert.equal(element._emails.length, 2); - // Save the changes. - element.save().then(() => { - assert.equal(deleteEmailStub.callCount, 1); - assert.equal(deleteEmailStub.getCall(0).args[0], 'email@one.com'); - - assert.isTrue(setPreferredStub.called); - assert.equal(setPreferredStub.getCall(0).args[0], 'email@three.com'); - - done(); - }); + await element.save(); + assert.equal(deleteEmailSpy.callCount, 1); + assert.equal(deleteEmailSpy.getCall(0).args[0], 'email@one.com'); + assert.isTrue(setPreferredSpy.called); + assert.equal(setPreferredSpy.getCall(0).args[0], 'email@three.com'); }); });
diff --git a/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor_test.js b/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor_test.js index 1a84aeb4..8820748 100644 --- a/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor_test.js +++ b/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-gpg-editor.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-gpg-editor'); @@ -50,9 +51,7 @@ }, }; - stub('gr-rest-api-interface', { - getAccountGPGKeys() { return Promise.resolve(keys); }, - }); + stubRestApi('getAccountGPGKeys').returns(Promise.resolve(keys)); element = basicFixture.instantiate(); @@ -74,7 +73,7 @@ test('remove key', done => { const lastKey = keys[Object.keys(keys)[1]]; - const saveStub = sinon.stub(element.restApiService, 'deleteAccountGPGKey') + const saveStub = stubRestApi('deleteAccountGPGKey') .callsFake(() => Promise.resolve()); assert.equal(element._keysToRemove.length, 0); @@ -130,7 +129,7 @@ }, }; - const addStub = sinon.stub(element.restApiService, + const addStub = stubRestApi( 'addAccountGPGKey').callsFake( () => Promise.resolve(newKeyObject)); @@ -156,7 +155,7 @@ test('add invalid key', done => { const newKeyString = 'not even close to valid'; - const addStub = sinon.stub(element.restApiService, + const addStub = stubRestApi( 'addAccountGPGKey').callsFake( () => Promise.reject(new Error('error')));
diff --git a/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list_test.js b/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list_test.js index e19345a..e048103 100644 --- a/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list_test.js +++ b/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-group-list.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-group-list'); @@ -45,9 +46,7 @@ name: 'Group 3', }]; - stub('gr-rest-api-interface', { - getAccountGroups() { return Promise.resolve(groups); }, - }); + stubRestApi('getAccountGroups').returns(Promise.resolve(groups)); element = basicFixture.instantiate();
diff --git a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.js b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.js index 6f47952..e403b4f 100644 --- a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.js +++ b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-http-password.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-http-password'); @@ -29,10 +30,8 @@ account = {username: 'user name'}; config = {auth: {}}; - stub('gr-rest-api-interface', { - getAccount() { return Promise.resolve(account); }, - getConfig() { return Promise.resolve(config); }, - }); + stubRestApi('getAccount').returns(Promise.resolve(account)); + stubRestApi('getConfig').returns(Promise.resolve(config)); element = basicFixture.instantiate(); element.loadData().then(() => { flush(done); }); @@ -42,7 +41,7 @@ const button = element.$.generateButton; const nextPassword = 'the new password'; let generateResolve; - const generateStub = sinon.stub(element.restApiService, + const generateStub = stubRestApi( 'generateAccountHttpPassword') .callsFake(() => new Promise(resolve => { generateResolve = resolve;
diff --git a/polygerrit-ui/app/elements/settings/gr-identities/gr-identities_test.js b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities_test.js index 8af5bd0..867473f 100644 --- a/polygerrit-ui/app/elements/settings/gr-identities/gr-identities_test.js +++ b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-identities.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-identities'); @@ -39,14 +40,12 @@ }, ]; - setup(done => { - stub('gr-rest-api-interface', { - getExternalIds() { return Promise.resolve(ids); }, - }); + setup(async () => { + stubRestApi('getExternalIds').returns(Promise.resolve(ids)); element = basicFixture.instantiate(); - - element.loadData().then(() => { flush(done); }); + await element.loadData(); + await flush(); }); test('renders', () => {
diff --git a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog_test.js b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog_test.js index 468ef57..ce9c106 100644 --- a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog_test.js +++ b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog_test.js
@@ -16,6 +16,7 @@ */ import '../../../test/common-test-setup-karma.js'; import './gr-registration-dialog.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-registration-dialog'); @@ -38,27 +39,21 @@ ], }; - stub('gr-rest-api-interface', { - getAccount() { - return Promise.resolve(account); - }, - setAccountName(name) { - account.name = name; - return Promise.resolve(); - }, - setAccountUsername(username) { - account.username = username; - return Promise.resolve(); - }, - setPreferredAccountEmail(email) { - account.email = email; - return Promise.resolve(); - }, - getConfig() { - return Promise.resolve( - {auth: {editable_account_fields: ['USER_NAME']}}); - }, + stubRestApi('getAccount').returns(Promise.resolve(account)); + stubRestApi('setAccountName').callsFake(name => { + account.name = name; + return Promise.resolve(); }); + stubRestApi('setAccountUsername').callsFake(username => { + account.username = username; + return Promise.resolve(); + }); + stubRestApi('setPreferredAccountEmail').callsFake(email => { + account.email = email; + return Promise.resolve(); + }); + stubRestApi('getConfig').returns( + Promise.resolve({auth: {editable_account_fields: ['USER_NAME']}})); element = basicFixture.instantiate();
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.js b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.js index 4c5a2a2..98abb3fb 100644 --- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.js +++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.js
@@ -20,6 +20,7 @@ import './gr-settings-view.js'; import {flush} from '@polymer/polymer/lib/legacy/polymer.dom.js'; import {GerritView} from '../../../services/router/router-model.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-settings-view'); const blankFixture = fixtureFromElement('div'); @@ -51,7 +52,7 @@ } function stubAddAccountEmail(statusCode) { - return sinon.stub(element.restApiService, 'addAccountEmail').callsFake( + return stubRestApi('addAccountEmail').callsFake( () => Promise.resolve({status: statusCode})); } @@ -82,17 +83,10 @@ }; config = {auth: {editable_account_fields: []}}; - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - getAccount() { return Promise.resolve(account); }, - getPreferences() { return Promise.resolve(preferences); }, - getWatchedProjects() { - return Promise.resolve([]); - }, - getAccountEmails() { return Promise.resolve(); }, - getConfig() { return Promise.resolve(config); }, - getAccountGroups() { return Promise.resolve([]); }, - }); + stubRestApi('getAccount').returns(Promise.resolve(account)); + stubRestApi('getPreferences').returns(Promise.resolve(preferences)); + stubRestApi('getAccountEmails').returns(Promise.resolve()); + stubRestApi('getConfig').returns(Promise.resolve(config)); element = basicFixture.instantiate(); // Allow the element to render. @@ -179,13 +173,11 @@ assert.isTrue(element._prefsChanged); assert.isFalse(element._menuChanged); - stub('gr-rest-api-interface', { - savePreferences(prefs) { - assert.equal(prefs.diff_view, 'SIDE_BY_SIDE'); - assertMenusEqual(prefs.my, preferences.my); - assert.equal(prefs.publish_comments_on_push, true); - return Promise.resolve(); - }, + stubRestApi('savePreferences').callsFake(prefs => { + assert.equal(prefs.diff_view, 'SIDE_BY_SIDE'); + assertMenusEqual(prefs.my, preferences.my); + assert.equal(prefs.publish_comments_on_push, true); + return Promise.resolve(); }); // Save the change. @@ -204,11 +196,9 @@ assert.isFalse(element._menuChanged); assert.isTrue(element._prefsChanged); - stub('gr-rest-api-interface', { - savePreferences(prefs) { - assert.equal(prefs.publish_comments_on_push, true); - return Promise.resolve(); - }, + stubRestApi('savePreferences').callsFake(prefs => { + assert.equal(prefs.publish_comments_on_push, true); + return Promise.resolve(); }); // Save the change. @@ -228,11 +218,9 @@ assert.isFalse(element._menuChanged); assert.isTrue(element._prefsChanged); - stub('gr-rest-api-interface', { - savePreferences(prefs) { - assert.equal(prefs.work_in_progress_by_default, true); - return Promise.resolve(); - }, + stubRestApi('savePreferences').callsFake(prefs => { + assert.equal(prefs.work_in_progress_by_default, true); + return Promise.resolve(); }); // Save the change. @@ -263,11 +251,9 @@ assert.isTrue(element._menuChanged); assert.isFalse(element._prefsChanged); - stub('gr-rest-api-interface', { - savePreferences(prefs) { - assertMenusEqual(prefs.my, element._localMenu); - return Promise.resolve(); - }, + stubRestApi('savePreferences').callsFake(prefs => { + assertMenusEqual(prefs.my, element._localMenu); + return Promise.resolve(); }); element._handleSaveMenu().then(() => { @@ -372,9 +358,7 @@ ], }; - stub('gr-rest-api-interface', { - getDefaultPreferences() { return Promise.resolve(originalMenu); }, - }); + stubRestApi('getDefaultPreferences').returns(Promise.resolve(originalMenu)); const updatedMenu = [ {url: '/first/url', name: 'first name', target: '_blank'}, @@ -474,22 +458,19 @@ suite('when email verification token is provided', () => { let resolveConfirm; + let confirmEmailStub; setup(() => { sinon.stub(element.$.emailEditor, 'loadData'); - sinon.stub( - element.restApiService, - 'confirmEmail') - .callsFake( - () => new Promise( - resolve => { resolveConfirm = resolve; })); + confirmEmailStub = stubRestApi('confirmEmail').returns( + new Promise(resolve => { resolveConfirm = resolve; })); element.params = {view: GerritView.SETTINGS, emailToken: 'foo'}; element.attached(); }); test('it is used to confirm email via rest API', () => { - assert.isTrue(element.restApiService.confirmEmail.calledOnce); - assert.isTrue(element.restApiService.confirmEmail.calledWith('foo')); + assert.isTrue(confirmEmailStub.calledOnce); + assert.isTrue(confirmEmailStub.calledWith('foo')); }); test('emails are not loaded initially', () => {
diff --git a/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor_test.js b/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor_test.js index 73e707f..8f99baa 100644 --- a/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor_test.js +++ b/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-ssh-editor.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-ssh-editor'); @@ -41,9 +42,7 @@ valid: true, }]; - stub('gr-rest-api-interface', { - getAccountSSHKeys() { return Promise.resolve(keys); }, - }); + stubRestApi('getAccountSSHKeys').returns(Promise.resolve(keys)); element = basicFixture.instantiate(); @@ -65,7 +64,7 @@ test('remove key', done => { const lastKey = keys[1]; - const saveStub = sinon.stub(element.restApiService, 'deleteAccountSSHKey') + const saveStub = stubRestApi('deleteAccountSSHKey') .callsFake(() => Promise.resolve()); assert.equal(element._keysToRemove.length, 0); @@ -116,7 +115,7 @@ valid: true, }; - const addStub = sinon.stub(element.restApiService, + const addStub = stubRestApi( 'addAccountSSHKey').callsFake( () => Promise.resolve(newKeyObject)); @@ -142,7 +141,7 @@ test('add invalid key', done => { const newKeyString = 'not even close to valid'; - const addStub = sinon.stub(element.restApiService, + const addStub = stubRestApi( 'addAccountSSHKey').callsFake( () => Promise.reject(new Error('error')));
diff --git a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.js b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.js index 2fd8900..aac8995 100644 --- a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.js +++ b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-watched-projects-editor.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-watched-projects-editor'); @@ -44,21 +45,17 @@ }, ]; - stub('gr-rest-api-interface', { - getSuggestedProjects(input) { - if (input.startsWith('th')) { - return Promise.resolve({'the project': { - id: 'the project', - state: 'ACTIVE', - web_links: [], - }}); - } else { - return Promise.resolve({}); - } - }, - getWatchedProjects() { - return Promise.resolve(projects); - }, + stubRestApi('getWatchedProjects').returns(Promise.resolve(projects)); + stubRestApi('getSuggestedProjects').callsFake(input => { + if (input.startsWith('th')) { + return Promise.resolve({'the project': { + id: 'the project', + state: 'ACTIVE', + web_links: [], + }}); + } else { + return Promise.resolve({}); + } }); element = basicFixture.instantiate();
diff --git a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label_test.js b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label_test.js index 6912776..e25bdea 100644 --- a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label_test.js +++ b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-account-label.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-account-label'); @@ -28,10 +29,8 @@ } setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getLoggedIn() { return Promise.resolve(false); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); element = basicFixture.instantiate(); element._config = { user: { @@ -104,7 +103,7 @@ }); test('tap attention button', () => { - const apiStub = sinon.stub(element.restApiService, + const apiStub = stubRestApi( 'removeFromAttentionSet') .callsFake(() => Promise.resolve()); const button = element.shadowRoot.querySelector('#attentionButton');
diff --git a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.js b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.js index 554953e..af485c6 100644 --- a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.js +++ b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-account-link.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-account-link'); @@ -25,9 +26,7 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); element = basicFixture.instantiate(); });
diff --git a/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.js b/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.js index 3acba5b..6430290 100644 --- a/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.js +++ b/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-account-list.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-account-list'); @@ -60,9 +61,7 @@ existingAccount1 = makeAccount(); existingAccount2 = makeAccount(); - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); element = basicFixture.instantiate(); element.accounts = [existingAccount1, existingAccount2]; suggestionsProvider = new MockSuggestionsProvider();
diff --git a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.js b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.js index baec672..76f058a 100644 --- a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.js +++ b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-avatar.js'; import {getPluginLoader} from '../gr-js-api-interface/gr-plugin-loader.js'; +import {appContext} from '../../../services/app-context.js'; const basicFixture = fixtureFromElement('gr-avatar'); @@ -104,7 +105,7 @@ getPluginLoader().loadPlugins([]); return Promise.all([ - element.restApiService.getConfig(), + appContext.restApiService.getConfig(), getPluginLoader().awaitPluginsLoaded(), ]).then(() => { assert.isFalse(element.hasAttribute('hidden')); @@ -134,7 +135,7 @@ getPluginLoader().loadPlugins([]); return Promise.all([ - element.restApiService.getConfig(), + appContext.restApiService.getConfig(), getPluginLoader().awaitPluginsLoaded(), ]).then(() => { assert.isTrue(element.hasAttribute('hidden')); @@ -167,7 +168,7 @@ getPluginLoader().loadPlugins([]); return Promise.all([ - element.restApiService.getConfig(), + appContext.restApiService.getConfig(), getPluginLoader().awaitPluginsLoaded(), ]).then(() => { assert.isTrue(element.hasAttribute('hidden'));
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts index c8409fa..b70a55a 100644 --- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts +++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread_test.ts
@@ -45,6 +45,7 @@ pressAndReleaseKeyOn, } from '@polymer/iron-test-helpers/mock-interactions'; import {html} from '@polymer/polymer/lib/utils/html-tag.js'; +import {stubRestApi} from '../../../test/test-utils'; const basicFixture = fixtureFromElement('gr-comment-thread'); @@ -55,11 +56,7 @@ let element: GrCommentThread; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { - return Promise.resolve(false); - }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); element = basicFixture.instantiate(); element.patchNum = 3 as PatchSetNum; @@ -239,12 +236,12 @@ test('setting project name loads the project config', done => { const projectName = 'foo/bar/baz' as RepoName; - const getProjectStub = sinon - .stub(element.restApiService, 'getProjectConfig') - .returns(Promise.resolve({} as ConfigInfo)); + const getProjectStub = stubRestApi('getProjectConfig').returns( + Promise.resolve({} as ConfigInfo) + ); element.projectName = projectName; flush(() => { - assert.isTrue(getProjectStub.calledWithExactly(projectName)); + assert.isTrue(getProjectStub.calledWithExactly(projectName as never)); done(); }); }); @@ -309,38 +306,34 @@ let element: GrCommentThread; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { - return Promise.resolve(false); - }, - saveDiffDraft() { - return Promise.resolve(({ - headers: {} as Headers, - redirected: false, - status: 200, - statusText: '', - type: '' as ResponseType, - url: '', - ok: true, - text() { - return Promise.resolve( - ")]}'\n" + - JSON.stringify({ - id: '7afa4931_de3d65bd', - path: '/path/to/file.txt', - line: 5, - in_reply_to: 'baf0414d_60047215' as UrlEncodedCommentId, - updated: '2015-12-21 02:01:10.850000000', - message: 'Done', - }) - ); - }, - } as unknown) as Response); - }, - deleteDiffDraft() { - return Promise.resolve(({ok: true} as unknown) as Response); - }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('saveDiffDraft').returns( + Promise.resolve(({ + headers: {} as Headers, + redirected: false, + status: 200, + statusText: '', + type: '' as ResponseType, + url: '', + ok: true, + text() { + return Promise.resolve( + ")]}'\n" + + JSON.stringify({ + id: '7afa4931_de3d65bd', + path: '/path/to/file.txt', + line: 5, + in_reply_to: 'baf0414d_60047215' as UrlEncodedCommentId, + updated: '2015-12-21 02:01:10.850000000', + message: 'Done', + }) + ); + }, + } as unknown) as Response) + ); + stubRestApi('deleteDiffDraft').returns( + Promise.resolve(({ok: true} as unknown) as Response) + ); element = withCommentFixture.instantiate(); element.patchNum = 1 as PatchSetNum; element.changeNum = 1 as NumericChangeId; @@ -930,32 +923,28 @@ let element: GrCommentThread; setup(() => { - stub('gr-rest-api-interface', { - getLoggedIn() { - return Promise.resolve(false); - }, - saveDiffDraft() { - return Promise.resolve(({ - ok: true, - text() { - return Promise.resolve( - ")]}'\n" + - JSON.stringify({ - id: '7afa4931_de3d65bd', - path: '/path/to/file.txt', - line: 5, - in_reply_to: 'baf0414d_60047215' as UrlEncodedCommentId, - updated: '2015-12-21 02:01:10.850000000', - message: 'Done', - }) - ); - }, - } as unknown) as Response); - }, - deleteDiffDraft() { - return Promise.resolve(({ok: true} as unknown) as Response); - }, - }); + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); + stubRestApi('saveDiffDraft').returns( + Promise.resolve(({ + ok: true, + text() { + return Promise.resolve( + ")]}'\n" + + JSON.stringify({ + id: '7afa4931_de3d65bd', + path: '/path/to/file.txt', + line: 5, + in_reply_to: 'baf0414d_60047215' as UrlEncodedCommentId, + updated: '2015-12-21 02:01:10.850000000', + message: 'Done', + }) + ); + }, + } as unknown) as Response) + ); + stubRestApi('deleteDiffDraft').returns( + Promise.resolve(({ok: true} as unknown) as Response) + ); element = withCommentFixture.instantiate(); element.patchNum = 1 as PatchSetNum; element.changeNum = 1 as NumericChangeId;
diff --git a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.js b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.js index cc89a7e..ea46ea1 100644 --- a/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.js +++ b/polygerrit-ui/app/elements/shared/gr-comment/gr-comment_test.js
@@ -20,6 +20,7 @@ import {html} from '@polymer/polymer/lib/utils/html-tag.js'; import {__testOnly_UNSAVED_MESSAGE} from './gr-comment.js'; import {SpecialFilePath, Side} from '../../../constants/constants.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-comment'); @@ -39,16 +40,12 @@ let openOverlaySpy; setup(() => { - stub('gr-rest-api-interface', { - getAccount() { - return Promise.resolve({ - email: 'dhruvsri@google.com', - name: 'Dhruv Srivastava', - _account_id: 1083225, - avatars: [{url: 'abc', height: 32}], - }); - }, - }); + stubRestApi('getAccount').returns(Promise.resolve({ + email: 'dhruvsri@google.com', + name: 'Dhruv Srivastava', + _account_id: 1083225, + avatars: [{url: 'abc', height: 32}], + })); element = basicFixture.instantiate(); element.comment = { author: { @@ -274,8 +271,7 @@ }); test('delete comment', done => { - sinon.stub( - element.restApiService, 'deleteComment').returns(Promise.resolve({})); + const stub = stubRestApi('deleteComment').returns(Promise.resolve({})); sinon.spy(element.confirmDeleteOverlay, 'open'); element.changeNum = 42; element.patchNum = 0xDEADBEEF; @@ -292,7 +288,7 @@ .querySelector('#confirmDeleteComment'); dialog.message = 'removal reason'; element._handleConfirmDeleteComment(); - assert.isTrue(element.restApiService.deleteComment.calledWith( + assert.isTrue(stub.calledWith( 42, 0xDEADBEEF, 'baf0414d_60047215', 'removal reason')); done(); }); @@ -374,7 +370,7 @@ element.patchNum = 1; const updateRequestStub = sinon.stub(element, '_updateRequestToast'); const diffDraftStub = - sinon.stub(element.restApiService, 'saveDiffDraft').returns( + stubRestApi('saveDiffDraft').returns( Promise.resolve({ok: false})); element._saveDraft({id: 'abc_123'}); flush(() => { @@ -410,7 +406,7 @@ element.patchNum = 1; const updateRequestStub = sinon.stub(element, '_updateRequestToast'); const diffDraftStub = - sinon.stub(element.restApiService, 'saveDiffDraft').returns( + stubRestApi('saveDiffDraft').returns( Promise.reject(new Error())); element._saveDraft({id: 'abc_123'}); flush(() => { @@ -445,29 +441,23 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getAccount() { return Promise.resolve(null); }, - getConfig() { return Promise.resolve({}); }, - saveDiffDraft() { - return Promise.resolve({ - ok: true, - text() { - return Promise.resolve( - ')]}\'\n{' + - '"id": "baf0414d_40572e03",' + - '"path": "/path/to/file",' + - '"line": 5,' + - '"updated": "2015-12-08 21:52:36.177000000",' + - '"message": "saved!"' + - '}' - ); - }, - }); + stubRestApi('getAccount').returns(Promise.resolve(null)); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('saveDiffDraft').returns(Promise.resolve({ + ok: true, + text() { + return Promise.resolve( + ')]}\'\n{' + + '"id": "baf0414d_40572e03",' + + '"path": "/path/to/file",' + + '"line": 5,' + + '"updated": "2015-12-08 21:52:36.177000000",' + + '"message": "saved!"' + + '}' + ); }, - removeChangeReviewer() { - return Promise.resolve({ok: true}); - }, - }); + })); + stubRestApi('removeChangeReviewer').returns(Promise.resolve({ok: true})); stub('gr-storage', { getDraftComment() { return null; }, }); @@ -802,7 +792,7 @@ test('storage is cleared only after save success', () => { element._messageText = 'test'; const eraseStub = sinon.stub(element, '_eraseDraftComment'); - sinon.stub(element.restApiService, 'getResponseObject') + stubRestApi('getResponseObject') .returns(Promise.resolve({})); sinon.stub(element, '_saveDraft').returns(Promise.resolve({ok: false})); @@ -1240,9 +1230,7 @@ let clock; setup(() => { - stub('gr-rest-api-interface', { - getAccount() { return Promise.resolve(null); }, - }); + stubRestApi('getAccount').returns(Promise.resolve(null)); clock = sinon.useFakeTimers(); });
diff --git a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter_test.js b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter_test.js index 0a7f6dd..9a96c2d 100644 --- a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter_test.js +++ b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter_test.js
@@ -19,6 +19,7 @@ import './gr-date-formatter.js'; import {parseDate} from '../../../utils/date-util.js'; import {html} from '@polymer/polymer/lib/utils/html-tag.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromTemplate(html` <gr-date-formatter date-str="2015-09-24 23:30:17.033000000"></gr-date-formatter> @@ -62,10 +63,8 @@ function stubRestAPI(preferences) { const loggedInPromise = Promise.resolve(preferences !== null); const preferencesPromise = Promise.resolve(preferences); - stub('gr-rest-api-interface', { - getLoggedIn: sinon.stub().returns(loggedInPromise), - getPreferences: sinon.stub().returns(preferencesPromise), - }); + stubRestApi('getLoggedIn').returns(loggedInPromise); + stubRestApi('getPreferences').returns(preferencesPromise); return Promise.all([loggedInPromise, preferencesPromise]); }
diff --git a/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences_test.js b/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences_test.js index 6afb299..716ef2f 100644 --- a/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences_test.js +++ b/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-diff-preferences.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-diff-preferences'); @@ -50,11 +51,7 @@ ignore_whitespace: 'IGNORE_NONE', }; - stub('gr-rest-api-interface', { - getDiffPreferences() { - return Promise.resolve(diffPreferences); - }, - }); + stubRestApi('getDiffPreferences').returns(Promise.resolve(diffPreferences)); element = basicFixture.instantiate(); @@ -89,7 +86,7 @@ }); test('save changes', () => { - sinon.stub(element.restApiService, 'saveDiffPreferences') + stubRestApi('saveDiffPreferences') .returns(Promise.resolve()); const showTrailingWhitespaceCheckbox = valueOf('Show trailing whitespace', 'diffPreferences')
diff --git a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.js b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.js index 105cc2c..6427c6b 100644 --- a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.js +++ b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.js
@@ -17,7 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-download-commands.js'; -import {isHidden} from '../../../test/test-utils.js'; +import {isHidden, stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-download-commands'); @@ -50,6 +50,7 @@ suite('unauthenticated', () => { setup(async () => { + stubRestApi('getLoggedIn').returns(Promise.resolve(false)); element = basicFixture.instantiate(); element.schemes = SCHEMES; element.commands = COMMANDS; @@ -66,16 +67,12 @@ }); test('element visibility', () => { - assert.isFalse(isHidden(element.shadowRoot - .querySelector('paper-tabs'))); - assert.isFalse(isHidden(element.shadowRoot - .querySelector('.commands'))); + assert.isFalse(isHidden(element.shadowRoot.querySelector('paper-tabs'))); + assert.isFalse(isHidden(element.shadowRoot.querySelector('.commands'))); element.schemes = []; - assert.isTrue(isHidden(element.shadowRoot - .querySelector('paper-tabs'))); - assert.isTrue(isHidden(element.shadowRoot - .querySelector('.commands'))); + assert.isTrue(isHidden(element.shadowRoot.querySelector('paper-tabs'))); + assert.isTrue(isHidden(element.shadowRoot.querySelector('.commands'))); }); test('tab selection', () => { @@ -87,38 +84,30 @@ assert.equal(element.$.downloadTabs.selected, '2'); }); - test('loads scheme from preferences', () => { - stub('gr-rest-api-interface', { - getPreferences() { - return Promise.resolve({download_scheme: 'repo'}); - }, - }); + test('loads scheme from preferences', async () => { + const stub = stubRestApi('getPreferences').returns( + Promise.resolve({download_scheme: 'repo'})); element._loggedIn = true; - assert.isTrue(element.restApiService.getPreferences.called); - return element.restApiService.getPreferences.lastCall.returnValue.then( - () => { - assert.equal(element.selectedScheme, 'repo'); - }); + await flush(); + assert.isTrue(stub.called); + await stub.lastCall.returnValue; + assert.equal(element.selectedScheme, 'repo'); }); - test('normalize scheme from preferences', () => { - stub('gr-rest-api-interface', { - getPreferences() { - return Promise.resolve({download_scheme: 'REPO'}); - }, - }); + test('normalize scheme from preferences', async () => { + const stub = stubRestApi('getPreferences').returns( + Promise.resolve({download_scheme: 'REPO'})); element._loggedIn = true; - return element.restApiService.getPreferences.lastCall.returnValue.then( - () => { - assert.equal(element.selectedScheme, 'repo'); - }); + await flush(); + assert.isTrue(stub.called); + await stub.lastCall.returnValue; + assert.equal(element.selectedScheme, 'repo'); }); test('saves scheme to preferences', () => { element._loggedIn = true; - const savePrefsStub = sinon.stub(element.restApiService, - 'savePreferences') - .callsFake(() => Promise.resolve()); + const savePrefsStub = stubRestApi('savePreferences').returns( + Promise.resolve()); flush();
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.js b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.js index e3d7ed70..c2c8d68 100644 --- a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.js +++ b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-dropdown-list.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-dropdown-list'); @@ -24,9 +25,7 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); element = basicFixture.instantiate(); });
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown_test.js b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown_test.js index 515644b..02bffe4 100644 --- a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown_test.js +++ b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-dropdown.js'; import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-dropdown'); @@ -25,9 +26,7 @@ let element; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); element = basicFixture.instantiate(); });
diff --git a/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account_test.js b/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account_test.js index 8d1f499..1c67e13 100644 --- a/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account_test.js +++ b/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account_test.js
@@ -19,7 +19,7 @@ import './gr-hovercard-account.js'; import {html} from '@polymer/polymer/lib/utils/html-tag.js'; import {ReviewerState} from '../../../constants/constants.js'; -import {appContext} from '../../../services/app-context.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromTemplate(html` <gr-hovercard-account class="hovered"></gr-hovercard-account> @@ -36,10 +36,8 @@ }; setup(async () => { - sinon.stub(appContext.restApiService, 'getAccount').returns( - Promise.resolve({...ACCOUNT}) - ); - sinon.stub(appContext.restApiService, 'getConfig').returns( + stubRestApi('getAccount').returns(Promise.resolve({...ACCOUNT})); + stubRestApi('getConfig').returns( Promise.resolve({change: {enable_attention_set: true}}) ); element = basicFixture.instantiate(); @@ -111,8 +109,7 @@ [ReviewerState.REVIEWER]: [ACCOUNT], }, }; - sinon.stub(element.restApiService, 'removeChangeReviewer').returns( - Promise.resolve({ok: true})); + stubRestApi('removeChangeReviewer').returns(Promise.resolve({ok: true})); const reloadListener = sinon.spy(); element._target.addEventListener('reload', reloadListener); flush(); @@ -131,11 +128,10 @@ [ReviewerState.REVIEWER]: [ACCOUNT], }, }; - const saveReviewStub = sinon.stub(element.restApiService, + const saveReviewStub = stubRestApi( 'saveChangeReview').returns( Promise.resolve({ok: true})); - sinon.stub(element.restApiService, 'removeChangeReviewer').returns( - Promise.resolve({ok: true})); + stubRestApi('removeChangeReviewer').returns(Promise.resolve({ok: true})); const reloadListener = sinon.spy(); element._target.addEventListener('reload', reloadListener); @@ -158,11 +154,9 @@ [ReviewerState.REVIEWER]: [], }, }; - const saveReviewStub = sinon.stub(element.restApiService, - 'saveChangeReview').returns( - Promise.resolve({ok: true})); - sinon.stub(element.restApiService, 'removeChangeReviewer').returns( - Promise.resolve({ok: true})); + const saveReviewStub = stubRestApi( + 'saveChangeReview').returns(Promise.resolve({ok: true})); + stubRestApi('removeChangeReviewer').returns(Promise.resolve({ok: true})); const reloadListener = sinon.spy(); element._target.addEventListener('reload', reloadListener); flush(); @@ -185,8 +179,7 @@ [ReviewerState.REVIEWER]: [], }, }; - sinon.stub(element.restApiService, 'removeChangeReviewer').returns( - Promise.resolve({ok: true})); + stubRestApi('removeChangeReviewer').returns(Promise.resolve({ok: true})); const reloadListener = sinon.spy(); element._target.addEventListener('reload', reloadListener); @@ -207,8 +200,7 @@ const apiPromise = new Promise(r => { apiResolve = r; }); - sinon.stub(element.restApiService, 'addToAttentionSet') - .callsFake(() => apiPromise); + stubRestApi('addToAttentionSet').returns(apiPromise); element.highlightAttention = true; element._target = document.createElement('div'); flush(); @@ -240,8 +232,7 @@ const apiPromise = new Promise(r => { apiResolve = r; }); - sinon.stub(element.restApiService, 'removeFromAttentionSet') - .callsFake(() => apiPromise); + stubRestApi('removeFromAttentionSet').returns(apiPromise); element.highlightAttention = true; element.change = { attention_set: {31415926535: {}},
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-api-utils.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-api-utils.ts index 8f743e9..979b86e 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-api-utils.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-api-utils.ts
@@ -16,23 +16,13 @@ */ import {getBaseUrl} from '../../../utils/url-util'; -import {RestApiService} from '../../../services/services/gr-rest-api/gr-rest-api'; import {HttpMethod} from '../../../constants/constants'; import {RequestPayload} from '../../../types/common'; +import {appContext} from '../../../services/app-context'; export const PRELOADED_PROTOCOL = 'preloaded:'; export const PLUGIN_LOADING_TIMEOUT_MS = 10000; -let _restAPI: RestApiService | undefined; -export function getRestAPI() { - if (!_restAPI) { - _restAPI = (document.createElement( - 'gr-rest-api-interface' - ) as unknown) as RestApiService; - } - return _restAPI; -} - /** * Retrieves the name of the plugin base on the url. */ @@ -83,7 +73,7 @@ opt_callback?: (response: unknown) => void, opt_payload?: RequestPayload ) { - return getRestAPI() + return appContext.restApiService .send(method, url, opt_payload) .then(response => { if (response.status < 200 || response.status >= 300) { @@ -95,7 +85,7 @@ } }); } else { - return getRestAPI().getResponseObject(response); + return appContext.restApiService.getResponseObject(response); } }) .then(response => { @@ -105,9 +95,3 @@ return response; }); } - -// TEST only methods / properties - -export function testOnly_resetInternalState() { - _restAPI = undefined; -}
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api_test.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api_test.js index 8f41b39..52efc56 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api_test.js +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import '../../change/gr-reply-dialog/gr-reply-dialog.js'; import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-reply-dialog'); @@ -30,10 +31,8 @@ let plugin; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getAccount() { return Promise.resolve(null); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getAccount').returns(Promise.resolve(null)); }); suite('early init', () => {
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit.ts index cf254d4..74b84bc 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit.ts
@@ -24,7 +24,7 @@ PluginOptionMap, PluginLoader, } from './gr-plugin-loader'; -import {getRestAPI, send} from './gr-api-utils'; +import {send} from './gr-api-utils'; import {appContext} from '../../../services/app-context'; import {PluginApi} from '../../plugins/gr-plugin-types'; import {HttpMethod} from '../../../constants/constants'; @@ -118,7 +118,7 @@ callback?: (response: Response) => void ) { console.warn('.delete() is deprecated! Use plugin.restApi().delete()'); - return getRestAPI() + return appContext.restApiService .send(HttpMethod.DELETE, url) .then(response => { if (response.status !== 204) {
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit_test.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit_test.js index 9312f1b..77eb457 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit_test.js +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit_test.js
@@ -20,6 +20,7 @@ import {getPluginLoader} from './gr-plugin-loader.js'; import {resetPlugins} from '../../../test/test-utils.js'; import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-js-api-interface'); @@ -29,20 +30,12 @@ let element; let clock; - let sendStub; setup(() => { clock = sinon.useFakeTimers(); - sendStub = sinon.stub().returns(Promise.resolve({status: 200})); - stub('gr-rest-api-interface', { - getAccount() { - return Promise.resolve({name: 'Judy Hopps'}); - }, - send(...args) { - return sendStub(...args); - }, - }); + stubRestApi('getAccount').returns(Promise.resolve({name: 'Judy Hopps'})); + stubRestApi('send').returns(Promise.resolve({status: 200})); element = basicFixture.instantiate(); });
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.js index 1481c2d..ce57f92 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.js +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.js
@@ -25,6 +25,7 @@ import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; import {stubBaseUrl} from '../../../test/test-utils.js'; import sinon from 'sinon/pkg/sinon-esm'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-js-api-interface'); @@ -46,17 +47,10 @@ setup(() => { clock = sinon.useFakeTimers(); - getResponseObjectStub = sinon.stub().returns(Promise.resolve()); - sendStub = sinon.stub().returns(Promise.resolve({status: 200})); - stub('gr-rest-api-interface', { - getAccount() { - return Promise.resolve({name: 'Judy Hopps'}); - }, - getResponseObject: getResponseObjectStub, - send(...args) { - return sendStub(...args); - }, - }); + stubRestApi('getAccount').returns(Promise.resolve({name: 'Judy Hopps'})); + getResponseObjectStub = stubRestApi('getResponseObject').returns( + Promise.resolve()); + sendStub = stubRestApi('send').returns(Promise.resolve({status: 200})); element = basicFixture.instantiate(); errorStub = sinon.stub(element.reporting, 'error'); pluginApi.install(p => { plugin = p; }, '0.1',
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader_test.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader_test.js index 584cd39..66248c6 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader_test.js +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader_test.js
@@ -22,6 +22,7 @@ import {resetPlugins, stubBaseUrl} from '../../../test/test-utils.js'; import {_testOnly_flushPreinstalls} from './gr-gerrit.js'; import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-js-api-interface'); @@ -31,22 +32,14 @@ let plugin; let url; - let sendStub; let pluginLoader; let clock; setup(() => { clock = sinon.useFakeTimers(); - sendStub = sinon.stub().returns(Promise.resolve({status: 200})); - stub('gr-rest-api-interface', { - getAccount() { - return Promise.resolve({name: 'Judy Hopps'}); - }, - send(...args) { - return sendStub(...args); - }, - }); + stubRestApi('getAccount').returns(Promise.resolve({name: 'Judy Hopps'})); + stubRestApi('send').returns(Promise.resolve({status: 200})); pluginLoader = _testOnly_resetPluginLoader(); sinon.stub(document.body, 'appendChild'); basicFixture.instantiate();
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.ts index eb63a77..1d60288 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.ts
@@ -14,57 +14,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - ErrorCallback, - RestApiService, -} from '../../../services/services/gr-rest-api/gr-rest-api'; +import {ErrorCallback} from '../../../services/services/gr-rest-api/gr-rest-api'; import {HttpMethod} from '../../../constants/constants'; import {RequestPayload} from '../../../types/common'; - -let restApi: RestApiService | null = null; - -export function _testOnlyResetRestApi() { - restApi = null; -} - -function getRestApi(): RestApiService { - if (!restApi) { - restApi = (document.createElement( - 'gr-rest-api-interface' - ) as unknown) as RestApiService; - } - return restApi; -} +import {appContext} from '../../../services/app-context'; export class GrPluginRestApi { + private readonly restApi = appContext.restApiService; + constructor(private readonly prefix = '') {} getLoggedIn() { - return getRestApi().getLoggedIn(); + return this.restApi.getLoggedIn(); } getVersion() { - return getRestApi().getVersion(); + return this.restApi.getVersion(); } getConfig() { - return getRestApi().getConfig(); + return this.restApi.getConfig(); } invalidateReposCache() { - getRestApi().invalidateReposCache(); + this.restApi.invalidateReposCache(); } getAccount() { - return getRestApi().getAccount(); + return this.restApi.getAccount(); } getAccountCapabilities(capabilities: string[]) { - return getRestApi().getAccountCapabilities(capabilities); + return this.restApi.getAccountCapabilities(capabilities); } getRepos(filter: string, reposPerPage: number, offset?: number) { - return getRestApi().getRepos(filter, reposPerPage, offset); + return this.restApi.getRepos(filter, reposPerPage, offset); } fetch( @@ -101,7 +86,7 @@ errFn?: ErrorCallback, contentType?: string ): Promise<Response | void> { - return getRestApi().send( + return this.restApi.send( method, this.prefix + url, payload, @@ -151,7 +136,7 @@ } }); } else { - return getRestApi().getResponseObject(response); + return this.restApi.getResponseObject(response); } } );
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api_test.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api_test.js index 53aaa1e..d2b5658 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api_test.js +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api_test.js
@@ -19,31 +19,20 @@ import './gr-js-api-interface.js'; import {GrPluginRestApi} from './gr-plugin-rest-api.js'; import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const pluginApi = _testOnly_initGerritPluginApi(); suite('gr-plugin-rest-api tests', () => { let instance; - let getResponseObjectStub; let sendStub; - let restApiStub; setup(() => { - getResponseObjectStub = sinon.stub().returns(Promise.resolve()); - sendStub = sinon.stub().returns(Promise.resolve({status: 200})); - restApiStub = { - getAccount: () => Promise.resolve({name: 'Judy Hopps'}), - getResponseObject: getResponseObjectStub, - send: sendStub, - getLoggedIn: sinon.stub(), - getVersion: sinon.stub(), - getConfig: sinon.stub(), - }; - stub('gr-rest-api-interface', Object.keys(restApiStub).reduce((a, k) => { - a[k] = (...args) => restApiStub[k](...args); - return a; - }, {})); + stubRestApi('getAccount').returns(Promise.resolve({name: 'Judy Hopps'})); + getResponseObjectStub = stubRestApi('getResponseObject').returns( + Promise.resolve()); + sendStub = stubRestApi('send').returns(Promise.resolve({status: 200})); pluginApi.install(p => {}, '0.1', 'http://test.com/plugins/testplugin/static/test.js'); instance = new GrPluginRestApi(); @@ -119,25 +108,25 @@ }); test('getLoggedIn', () => { - restApiStub.getLoggedIn.returns(Promise.resolve(true)); + const stub = stubRestApi('getLoggedIn').returns(Promise.resolve(true)); return instance.getLoggedIn().then(result => { - assert.isTrue(restApiStub.getLoggedIn.calledOnce); + assert.isTrue(stub.calledOnce); assert.isTrue(result); }); }); test('getVersion', () => { - restApiStub.getVersion.returns(Promise.resolve('foo bar')); + const stub = stubRestApi('getVersion').returns(Promise.resolve('foo bar')); return instance.getVersion().then(result => { - assert.isTrue(restApiStub.getVersion.calledOnce); + assert.isTrue(stub.calledOnce); assert.equal(result, 'foo bar'); }); }); test('getConfig', () => { - restApiStub.getConfig.returns(Promise.resolve('foo bar')); + const stub = stubRestApi('getConfig').returns(Promise.resolve('foo bar')); return instance.getConfig().then(result => { - assert.isTrue(restApiStub.getConfig.calledOnce); + assert.isTrue(stub.calledOnce); assert.equal(result, 'foo bar'); }); });
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-reporting-js-api_test.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-reporting-js-api_test.js index 1229641..9e3876b 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-reporting-js-api_test.js +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-reporting-js-api_test.js
@@ -19,6 +19,7 @@ import '../../change/gr-reply-dialog/gr-reply-dialog.js'; import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; import {appContext} from '../../../services/app-context.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const pluginApi = _testOnly_initGerritPluginApi(); @@ -27,10 +28,8 @@ let plugin; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - getAccount() { return Promise.resolve(null); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); + stubRestApi('getAccount').returns(Promise.resolve(null)); }); suite('early init', () => { @@ -72,4 +71,4 @@ ); }); }); -}); \ No newline at end of file +});
diff --git a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_test.js b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_test.js index aa71bfc..b2365aa 100644 --- a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_test.js +++ b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_test.js
@@ -18,6 +18,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-label-info.js'; import {isHidden} from '../../../test/test-utils.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-label-info'); @@ -72,8 +73,7 @@ test('deletes votes', () => { const deleteResponse = Promise.resolve({ok: true}); - const deleteStub = sinon.stub( - element.restApiService, 'deleteVote').returns(deleteResponse); + const deleteStub = stubRestApi('deleteVote').returns(deleteResponse); element.change.removable_reviewers = [element.account]; element.change.labels.test.recommended = {_account_id: 1};
diff --git a/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker_test.js b/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker_test.js index 8fbc639..4f12edc 100644 --- a/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker_test.js +++ b/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker_test.js
@@ -17,6 +17,7 @@ import '../../../test/common-test-setup-karma.js'; import './gr-repo-branch-picker.js'; +import {stubRestApi} from '../../../test/test-utils.js'; const basicFixture = fixtureFromElement('gr-repo-branch-picker'); @@ -28,8 +29,9 @@ }); suite('_getRepoSuggestions', () => { + let getReposStub; setup(() => { - sinon.stub(element.restApiService, 'getRepos') + getReposStub = stubRestApi('getRepos') .returns(Promise.resolve([ { id: 'plugins%2Favatars-external', @@ -47,25 +49,25 @@ ])); }); - test('converts to suggestion objects', () => { + test('converts to suggestion objects', async () => { const input = 'plugins/avatars'; - return element._getRepoSuggestions(input).then(suggestions => { - assert.isTrue(element.restApiService.getRepos.calledWith(input)); - const unencodedNames = [ - 'plugins/avatars-external', - 'plugins/avatars-gravatar', - 'plugins/avatars/external', - 'plugins/avatars/gravatar', - ]; - assert.deepEqual(suggestions.map(s => s.name), unencodedNames); - assert.deepEqual(suggestions.map(s => s.value), unencodedNames); - }); + const suggestions = await element._getRepoSuggestions(input); + assert.isTrue(getReposStub.calledWith(input)); + const unencodedNames = [ + 'plugins/avatars-external', + 'plugins/avatars-gravatar', + 'plugins/avatars/external', + 'plugins/avatars/gravatar', + ]; + assert.deepEqual(suggestions.map(s => s.name), unencodedNames); + assert.deepEqual(suggestions.map(s => s.value), unencodedNames); }); }); suite('_getRepoBranchesSuggestions', () => { + let getRepoBranchesStub; setup(() => { - sinon.stub(element.restApiService, 'getRepoBranches') + getRepoBranchesStub = stubRestApi('getRepoBranches') .returns(Promise.resolve([ {ref: 'refs/heads/stable-2.10'}, {ref: 'refs/heads/stable-2.11'}, @@ -76,48 +78,43 @@ ])); }); - test('converts to suggestion objects', () => { + test('converts to suggestion objects', async () => { const repo = 'gerrit'; const branchInput = 'stable-2.1'; element.repo = repo; - return element._getRepoBranchesSuggestions(branchInput) - .then(suggestions => { - assert.isTrue(element.restApiService.getRepoBranches.calledWith( - branchInput, repo, 15)); - const refNames = [ - 'stable-2.10', - 'stable-2.11', - 'stable-2.12', - 'stable-2.13', - 'stable-2.14', - 'stable-2.15', - ]; - assert.deepEqual(suggestions.map(s => s.name), refNames); - assert.deepEqual(suggestions.map(s => s.value), refNames); - }); + const suggestions = + await element._getRepoBranchesSuggestions(branchInput); + assert.isTrue(getRepoBranchesStub.calledWith(branchInput, repo, 15)); + const refNames = [ + 'stable-2.10', + 'stable-2.11', + 'stable-2.12', + 'stable-2.13', + 'stable-2.14', + 'stable-2.15', + ]; + assert.deepEqual(suggestions.map(s => s.name), refNames); + assert.deepEqual(suggestions.map(s => s.value), refNames); }); - test('filters out ref prefix', () => { + test('filters out ref prefix', async () => { const repo = 'gerrit'; const branchInput = 'refs/heads/stable-2.1'; element.repo = repo; return element._getRepoBranchesSuggestions(branchInput) .then(suggestions => { - assert.isTrue(element.restApiService.getRepoBranches.calledWith( + assert.isTrue(getRepoBranchesStub.calledWith( 'stable-2.1', repo, 15)); }); }); - test('does not query when repo is unset', () => element - ._getRepoBranchesSuggestions('') - .then(() => { - assert.isFalse(element.restApiService.getRepoBranches.called); - element.repo = 'gerrit'; - return element._getRepoBranchesSuggestions(''); - }) - .then(() => { - assert.isTrue(element.restApiService.getRepoBranches.called); - })); + test('does not query when repo is unset', async () => { + await element._getRepoBranchesSuggestions(''); + assert.isFalse(getRepoBranchesStub.called); + element.repo = 'gerrit'; + await element._getRepoBranchesSuggestions(''); + assert.isTrue(getRepoBranchesStub.called); + }); }); });
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts index 9e77784..d12eaca 100644 --- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts +++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts
@@ -25,6 +25,8 @@ FetchParams, FetchPromisesCache, GrRestApiHelper, + parsePrefixedJSON, + readResponsePayload, SendJSONRequest, SendRequest, SiteBasedCache, @@ -149,13 +151,16 @@ } from '../../../services/services/gr-rest-api/gr-rest-api'; import { CommentSide, + createDefaultDiffPrefs, + createDefaultEditPrefs, + createDefaultPreferences, DiffViewMode, HttpMethod, ReviewerState, } from '../../../constants/constants'; import {firePageError, fireServerError} from '../../../utils/event-util'; -const JSON_PREFIX = ")]}'"; +export const JSON_PREFIX = ")]}'"; const MAX_PROJECT_RESULTS = 25; // This value is somewhat arbitrary and not based on research or calculations. const MAX_UNIFIED_DEFAULT_WINDOW_WIDTH_PX = 850; @@ -688,27 +693,7 @@ reportUrlAsIs: true, }) as Promise<DiffPreferencesInfo | undefined>; } - const anonymousResult: DiffPreferencesInfo = { - auto_hide_diff_table_header: true, - context: 10, - cursor_blink_rate: 0, - font_size: 12, - ignore_whitespace: 'IGNORE_NONE', - intraline_difference: true, - line_length: 100, - line_wrapping: false, - show_line_endings: true, - show_tabs: true, - show_whitespace_errors: true, - syntax_highlighting: true, - tab_size: 8, - theme: 'DEFAULT', - }; - // These defaults should match the defaults in - // java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java - // NOTE: There are some settings that don't apply to PolyGerrit - // (Render mode being at least one of them). - return Promise.resolve(anonymousResult); + return Promise.resolve(createDefaultDiffPrefs()); }); } @@ -720,27 +705,7 @@ reportUrlAsIs: true, }) as Promise<EditPreferencesInfo | undefined>; } - const result: EditPreferencesInfo = { - auto_close_brackets: false, - cursor_blink_rate: 0, - hide_line_numbers: false, - hide_top_menu: false, - indent_unit: 2, - indent_with_tabs: false, - key_map_type: 'DEFAULT', - line_length: 100, - line_wrapping: false, - match_brackets: true, - show_base: false, - show_tabs: true, - show_whitespace_errors: true, - syntax_highlighting: true, - tab_size: 8, - theme: 'DEFAULT', - }; - // These defaults should match the defaults in - // java/com/google/gerrit/extensions/client/EditPreferencesInfo.java - return Promise.resolve(result); + return Promise.resolve(createDefaultEditPrefs()); }); } @@ -1041,19 +1006,7 @@ return prefInfo; }); } - - // TODO(TS): Many properties are omitted here, but they are required. - // Add default values for missed properties - const anonymousPrefs = { - changes_per_page: 25, - default_diff_view: this._isNarrowScreen() - ? DiffViewMode.UNIFIED - : DiffViewMode.SIDE_BY_SIDE, - diff_view: DiffViewMode.SIDE_BY_SIDE, - size_bar_in_change_table: true, - } as PreferencesInfo; - - return anonymousPrefs; + return createDefaultPreferences(); }); } @@ -1296,7 +1249,7 @@ }; return this._restApiHelper.fetchRawJSON(req).then(response => { if (response?.status === 304) { - return (this._restApiHelper.parsePrefixedJSON( + return (parsePrefixedJSON( // urlWithParams already cached this._etags.getCachedPayload(urlWithParams)! ) as unknown) as ChangeInfo; @@ -1315,20 +1268,18 @@ return Promise.resolve(null); } - return this._restApiHelper - .readResponsePayload(response) - .then(payload => { - if (!payload) { - return null; - } - this._etags.collect(urlWithParams, response, payload.raw); - // TODO(TS): Why it is always change info? - this._maybeInsertInLookup( - (payload.parsed as unknown) as ChangeInfo - ); + return readResponsePayload(response).then(payload => { + if (!payload) { + return null; + } + this._etags.collect(urlWithParams, response, payload.raw); + // TODO(TS): Why it is always change info? + this._maybeInsertInLookup( + (payload.parsed as unknown) as ChangeInfo + ); - return (payload.parsed as unknown) as ChangeInfo; - }); + return (payload.parsed as unknown) as ChangeInfo; + }); }); } );
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.js index 717fe54..42030c7 100644 --- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.js +++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.js
@@ -23,6 +23,11 @@ import {appContext} from '../../../services/app-context.js'; import {createChange} from '../../../test/test-data-generators.js'; import {CURRENT} from '../../../utils/patch-set-util.js'; +import { + parsePrefixedJSON, + readResponsePayload, +} from './gr-rest-apis/gr-rest-api-helper.js'; +import {JSON_PREFIX} from './gr-rest-api-interface.js'; const basicFixture = fixtureFromElement('gr-rest-api-interface'); @@ -353,19 +358,6 @@ }); }); - test('getPreferences returns correctly on small screens not logged in', - () => { - const testJSON = {diff_view: 'SIDE_BY_SIDE'}; - const loggedIn = false; - const smallScreen = true; - - preferenceSetup(testJSON, loggedIn, smallScreen); - return element.getPreferences().then(obj => { - assert.equal(obj.default_diff_view, 'UNIFIED_DIFF'); - assert.equal(obj.diff_view, 'SIDE_BY_SIDE'); - }); - }); - test('getPreferences returns correctly on larger screens logged in', () => { const testJSON = {diff_view: 'UNIFIED_DIFF'}; @@ -932,22 +924,18 @@ }); }); - test('_getChangeDetail populates _projectLookup', () => { + test('_getChangeDetail populates _projectLookup', async () => { sinon.stub(element, 'getChangeActionURL') .returns(Promise.resolve('')); sinon.stub(element._restApiHelper, 'fetchRawJSON') - .returns(Promise.resolve({ok: true})); - - const mockResponse = {_number: 1, project: 'test'}; - sinon.stub(element._restApiHelper, 'readResponsePayload') .returns(Promise.resolve({ - parsed: mockResponse, - raw: JSON.stringify(mockResponse), + ok: true, + status: 200, + text: () => Promise.resolve(`)]}'{"_number":1,"project":"test"}`), })); - return element._getChangeDetail(1, '516714').then(() => { - assert.equal(Object.keys(element._projectLookup).length, 1); - assert.equal(element._projectLookup[1], 'test'); - }); + await element._getChangeDetail(1, '516714'); + assert.equal(Object.keys(element._projectLookup).length, 1); + assert.equal(element._projectLookup[1], 'test'); }); suite('_getChangeDetail ETag cache', () => { @@ -1106,21 +1094,19 @@ }); suite('reading responses', () => { - test('_readResponsePayload', () => { + test('_readResponsePayload', async () => { const mockObject = {foo: 'bar', baz: 'foo'}; - const serial = element.JSON_PREFIX + JSON.stringify(mockObject); + const serial = JSON_PREFIX + JSON.stringify(mockObject); const mockResponse = {text: () => Promise.resolve(serial)}; - return element._restApiHelper.readResponsePayload(mockResponse) - .then(payload => { - assert.deepEqual(payload.parsed, mockObject); - assert.equal(payload.raw, serial); - }); + const payload = await readResponsePayload(mockResponse); + assert.deepEqual(payload.parsed, mockObject); + assert.equal(payload.raw, serial); }); test('_parsePrefixedJSON', () => { const obj = {x: 3, y: {z: 4}, w: 23}; - const serial = element.JSON_PREFIX + JSON.stringify(obj); - const result = element._restApiHelper.parsePrefixedJSON(serial); + const serial = JSON_PREFIX + JSON.stringify(obj); + const result = parsePrefixedJSON(serial); assert.deepEqual(result, obj); }); });
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts index 616ec02..dcb2ef0 100644 --- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts +++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts
@@ -47,6 +47,29 @@ raw: string; } +export function readResponsePayload( + response: Response +): Promise<ResponsePayload> { + return response.text().then(text => { + let result; + try { + result = parsePrefixedJSON(text); + } catch (_) { + result = null; + } + // TODO(TS): readResponsePayload can assign null to the parsed property if + // it can't parse input data. However polygerrit assumes in many places + // that the parsed property can't be null. We should update + // readResponsePayload method and reject a promise instead of assigning + // null to the parsed property + return {parsed: result!, raw: text}; + }); +} + +export function parsePrefixedJSON(jsonWithPrefix: string): ParsedJSON { + return JSON.parse(jsonWithPrefix.substring(JSON_PREFIX.length)) as ParsedJSON; +} + /** * Wrapper around Map for caching server responses. Site-based so that * changes to CANONICAL_PATH will result in a different cache going into @@ -390,30 +413,7 @@ } getResponseObject(response: Response): Promise<ParsedJSON> { - return this.readResponsePayload(response).then(payload => payload.parsed); - } - - readResponsePayload(response: Response): Promise<ResponsePayload> { - return response.text().then(text => { - let result; - try { - result = this.parsePrefixedJSON(text); - } catch (_) { - result = null; - } - // TODO(TS): readResponsePayload can assign null to the parsed property if - // it can't parse input data. However polygerrit assumes in many places - // that the parsed property can't be null. We should update - // readResponsePayload method and reject a promise instead of assigning - // null to the parsed property - return {parsed: result!, raw: text}; - }); - } - - parsePrefixedJSON(jsonWithPrefix: string): ParsedJSON { - return JSON.parse( - jsonWithPrefix.substring(JSON_PREFIX.length) - ) as ParsedJSON; + return readResponsePayload(response).then(payload => payload.parsed); } addAcceptJsonHeader(req: FetchJSONRequest) {
diff --git a/polygerrit-ui/app/scripts/gr-email-suggestions-provider/gr-email-suggestions-provider_test.js b/polygerrit-ui/app/scripts/gr-email-suggestions-provider/gr-email-suggestions-provider_test.js index ac48ea0..85c92d3 100644 --- a/polygerrit-ui/app/scripts/gr-email-suggestions-provider/gr-email-suggestions-provider_test.js +++ b/polygerrit-ui/app/scripts/gr-email-suggestions-provider/gr-email-suggestions-provider_test.js
@@ -16,12 +16,11 @@ */ import '../../test/common-test-setup-karma.js'; -import '../../elements/shared/gr-rest-api-interface/gr-rest-api-interface.js'; import {GrEmailSuggestionsProvider} from './gr-email-suggestions-provider.js'; import {appContext} from '../../services/app-context.js'; +import {stubRestApi} from '../../test/test-utils.js'; suite('GrEmailSuggestionsProvider tests', () => { - let restAPI; let provider; const account1 = { name: 'Some name', @@ -33,17 +32,14 @@ }; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - }); - restAPI = appContext.restApiService; - provider = new GrEmailSuggestionsProvider(restAPI); + stubRestApi('getConfig').returns(Promise.resolve({})); + provider = new GrEmailSuggestionsProvider(appContext.restApiService); }); test('getSuggestions', done => { const getSuggestedAccountsStub = - sinon.stub(restAPI, 'getSuggestedAccounts') - .returns(Promise.resolve([account1, account2])); + stubRestApi('getSuggestedAccounts').returns( + Promise.resolve([account1, account2])); provider.getSuggestions('Some input').then(res => { assert.deepEqual(res, [account1, account2]);
diff --git a/polygerrit-ui/app/scripts/gr-group-suggestions-provider/gr-group-suggestions-provider_test.js b/polygerrit-ui/app/scripts/gr-group-suggestions-provider/gr-group-suggestions-provider_test.js index f03195d..3ce9d9d 100644 --- a/polygerrit-ui/app/scripts/gr-group-suggestions-provider/gr-group-suggestions-provider_test.js +++ b/polygerrit-ui/app/scripts/gr-group-suggestions-provider/gr-group-suggestions-provider_test.js
@@ -16,12 +16,11 @@ */ import '../../test/common-test-setup-karma.js'; -import '../../elements/shared/gr-rest-api-interface/gr-rest-api-interface.js'; import {GrGroupSuggestionsProvider} from './gr-group-suggestions-provider.js'; import {appContext} from '../../services/app-context.js'; +import {stubRestApi} from '../../test/test-utils.js'; suite('GrGroupSuggestionsProvider tests', () => { - let restAPI; let provider; const group1 = { name: 'Some name', @@ -34,16 +33,13 @@ }; setup(() => { - stub('gr-rest-api-interface', { - getConfig() { return Promise.resolve({}); }, - }); - restAPI = appContext.restApiService; - provider = new GrGroupSuggestionsProvider(restAPI); + stubRestApi('getConfig').returns(Promise.resolve({})); + provider = new GrGroupSuggestionsProvider(appContext.restApiService); }); test('getSuggestions', done => { const getSuggestedAccountsStub = - sinon.stub(restAPI, 'getSuggestedGroups') + stubRestApi('getSuggestedGroups') .returns(Promise.resolve({ 'Some name': {id: 1}, 'Other name': {id: 3, url: 'abcd'},
diff --git a/polygerrit-ui/app/scripts/gr-reviewer-suggestions-provider/gr-reviewer-suggestions-provider_test.js b/polygerrit-ui/app/scripts/gr-reviewer-suggestions-provider/gr-reviewer-suggestions-provider_test.js index 2aea699..c7de24a 100644 --- a/polygerrit-ui/app/scripts/gr-reviewer-suggestions-provider/gr-reviewer-suggestions-provider_test.js +++ b/polygerrit-ui/app/scripts/gr-reviewer-suggestions-provider/gr-reviewer-suggestions-provider_test.js
@@ -16,9 +16,9 @@ */ import '../../test/common-test-setup-karma.js'; -import '../../elements/shared/gr-rest-api-interface/gr-rest-api-interface.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; @@ -47,7 +47,6 @@ let suggestion1; let suggestion2; let suggestion3; - let restAPI; let provider; let redundantSuggestion1; @@ -68,12 +67,8 @@ }, }; - stub('gr-rest-api-interface', { - getLoggedIn() { return Promise.resolve(true); }, - getConfig() { return Promise.resolve({}); }, - }); + stubRestApi('getConfig').returns(Promise.resolve({})); - restAPI = appContext.restApiService; change = { _number: 42, owner, @@ -88,21 +83,23 @@ suite('allowAnyUser set to false', () => { setup(done => { - provider = GrReviewerSuggestionsProvider.create(restAPI, change._number, + provider = GrReviewerSuggestionsProvider.create( + appContext.restApiService, change._number, SUGGESTIONS_PROVIDERS_USERS_TYPES.REVIEWER); provider.init().then(done); }); suite('stubbed values for _getReviewerSuggestions', () => { + let getChangeSuggestedReviewersStub; 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]); - }, - }); + 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', () => { @@ -182,26 +179,22 @@ }); 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); + assert.isFalse(getChangeSuggestedReviewersStub.called); provider._loggedIn = true; return provider.getSuggestions('').then(() => { - assert.isTrue(xhrSpy.called); + assert.isTrue(getChangeSuggestedReviewersStub.called); }); }); }); }); test('getChangeSuggestedReviewers is used', done => { - const suggestReviewerStub = - sinon.stub(restAPI, 'getChangeSuggestedReviewers') - .returns(Promise.resolve([])); - const suggestAccountStub = - sinon.stub(restAPI, 'getSuggestedAccounts') - .returns(Promise.resolve([])); + const suggestReviewerStub = stubRestApi('getChangeSuggestedReviewers') + .returns(Promise.resolve([])); + const suggestAccountStub = stubRestApi('getSuggestedAccounts') + .returns(Promise.resolve([])); provider.getSuggestions('').then(() => { assert.isTrue(suggestReviewerStub.calledOnce); @@ -214,18 +207,17 @@ suite('allowAnyUser set to true', () => { setup(done => { - provider = GrReviewerSuggestionsProvider.create(restAPI, change._number, + provider = GrReviewerSuggestionsProvider.create( + appContext.restApiService, 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([])); + const suggestReviewerStub = stubRestApi('getChangeSuggestedReviewers') + .returns(Promise.resolve([])); + const suggestAccountStub = stubRestApi('getSuggestedAccounts') + .returns(Promise.resolve([])); provider.getSuggestions('').then(() => { assert.isFalse(suggestReviewerStub.called);
diff --git a/polygerrit-ui/app/test/common-test-setup.ts b/polygerrit-ui/app/test/common-test-setup.ts index 8c1c4ee..beba88e 100644 --- a/polygerrit-ui/app/test/common-test-setup.ts +++ b/polygerrit-ui/app/test/common-test-setup.ts
@@ -23,7 +23,6 @@ import './test-router'; import {_testOnlyInitAppContext} from './test-app-context-init'; import {_testOnly_resetPluginLoader} from '../elements/shared/gr-js-api-interface/gr-plugin-loader'; -import {_testOnlyResetRestApi} from '../elements/shared/gr-js-api-interface/gr-plugin-rest-api'; import {_testOnlyResetGrRestApiSharedObjects} from '../elements/shared/gr-rest-api-interface/gr-rest-api-interface'; import { cleanupTestUtils, @@ -122,7 +121,6 @@ // to reset this behavior if you need to test something specific. pl.loadPlugins([]); _testOnlyResetGrRestApiSharedObjects(); - _testOnlyResetRestApi(); }); // For karma always set our implementation
diff --git a/polygerrit-ui/app/test/mocks/gr-rest-api_mock.ts b/polygerrit-ui/app/test/mocks/gr-rest-api_mock.ts new file mode 100644 index 0000000..b025fec --- /dev/null +++ b/polygerrit-ui/app/test/mocks/gr-rest-api_mock.ts
@@ -0,0 +1,531 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/** + * @license + * Copyright (C) 2020 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 {RestApiService} from '../../services/services/gr-rest-api/gr-rest-api'; +import { + AccountDetailInfo, + AccountExternalIdInfo, + AccountInfo, + ServerInfo, + ProjectInfo, + AccountCapabilityInfo, + SuggestedReviewerInfo, + GroupNameToGroupInfoMap, + ParsedJSON, + EditPreferencesInfo, + SshKeyInfo, + RepoName, + GpgKeyInfo, + PreferencesInfo, + EmailInfo, + ProjectAccessInfo, + CapabilityInfoMap, + ChangeInfo, + ProjectInfoWithName, + GroupInfo, + BranchInfo, + ConfigInfo, + EditInfo, + DashboardInfo, + ProjectAccessInfoMap, + IncludedInInfo, + CommentInfo, + PathToCommentsInfoMap, + PluginInfo, + DocResult, + ContributorAgreementInfo, + Password, + ProjectWatchInfo, + NameToProjectInfoMap, + GroupAuditEventInfo, + Base64FileContent, + TagInfo, + RelatedChangesInfo, + SubmittedTogetherInfo, + FilePathToDiffInfoMap, + BlameInfo, + ImagesForDiff, + ActionNameToActionInfoMap, + Hashtag, + FileNameToFileInfoMap, + TopMenuEntryInfo, + MergeableInfo, + CommitInfo, + GroupId, + GroupName, + UrlEncodedRepoName, +} from '../../types/common'; +import {DiffInfo, DiffPreferencesInfo} from '../../types/diff'; +import {ParsedChangeInfo} from '../../elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser'; +import {readResponsePayload} from '../../elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper'; +import { + createAccountDetailWithId, + createChange, + createCommit, + createConfig, + createPreferences, + createServerInfo, +} from '../test-data-generators'; +import { + createDefaultDiffPrefs, + createDefaultEditPrefs, +} from '../../constants/constants'; + +export const grRestApiMock: RestApiService = { + addAccountEmail(): Promise<Response> { + return Promise.resolve(new Response()); + }, + addAccountGPGKey(): Promise<Record<string, GpgKeyInfo>> { + return Promise.resolve({}); + }, + addAccountSSHKey(): Promise<SshKeyInfo> { + throw new Error('addAccountSSHKey() not implemented by RestApiMock.'); + }, + addToAttentionSet(): Promise<Response> { + return Promise.resolve(new Response()); + }, + applyFixSuggestion(): Promise<Response> { + return Promise.resolve(new Response()); + }, + awaitPendingDiffDrafts(): Promise<void> { + return Promise.resolve(); + }, + confirmEmail(): Promise<string | null> { + return Promise.resolve(''); + }, + createChange(): Promise<ChangeInfo | undefined> { + throw new Error('createChange() not implemented by RestApiMock.'); + }, + createGroup(): Promise<Response> { + return Promise.resolve(new Response()); + }, + createRepo(): Promise<Response> { + return Promise.resolve(new Response()); + }, + createRepoBranch(): Promise<Response> { + return Promise.resolve(new Response()); + }, + createRepoTag(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteAccountEmail(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteAccountGPGKey(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteAccountIdentity(): Promise<unknown> { + return Promise.resolve(new Response()); + }, + deleteAccountSSHKey(): void {}, + deleteAssignee(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteChangeCommitMessage(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteComment(): Promise<CommentInfo> { + throw new Error('deleteComment() not implemented by RestApiMock.'); + }, + deleteDiffDraft(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteDraftComments(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteFileInChangeEdit(): Promise<Response | undefined> { + return Promise.resolve(new Response()); + }, + deleteGroupMember(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteIncludedGroup(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteRepoBranches(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteRepoTags(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteVote(): Promise<Response> { + return Promise.resolve(new Response()); + }, + deleteWatchedProjects(): Promise<Response> { + return Promise.resolve(new Response()); + }, + executeChangeAction(): Promise<Response | undefined> { + return Promise.resolve(new Response()); + }, + generateAccountHttpPassword(): Promise<Password> { + return Promise.resolve('asdf'); + }, + getAccount(): Promise<AccountDetailInfo | undefined> { + return Promise.resolve(createAccountDetailWithId(1)); + }, + getAccountAgreements(): Promise<ContributorAgreementInfo[] | undefined> { + return Promise.resolve([]); + }, + getAccountCapabilities(): Promise<AccountCapabilityInfo | undefined> { + return Promise.resolve({}); + }, + getAccountDetails(): Promise<AccountDetailInfo | undefined> { + return Promise.resolve(createAccountDetailWithId(1)); + }, + getAccountEmails(): Promise<EmailInfo[] | undefined> { + return Promise.resolve([]); + }, + getAccountGPGKeys(): Promise<Record<string, GpgKeyInfo>> { + return Promise.resolve({}); + }, + getAccountGroups(): Promise<GroupInfo[] | undefined> { + return Promise.resolve([]); + }, + getAccountSSHKeys(): Promise<SshKeyInfo[] | undefined> { + return Promise.resolve([]); + }, + getAccountStatus(): Promise<string | undefined> { + return Promise.resolve(''); + }, + getAvatarChangeUrl(): Promise<string | undefined> { + return Promise.resolve(''); + }, + getBlame(): Promise<BlameInfo[] | undefined> { + return Promise.resolve([]); + }, + getCapabilities(): Promise<CapabilityInfoMap | undefined> { + return Promise.resolve({}); + }, + getChange(): Promise<ChangeInfo | null> { + throw new Error('getChange() not implemented by RestApiMock.'); + }, + getChangeActionURL(): Promise<string> { + return Promise.resolve(''); + }, + getChangeCherryPicks(): Promise<ChangeInfo[] | undefined> { + return Promise.resolve([]); + }, + getChangeCommitInfo(): Promise<CommitInfo | undefined> { + return Promise.resolve(createCommit()); + }, + getChangeConflicts(): Promise<ChangeInfo[] | undefined> { + return Promise.resolve([]); + }, + getChangeDetail(): Promise<ParsedChangeInfo | null | undefined> { + return Promise.resolve(createChange() as ParsedChangeInfo); + }, + getChangeEdit(): Promise<false | EditInfo | undefined> { + return Promise.resolve(false); + }, + getChangeFiles(): Promise<FileNameToFileInfoMap | undefined> { + return Promise.resolve({}); + }, + getChangeIncludedIn(): Promise<IncludedInInfo | undefined> { + throw new Error('getChangeIncludedIn() not implemented by RestApiMock.'); + }, + getChangeOrEditFiles(): Promise<FileNameToFileInfoMap | undefined> { + return Promise.resolve({}); + }, + getChangeRevisionActions(): Promise<ActionNameToActionInfoMap | undefined> { + return Promise.resolve({}); + }, + getChangeSuggestedCCs(): Promise<SuggestedReviewerInfo[] | undefined> { + return Promise.resolve([]); + }, + getChangeSuggestedReviewers(): Promise<SuggestedReviewerInfo[] | undefined> { + return Promise.resolve([]); + }, + getChanges() { + return Promise.resolve([]); + }, + getChangesSubmittedTogether(): Promise<SubmittedTogetherInfo | undefined> { + throw new Error('getChangesSubmittedTogether() not implemented by mock.'); + }, + getChangesWithSameTopic(): Promise<ChangeInfo[] | undefined> { + return Promise.resolve([]); + }, + getConfig(): Promise<ServerInfo | undefined> { + return Promise.resolve(createServerInfo()); + }, + getDashboard(): Promise<DashboardInfo | undefined> { + throw new Error('getDashboard() not implemented by RestApiMock.'); + }, + getDefaultPreferences(): Promise<PreferencesInfo | undefined> { + throw new Error('getDefaultPreferences() not implemented by RestApiMock.'); + }, + getDiff(): Promise<DiffInfo | undefined> { + throw new Error('getDiff() not implemented by RestApiMock.'); + }, + getDiffChangeDetail(): Promise<ChangeInfo | undefined | null> { + throw new Error('getDiffChangeDetail() not implemented by RestApiMock.'); + }, + getDiffComments() { + throw new Error('getDiffComments() not implemented by RestApiMock.'); + }, + getDiffDrafts() { + throw new Error('getDiffDrafts() not implemented by RestApiMock.'); + }, + getDiffPreferences(): Promise<DiffPreferencesInfo | undefined> { + return Promise.resolve(createDefaultDiffPrefs()); + }, + getDiffRobotComments() { + throw new Error('getDiffRobotComments() not implemented by RestApiMock.'); + }, + getDocumentationSearches(): Promise<DocResult[] | undefined> { + return Promise.resolve([]); + }, + getEditPreferences(): Promise<EditPreferencesInfo | undefined> { + return Promise.resolve(createDefaultEditPrefs()); + }, + getExternalIds(): Promise<AccountExternalIdInfo[] | undefined> { + return Promise.resolve([]); + }, + getFileContent(): Promise<Response | Base64FileContent | undefined> { + return Promise.resolve(new Response()); + }, + getFromProjectLookup(): Promise<RepoName | undefined> { + throw new Error('getFromProjectLookup() not implemented by RestApiMock.'); + }, + getGroupAuditLog(): Promise<GroupAuditEventInfo[] | undefined> { + return Promise.resolve([]); + }, + getGroupConfig(id: GroupId | GroupName): Promise<GroupInfo | undefined> { + return Promise.resolve({ + id: id as GroupId, + }); + }, + getGroupMembers(): Promise<AccountInfo[]> { + return Promise.resolve([]); + }, + getGroups(): Promise<GroupNameToGroupInfoMap | undefined> { + return Promise.resolve({}); + }, + getImagesForDiff(): Promise<ImagesForDiff> { + throw new Error('getImagesForDiff() not implemented by RestApiMock.'); + }, + getIncludedGroup(): Promise<GroupInfo[] | undefined> { + return Promise.resolve([]); + }, + getIsAdmin(): Promise<boolean | undefined> { + return Promise.resolve(false); + }, + getIsGroupOwner(): Promise<boolean> { + return Promise.resolve(false); + }, + getLoggedIn(): Promise<boolean> { + return Promise.resolve(true); + }, + getMergeable(): Promise<MergeableInfo | undefined> { + throw new Error('getMergeable() not implemented by RestApiMock.'); + }, + getPlugins(): Promise<{[p: string]: PluginInfo} | undefined> { + return Promise.resolve({}); + }, + getPortedComments(): Promise<PathToCommentsInfoMap | undefined> { + return Promise.resolve({}); + }, + getPortedDrafts(): Promise<PathToCommentsInfoMap | undefined> { + return Promise.resolve({}); + }, + getPreferences(): Promise<PreferencesInfo | undefined> { + return Promise.resolve(createPreferences()); + }, + getProjectConfig(): Promise<ConfigInfo | undefined> { + return Promise.resolve(createConfig()); + }, + getRelatedChanges(): Promise<RelatedChangesInfo | undefined> { + return Promise.resolve({changes: []}); + }, + getRepo(repo: RepoName): Promise<ProjectInfo | undefined> { + return Promise.resolve({ + id: (repo as string) as UrlEncodedRepoName, + name: repo, + }); + }, + getRepoAccess(): Promise<ProjectAccessInfoMap | undefined> { + return Promise.resolve({}); + }, + getRepoAccessRights(): Promise<ProjectAccessInfo | undefined> { + return Promise.resolve(undefined); + }, + getRepoBranches(): Promise<BranchInfo[] | undefined> { + return Promise.resolve([]); + }, + getRepoDashboards(): Promise<DashboardInfo[] | undefined> { + return Promise.resolve([]); + }, + getRepoTags(): Promise<TagInfo[]> { + return Promise.resolve([]); + }, + getRepos(): Promise<ProjectInfoWithName[] | undefined> { + return Promise.resolve([]); + }, + getResponseObject(response: Response): Promise<ParsedJSON> { + return readResponsePayload(response).then(payload => payload.parsed); + }, + getReviewedFiles(): Promise<string[] | undefined> { + return Promise.resolve([]); + }, + getRobotCommentFixPreview(): Promise<FilePathToDiffInfoMap | undefined> { + return Promise.resolve({}); + }, + getSuggestedAccounts(): Promise<AccountInfo[] | undefined> { + return Promise.resolve([]); + }, + getSuggestedGroups(): Promise<GroupNameToGroupInfoMap | undefined> { + return Promise.resolve({}); + }, + getSuggestedProjects(): Promise<NameToProjectInfoMap | undefined> { + return Promise.resolve({}); + }, + getTopMenus(): Promise<TopMenuEntryInfo[] | undefined> { + return Promise.resolve([]); + }, + getVersion(): Promise<string | undefined> { + return Promise.resolve(''); + }, + getWatchedProjects(): Promise<ProjectWatchInfo[] | undefined> { + return Promise.resolve([]); + }, + hasPendingDiffDrafts(): number { + return 0; + }, + invalidateAccountsCache(): void {}, + invalidateGroupsCache(): void {}, + invalidateReposCache(): void {}, + probePath(): Promise<boolean> { + return Promise.resolve(true); + }, + putChangeCommitMessage(): Promise<Response> { + return Promise.resolve(new Response()); + }, + queryChangeFiles(): Promise<string[] | undefined> { + return Promise.resolve([]); + }, + removeChangeReviewer(): Promise<Response | undefined> { + return Promise.resolve(new Response()); + }, + removeFromAttentionSet(): Promise<Response> { + return Promise.resolve(new Response()); + }, + renameFileInChangeEdit(): Promise<Response | undefined> { + return Promise.resolve(new Response()); + }, + restoreFileInChangeEdit(): Promise<Response | undefined> { + return Promise.resolve(new Response()); + }, + runRepoGC(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveAccountAgreement(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveChangeEdit(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveChangeReview() { + return Promise.resolve(new Response()); + }, + saveChangeReviewed(): Promise<Response | undefined> { + return Promise.resolve(new Response()); + }, + saveChangeStarred(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveDiffDraft(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveDiffPreferences(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveEditPreferences(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveFileReviewed(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveFileUploadChangeEdit(): Promise<Response | undefined> { + return Promise.resolve(new Response()); + }, + saveGroupDescription(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveGroupMember(): Promise<AccountInfo> { + return Promise.resolve({}); + }, + saveGroupName(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveGroupOptions(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveGroupOwner(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveIncludedGroup(): Promise<GroupInfo | undefined> { + throw new Error('saveIncludedGroup() not implemented by RestApiMock.'); + }, + savePreferences(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveRepoConfig(): Promise<Response> { + return Promise.resolve(new Response()); + }, + saveWatchedProjects(): Promise<ProjectWatchInfo[]> { + return Promise.resolve([]); + }, + send() { + return Promise.resolve(new Response()); + }, + setAccountDisplayName(): Promise<void> { + return Promise.resolve(); + }, + setAccountName(): Promise<void> { + return Promise.resolve(); + }, + setAccountStatus(): Promise<void> { + return Promise.resolve(); + }, + setAccountUsername(): Promise<void> { + return Promise.resolve(); + }, + setAssignee(): Promise<Response> { + return Promise.resolve(new Response()); + }, + setChangeHashtag(): Promise<Hashtag[]> { + return Promise.resolve([]); + }, + setChangeTopic(): Promise<string> { + return Promise.resolve(''); + }, + setDescription(): Promise<Response> { + return Promise.resolve(new Response()); + }, + setInProjectLookup(): void {}, + setPreferredAccountEmail(): Promise<void> { + return Promise.resolve(); + }, + setRepoAccessRights(): Promise<Response> { + return Promise.resolve(new Response()); + }, + setRepoAccessRightsForReview(): Promise<ChangeInfo> { + throw new Error('setRepoAccessRightsForReview() not implemented by mock.'); + }, + setRepoHead(): Promise<Response> { + return Promise.resolve(new Response()); + }, +};
diff --git a/polygerrit-ui/app/test/test-app-context-init.ts b/polygerrit-ui/app/test/test-app-context-init.ts index 7f19903..57afd8a 100644 --- a/polygerrit-ui/app/test/test-app-context-init.ts +++ b/polygerrit-ui/app/test/test-app-context-init.ts
@@ -19,6 +19,7 @@ import {initAppContext} from '../services/app-context-init'; import {grReportingMock} from '../services/gr-reporting/gr-reporting_mock'; import {AppContext, appContext} from '../services/app-context'; +import {grRestApiMock} from './mocks/gr-rest-api_mock'; export function _testOnlyInitAppContext() { initAppContext(); @@ -34,4 +35,5 @@ }); } setMock('reportingService', grReportingMock); + setMock('restApiService', grRestApiMock); }
diff --git a/polygerrit-ui/app/test/test-data-generators.ts b/polygerrit-ui/app/test/test-data-generators.ts index 444d0bf..8137712 100644 --- a/polygerrit-ui/app/test/test-data-generators.ts +++ b/polygerrit-ui/app/test/test-data-generators.ts
@@ -404,6 +404,7 @@ }; } +// TODO: Maybe reconcile with createDefaultPreferences() in constants.ts. export function createPreferences(): PreferencesInfo { return { changes_per_page: 10,
diff --git a/polygerrit-ui/app/test/test-utils.ts b/polygerrit-ui/app/test/test-utils.ts index 97c220d..2115f90 100644 --- a/polygerrit-ui/app/test/test-utils.ts +++ b/polygerrit-ui/app/test/test-utils.ts
@@ -16,12 +16,13 @@ */ import '../types/globals'; import {_testOnly_resetPluginLoader} from '../elements/shared/gr-js-api-interface/gr-plugin-loader'; -import {testOnly_resetInternalState} from '../elements/shared/gr-js-api-interface/gr-api-utils'; import {_testOnly_resetEndpoints} from '../elements/shared/gr-js-api-interface/gr-plugin-endpoints'; import { _testOnly_getShortcutManagerInstance, Shortcut, } from '../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin'; +import {appContext} from '../services/app-context'; +import {RestApiService} from '../services/services/gr-rest-api/gr-rest-api'; export interface MockPromise extends Promise<unknown> { resolve: (value?: unknown) => void; @@ -87,7 +88,6 @@ // Provide reset plugins function to clear installed plugins between tests. // No gr-app found (running tests) export const resetPlugins = () => { - testOnly_resetInternalState(); _testOnly_resetEndpoints(); const pl = _testOnly_resetPluginLoader(); pl.loadPlugins([]); @@ -135,6 +135,14 @@ registerTestCleanup(() => (window.CANONICAL_PATH = originalCanonicalPath)); } +export function stubRestApi<K extends keyof RestApiService>(method: K) { + return sinon.stub(appContext.restApiService, method); +} + +export function spyRestApi<K extends keyof RestApiService>(method: K) { + return sinon.spy(appContext.restApiService, method); +} + /** * Forcing an opacity of 0 onto the ironOverlayBackdrop is required, because * otherwise the backdrop stays around in the DOM for too long waiting for
diff --git a/polygerrit-ui/app/types/common.ts b/polygerrit-ui/app/types/common.ts index 5574add..beb86f4 100644 --- a/polygerrit-ui/app/types/common.ts +++ b/polygerrit-ui/app/types/common.ts
@@ -1721,8 +1721,8 @@ flushCaches?: boolean; killTask?: boolean; maintainServer?: boolean; - priority: UserPriority; - queryLimit: QueryLimitInfo; + priority?: UserPriority; + queryLimit?: QueryLimitInfo; runAs?: boolean; runGC?: boolean; streamEvents?: boolean;