Move to Dependency injection for UserModel Make model getters private on elements. They can be easily fetched with `testResolver(fooToken)` in tests. In addition, get rid of shortcutsService on appContext as it was not being used anywhere and shortcutsService is already DI. Release-Notes: skip Change-Id: I2f565127a3cdb7e79206500550e4313c23a7fb09
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts index ed1f46d..84bdffb 100644 --- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts +++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary.ts
@@ -57,6 +57,7 @@ import {when} from 'lit/directives/when.js'; import {KnownExperimentId} from '../../../services/flags/flags'; import {combineLatest} from 'rxjs'; +import {userModelToken} from '../../../models/user/user-model'; function handleSpaceOrEnter(e: KeyboardEvent, handler: () => void) { if (modifierPressed(e)) return; @@ -109,11 +110,9 @@ private readonly showAllChips = new Map<RunStatus | Category, boolean>(); - // private but used in tests - readonly getCommentsModel = resolve(this, commentsModelToken); + private readonly getCommentsModel = resolve(this, commentsModelToken); - // private but used in tests - readonly userModel = getAppContext().userModel; + private readonly getUserModel = resolve(this, userModelToken); private readonly getChecksModel = resolve(this, checksModelToken); @@ -172,7 +171,7 @@ ); subscribe( this, - () => this.userModel.account$, + () => this.getUserModel().account$, x => (this.selfAccount = x) ); if (this.flagsService.isEnabled(KnownExperimentId.MENTION_USERS)) { @@ -180,7 +179,7 @@ this, () => combineLatest([ - this.userModel.account$, + this.getUserModel().account$, this.getCommentsModel().threads$, ]), ([selfAccount, threads]) => {
diff --git a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_test.ts b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_test.ts index 9584637..05036ab 100644 --- a/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_test.ts +++ b/polygerrit-ui/app/elements/change/gr-change-summary/gr-change-summary_test.ts
@@ -16,11 +16,22 @@ } from '../../../test/test-data-generators'; import {stubFlags} from '../../../test/test-utils'; import {Timestamp} from '../../../api/rest-api'; +import {testResolver} from '../../../test/common-test-setup'; +import {UserModel, userModelToken} from '../../../models/user/user-model'; +import { + CommentsModel, + commentsModelToken, +} from '../../../models/comments/comments-model'; suite('gr-change-summary test', () => { let element: GrChangeSummary; + let commentsModel: CommentsModel; + let userModel: UserModel; + setup(async () => { element = await fixture(html`<gr-change-summary></gr-change-summary>`); + commentsModel = testResolver(commentsModelToken); + userModel = testResolver(userModelToken); }); test('is defined', () => { @@ -29,7 +40,7 @@ }); test('renders', async () => { - element.getCommentsModel().setState({ + commentsModel.setState({ drafts: { a: [createDraft(), createDraft(), createDraft()], }, @@ -112,7 +123,7 @@ element = await fixture(html`<gr-change-summary></gr-change-summary>`); await element.updateComplete; - element.getCommentsModel().setState({ + commentsModel.setState({ drafts: { a: [ { @@ -139,7 +150,7 @@ }, discardedDrafts: [], }); - element.userModel.setAccount({ + userModel.setAccount({ ...createAccountWithEmail('abc@def.com'), registered_on: '2015-03-12 18:32:08.000000000' as Timestamp, });
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts index d6e1958..98b0b23 100644 --- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts +++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -181,6 +181,7 @@ } from '../../../models/views/change'; import {rootUrl} from '../../../utils/url-util'; import {createEditUrl} from '../../../models/views/edit'; +import {userModelToken} from '../../../models/user/user-model'; const MIN_LINES_FOR_COMMIT_COLLAPSE = 18; @@ -535,16 +536,13 @@ private readonly flagsService = getAppContext().flagsService; - // Private but used in tests. - readonly userModel = getAppContext().userModel; + private readonly getUserModel = resolve(this, userModelToken); - // Private but used in tests. - readonly getChangeModel = resolve(this, changeModelToken); + private readonly getChangeModel = resolve(this, changeModelToken); private readonly routerModel = getAppContext().routerModel; - // Private but used in tests. - readonly getCommentsModel = resolve(this, commentsModelToken); + private readonly getCommentsModel = resolve(this, commentsModelToken); private readonly getConfigModel = resolve(this, configModelToken); @@ -738,7 +736,7 @@ ); subscribe( this, - () => this.userModel.preferenceDiffViewMode$, + () => this.getUserModel().preferenceDiffViewMode$, diffViewMode => { this.diffViewMode = diffViewMode; } @@ -768,14 +766,14 @@ ); subscribe( this, - () => this.userModel.account$, + () => this.getUserModel().account$, account => { this.account = account; } ); subscribe( this, - () => this.userModel.loggedIn$, + () => this.getUserModel().loggedIn$, loggedIn => { this.loggedIn = loggedIn; } @@ -1726,9 +1724,9 @@ // Private but used in tests. handleToggleDiffMode() { if (this.diffViewMode === DiffViewMode.SIDE_BY_SIDE) { - this.userModel.updatePreferences({diff_view: DiffViewMode.UNIFIED}); + this.getUserModel().updatePreferences({diff_view: DiffViewMode.UNIFIED}); } else { - this.userModel.updatePreferences({ + this.getUserModel().updatePreferences({ diff_view: DiffViewMode.SIDE_BY_SIDE, }); }
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 f3017f8..095e942 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
@@ -28,7 +28,6 @@ queryAndAssert, stubFlags, stubRestApi, - stubUsers, waitEventLoop, waitQueryAndAssert, waitUntil, @@ -86,7 +85,11 @@ import {ParsedChangeInfo} from '../../../types/types'; import {GrRelatedChangesList} from '../gr-related-changes-list/gr-related-changes-list'; import {ChangeStates} from '../../shared/gr-change-status/gr-change-status'; -import {LoadingStatus} from '../../../models/change/change-model'; +import { + ChangeModel, + changeModelToken, + LoadingStatus, +} from '../../../models/change/change-model'; import {FocusTarget, GrReplyDialog} from '../gr-reply-dialog/gr-reply-dialog'; import {GrOverlay} from '../../shared/gr-overlay/gr-overlay'; import {GrChangeStar} from '../../shared/gr-change-star/gr-change-star'; @@ -101,10 +104,18 @@ import {ChangeViewState} from '../../../models/views/change'; import {rootUrl} from '../../../utils/url-util'; import {testResolver} from '../../../test/common-test-setup'; +import {UserModel, userModelToken} from '../../../models/user/user-model'; +import { + CommentsModel, + commentsModelToken, +} from '../../../models/comments/comments-model'; suite('gr-change-view tests', () => { let element: GrChangeView; let setUrlStub: sinon.SinonStub; + let userModel: UserModel; + let changeModel: ChangeModel; + let commentsModel: CommentsModel; const ROBOT_COMMENTS_LIMIT = 10; @@ -374,6 +385,9 @@ assertIsDefined(element.actions); sinon.stub(element.actions, 'reload').returns(Promise.resolve()); }); + userModel = testResolver(userModelToken); + commentsModel = testResolver(commentsModelToken); + changeModel = testResolver(changeModelToken); }); teardown(async () => { @@ -805,7 +819,7 @@ }); test('A fires an error event when not logged in', async () => { - element.userModel.setAccount(undefined); + userModel.setAccount(undefined); const loggedInErrorSpy = sinon.spy(); element.addEventListener('show-auth-required', loggedInErrorSpy); pressKey(element, 'a'); @@ -978,14 +992,14 @@ }); test('m should toggle diff mode', async () => { - const updatePreferencesStub = stubUsers('updatePreferences'); + const updatePreferencesStub = sinon.stub(userModel, 'updatePreferences'); await element.updateComplete; const prefs = { ...createDefaultPreferences(), diff_view: DiffViewMode.SIDE_BY_SIDE, }; - element.userModel.setPreferences(prefs); + userModel.setPreferences(prefs); element.handleToggleDiffMode(); assert.isTrue( updatePreferencesStub.calledWith({diff_view: DiffViewMode.UNIFIED}) @@ -995,7 +1009,7 @@ ...createDefaultPreferences(), diff_view: DiffViewMode.UNIFIED, }; - element.userModel.setPreferences(newPrefs); + userModel.setPreferences(newPrefs); await element.updateComplete; element.handleToggleDiffMode(); assert.isTrue( @@ -1586,11 +1600,11 @@ sinon.stub(element, 'loadAndSetCommitInfo'); await element.updateComplete; const reloadPortedCommentsStub = sinon.stub( - element.getCommentsModel(), + commentsModel, 'reloadPortedComments' ); const reloadPortedDraftsStub = sinon.stub( - element.getCommentsModel(), + commentsModel, 'reloadPortedDrafts' ); sinon.stub(element.fileList, 'collapseAllDiffs'); @@ -1683,7 +1697,7 @@ ); element.viewState = createChangeViewState(); - element.getChangeModel().setState({ + changeModel.setState({ loadingStatus: LoadingStatus.LOADED, change: { ...createChangeViewChange(), @@ -1776,7 +1790,7 @@ test('topic is coalesced to null', async () => { sinon.stub(element, 'changeChanged'); - element.getChangeModel().setState({ + changeModel.setState({ loadingStatus: LoadingStatus.LOADED, change: { ...createChangeViewChange(), @@ -1791,7 +1805,7 @@ }); test('commit sha is populated from getChangeDetail', async () => { - element.getChangeModel().setState({ + changeModel.setState({ loadingStatus: LoadingStatus.LOADED, change: { ...createChangeViewChange(), @@ -2161,7 +2175,7 @@ test('selectedRevision updates when patchNum is changed', async () => { const revision1: RevisionInfo = createRevision(1); const revision2: RevisionInfo = createRevision(2); - element.getChangeModel().setState({ + changeModel.setState({ loadingStatus: LoadingStatus.LOADED, change: { ...createChangeViewChange(), @@ -2174,7 +2188,7 @@ current_revision: 'bbb' as CommitId, }, }); - element.userModel.setPreferences(createPreferences()); + userModel.setPreferences(createPreferences()); element.patchRange = {patchNum: 2 as RevisionPatchSetNum}; await element.performPostChangeLoadTasks(); @@ -2189,7 +2203,7 @@ const revision1 = createRevision(1); const revision2 = createRevision(2); const revision3 = createEditRevision(); - element.getChangeModel().setState({ + changeModel.setState({ loadingStatus: LoadingStatus.LOADED, change: { ...createChangeViewChange(), @@ -2463,7 +2477,7 @@ changeNum: TEST_NUMERIC_CHANGE_ID, project: TEST_PROJECT_NAME, }; - element.getChangeModel().setState({ + changeModel.setState({ loadingStatus: LoadingStatus.LOADED, change: { ...createChangeViewChange(),
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.ts b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.ts index 832738b..9bac7c2 100644 --- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.ts +++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.ts
@@ -38,10 +38,10 @@ shortcutsServiceToken, } from '../../../services/shortcuts/shortcuts-service'; import {resolve} from '../../../models/dependency'; -import {getAppContext} from '../../../services/app-context'; import {subscribe} from '../../lit/subscription-controller'; import {configModelToken} from '../../../models/config/config-model'; import {createChangeUrl} from '../../../models/views/change'; +import {userModelToken} from '../../../models/user/user-model'; @customElement('gr-file-list-header') export class GrFileListHeader extends LitElement { @@ -123,7 +123,7 @@ // 'hide diffs' buttons still be functional. private readonly maxFilesForBulkActions = 225; - private readonly userModel = getAppContext().userModel; + private readonly getUserModel = resolve(this, userModelToken); private readonly getNavigation = resolve(this, navigationToken); @@ -131,7 +131,7 @@ super(); subscribe( this, - () => this.userModel.diffPreferences$, + () => this.getUserModel().diffPreferences$, diffPreferences => { if (!diffPreferences) return; this.diffPrefs = diffPreferences;
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts index 3e8530c..c40d018 100644 --- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts +++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.ts
@@ -76,6 +76,7 @@ import {createDiffUrl} from '../../../models/views/diff'; import {createEditUrl} from '../../../models/views/edit'; import {createChangeUrl} from '../../../models/views/change'; +import {userModelToken} from '../../../models/user/user-model'; export const DEFAULT_NUM_FILES_SHOWN = 200; @@ -285,7 +286,7 @@ private readonly restApiService = getAppContext().restApiService; - private readonly userModel = getAppContext().userModel; + private readonly getUserModel = resolve(this, userModelToken); private readonly getChangeModel = resolve(this, changeModelToken); @@ -766,7 +767,7 @@ ); subscribe( this, - () => this.userModel.diffPreferences$, + () => this.getUserModel().diffPreferences$, diffPreferences => { this.diffPrefs = diffPreferences; } @@ -775,7 +776,7 @@ this, () => select( - this.userModel.preferences$, + this.getUserModel().preferences$, prefs => !!prefs?.size_bar_in_change_table ), sizeBarInChangeTable => { @@ -784,7 +785,7 @@ ); subscribe( this, - () => this.userModel.loggedIn$, + () => this.getUserModel().loggedIn$, loggedIn => { this.loggedIn = loggedIn; } @@ -2595,7 +2596,7 @@ } private handleReloadingDiffPreference() { - this.userModel.getDiffPreferences(); + this.getUserModel().getDiffPreferences(); } private getOldPath(file: NormalizedFileInfo) {
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.ts b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.ts index 5417127..e7a54fb 100644 --- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.ts +++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.ts
@@ -322,8 +322,7 @@ @state() private combinedMessages: CombinedMessage[] = []; - // Private but used in tests. - readonly getCommentsModel = resolve(this, commentsModelToken); + private readonly getCommentsModel = resolve(this, commentsModelToken); private readonly changeModel = resolve(this, changeModelToken);
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.ts b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.ts index 2e62718..158ad8d 100644 --- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.ts +++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.ts
@@ -32,6 +32,8 @@ import {fixture, assert} from '@open-wc/testing'; import {GrButton} from '../../shared/gr-button/gr-button'; import {PaperToggleButtonElement} from '@polymer/paper-toggle-button'; +import {testResolver} from '../../../test/common-test-setup'; +import {commentsModelToken} from '../../../models/comments/comments-model'; const author = { _account_id: 42 as AccountId, @@ -136,7 +138,9 @@ element = await fixture<GrMessagesList>( html`<gr-messages-list></gr-messages-list>` ); - await element.getCommentsModel().reloadComments(0 as NumericChangeId); + await testResolver(commentsModelToken).reloadComments( + 0 as NumericChangeId + ); element.messages = messages; await element.updateComplete; });
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.ts b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.ts index 26b9a63..ba3e62f 100644 --- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.ts +++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.ts
@@ -131,6 +131,7 @@ import {ShortcutController} from '../../lit/shortcut-controller'; import {Key, Modifier, whenVisible} from '../../../utils/dom-util'; import {GrThreadList} from '../gr-thread-list/gr-thread-list'; +import {userModelToken} from '../../../models/user/user-model'; export enum FocusTarget { ANY = 'any', @@ -216,8 +217,7 @@ private readonly getChangeModel = resolve(this, changeModelToken); - // Private but used in tests. - readonly getCommentsModel = resolve(this, commentsModelToken); + private readonly getCommentsModel = resolve(this, commentsModelToken); // TODO: update type to only ParsedChangeInfo @property({type: Object}) @@ -397,6 +397,8 @@ private readonly accountsModel = getAppContext().accountsModel; + private readonly getUserModel = resolve(this, userModelToken); + private latestPatchNum?: PatchSetNumber; storeTask?: DelayedTask; @@ -631,7 +633,7 @@ subscribe( this, - () => getAppContext().userModel.loggedIn$, + () => this.getUserModel().loggedIn$, isLoggedIn => (this.isLoggedIn = isLoggedIn) ); subscribe(
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts index 8185139..ef781ba 100644 --- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts +++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts
@@ -63,6 +63,11 @@ import {KnownExperimentId} from '../../../services/flags/flags'; import {Key, Modifier} from '../../../utils/dom-util'; import {GrComment} from '../../shared/gr-comment/gr-comment'; +import {testResolver} from '../../../test/common-test-setup'; +import { + CommentsModel, + commentsModelToken, +} from '../../../models/comments/comments-model'; function cloneableResponse(status: number, text: string) { return { @@ -88,6 +93,7 @@ let element: GrReplyDialog; let changeNum: NumericChangeId; let patchNum: PatchSetNum; + let commentsModel: CommentsModel; let lastId = 1; const makeAccount = function () { @@ -148,6 +154,7 @@ element.draftCommentThreads = []; await element.updateComplete; + commentsModel = testResolver(commentsModelToken); }); function stubSaveReview( @@ -2378,7 +2385,7 @@ test('replies to patchset level comments are not filtered out', async () => { const draft = {...createDraft(), in_reply_to: '1' as UrlEncodedCommentId}; - element.getCommentsModel().setState({ + commentsModel.setState({ drafts: { 'abc.txt': [draft], }, @@ -2414,7 +2421,7 @@ ...createDraft(), message: 'hey @abcd@def take a look at this', }; - element.getCommentsModel().setState({ + commentsModel.setState({ comments: {}, robotComments: {}, drafts: { @@ -2449,7 +2456,7 @@ message: 'hey @abcd@def.com take a look at this', unresolved: true, }; - element.getCommentsModel().setState({ + commentsModel.setState({ comments: {}, robotComments: {}, drafts: { @@ -2489,7 +2496,7 @@ message: 'hey @abcd@def.com take a look at this', unresolved: true, }; - element.getCommentsModel().setState({ + commentsModel.setState({ comments: {}, robotComments: {}, drafts: { @@ -2542,7 +2549,7 @@ }; stubRestApi('getAccountDetails').returns(Promise.resolve(account)); - element.getCommentsModel().setState({ + commentsModel.setState({ comments: {}, robotComments: {}, drafts: { @@ -2579,7 +2586,7 @@ registered_on: '2015-03-12 18:32:08.000000000' as Timestamp, }; stubRestApi('getAccountDetails').returns(Promise.resolve(account)); - element.getCommentsModel().setState({ + commentsModel.setState({ comments: {}, robotComments: {}, drafts: {
diff --git a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.ts b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.ts index 27b5097..414fed9 100644 --- a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.ts +++ b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.ts
@@ -44,6 +44,7 @@ import {Interaction} from '../../../constants/reporting'; import {KnownExperimentId} from '../../../services/flags/flags'; import {HtmlPatched} from '../../../utils/lit-util'; +import {userModelToken} from '../../../models/user/user-model'; enum SortDropdownState { TIMESTAMP = 'Latest timestamp', @@ -205,7 +206,7 @@ private readonly flagsService = getAppContext().flagsService; - private readonly userModel = getAppContext().userModel; + private readonly getUserModel = resolve(this, userModelToken); private readonly patched = new HtmlPatched(key => { this.reporting.reportInteraction(Interaction.AUTOCLOSE_HTML_PATCHED, { @@ -228,7 +229,7 @@ ); subscribe( this, - () => this.userModel.account$, + () => this.getUserModel().account$, x => (this.account = x) ); // for COMMENTS_AUTOCLOSE logging purposes only