summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/test/test-app-context-init.ts
diff options
context:
space:
mode:
Diffstat (limited to 'polygerrit-ui/app/test/test-app-context-init.ts')
-rw-r--r--polygerrit-ui/app/test/test-app-context-init.ts120
1 files changed, 101 insertions, 19 deletions
diff --git a/polygerrit-ui/app/test/test-app-context-init.ts b/polygerrit-ui/app/test/test-app-context-init.ts
index 483baa690c..5795c4a187 100644
--- a/polygerrit-ui/app/test/test-app-context-init.ts
+++ b/polygerrit-ui/app/test/test-app-context-init.ts
@@ -16,28 +16,110 @@
*/
// Init app context before any other imports
-import {initAppContext} from '../services/app-context-init';
+import {create, Registry, Finalizable} from '../services/registry';
+import {DependencyToken} from '../models/dependency';
+import {assertIsDefined} from '../utils/common-util';
+import {AppContext} from '../services/app-context';
import {grReportingMock} from '../services/gr-reporting/gr-reporting_mock';
-import {AppContext, appContext} from '../services/app-context';
import {grRestApiMock} from './mocks/gr-rest-api_mock';
import {grStorageMock} from '../services/storage/gr-storage_mock';
import {GrAuthMock} from '../services/gr-auth/gr-auth_mock';
+import {FlagsServiceImplementation} from '../services/flags/flags_impl';
+import {EventEmitter} from '../services/gr-event-interface/gr-event-interface_impl';
+import {ChangeModel, changeModelToken} from '../models/change/change-model';
+import {ChecksModel, checksModelToken} from '../models/checks/checks-model';
+import {GrJsApiInterface} from '../elements/shared/gr-js-api-interface/gr-js-api-interface-element';
+import {UserModel} from '../models/user/user-model';
+import {
+ CommentsModel,
+ commentsModelToken,
+} from '../models/comments/comments-model';
+import {RouterModel} from '../services/router/router-model';
+import {ShortcutsService} from '../services/shortcuts/shortcuts-service';
+import {ConfigModel, configModelToken} from '../models/config/config-model';
+import {BrowserModel, browserModelToken} from '../models/browser/browser-model';
+import {PluginsModel} from '../models/plugins/plugins-model';
+import {MockHighlightService} from '../services/highlight/highlight-service-mock';
-export function _testOnlyInitAppContext() {
- initAppContext();
-
- function setMock<T extends keyof AppContext>(
- serviceName: T,
- setupMock: AppContext[T]
- ) {
- Object.defineProperty(appContext, serviceName, {
- get() {
- return setupMock;
- },
- });
- }
- setMock('reportingService', grReportingMock);
- setMock('restApiService', grRestApiMock);
- setMock('storageService', grStorageMock);
- setMock('authService', new GrAuthMock(appContext.eventEmitter));
+export function createTestAppContext(): AppContext & Finalizable {
+ const appRegistry: Registry<AppContext> = {
+ routerModel: (_ctx: Partial<AppContext>) => new RouterModel(),
+ flagsService: (_ctx: Partial<AppContext>) =>
+ new FlagsServiceImplementation(),
+ reportingService: (_ctx: Partial<AppContext>) => grReportingMock,
+ eventEmitter: (_ctx: Partial<AppContext>) => new EventEmitter(),
+ authService: (ctx: Partial<AppContext>) => {
+ assertIsDefined(ctx.eventEmitter, 'eventEmitter');
+ return new GrAuthMock(ctx.eventEmitter);
+ },
+ restApiService: (_ctx: Partial<AppContext>) => grRestApiMock,
+ jsApiService: (ctx: Partial<AppContext>) => {
+ assertIsDefined(ctx.reportingService, 'reportingService');
+ return new GrJsApiInterface(ctx.reportingService);
+ },
+ storageService: (_ctx: Partial<AppContext>) => grStorageMock,
+ userModel: (ctx: Partial<AppContext>) => {
+ assertIsDefined(ctx.restApiService, 'restApiService');
+ return new UserModel(ctx.restApiService);
+ },
+ shortcutsService: (ctx: Partial<AppContext>) => {
+ assertIsDefined(ctx.userModel, 'userModel');
+ assertIsDefined(ctx.reportingService, 'reportingService');
+ return new ShortcutsService(ctx.userModel, ctx.reportingService);
+ },
+ pluginsModel: (_ctx: Partial<AppContext>) => new PluginsModel(),
+ highlightService: (ctx: Partial<AppContext>) => {
+ assertIsDefined(ctx.reportingService, 'reportingService');
+ return new MockHighlightService(ctx.reportingService);
+ },
+ };
+ return create<AppContext>(appRegistry);
+}
+
+export type Creator<T> = () => T & Finalizable;
+
+// Test dependencies are provides as creator functions to ensure that they are
+// not created if a test doesn't depend on them. E.g. don't create a
+// change-model in change-model_test.ts because it creates one in the test
+// after setting up stubs.
+export function createTestDependencies(
+ appContext: AppContext,
+ resolver: <T>(token: DependencyToken<T>) => T
+): Map<DependencyToken<unknown>, Creator<unknown>> {
+ const dependencies = new Map();
+ const browserModel = () => new BrowserModel(appContext.userModel);
+ dependencies.set(browserModelToken, browserModel);
+
+ const changeModelCreator = () =>
+ new ChangeModel(
+ appContext.routerModel,
+ appContext.restApiService,
+ appContext.userModel
+ );
+ dependencies.set(changeModelToken, changeModelCreator);
+
+ const commentsModelCreator = () =>
+ new CommentsModel(
+ appContext.routerModel,
+ resolver(changeModelToken),
+ appContext.restApiService,
+ appContext.reportingService
+ );
+ dependencies.set(commentsModelToken, commentsModelCreator);
+
+ const configModelCreator = () =>
+ new ConfigModel(resolver(changeModelToken), appContext.restApiService);
+ dependencies.set(configModelToken, configModelCreator);
+
+ const checksModelCreator = () =>
+ new ChecksModel(
+ appContext.routerModel,
+ resolver(changeModelToken),
+ appContext.reportingService,
+ appContext.pluginsModel
+ );
+
+ dependencies.set(checksModelToken, checksModelCreator);
+
+ return dependencies;
}