From 4745569b6b91f5c8615d0724bf697301ce67751a Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 11:26:16 +0300 Subject: [PATCH 01/12] test: avoid error when localization doesn't exist in tests --- npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts index e9014a52db..0e22713449 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts @@ -1,3 +1,4 @@ +import snq from 'snq'; import { ApplicationLocalizationConfigurationDto } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/models'; // This will not be necessary when only Angukar 9.1+ is supported @@ -13,7 +14,7 @@ export function createLocalizer(localization: ApplicationLocalizationConfigurati return (resourceName: string, key: string, defaultValue: string) => { if (resourceName === '_') return key; - const resource = localization.values[resourceName]; + const resource = snq(() => localization.values[resourceName]); if (!resource) return defaultValue; From 4b5484b1c992f1b256f5b72a8f51da8cef7a501c Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 11:26:48 +0300 Subject: [PATCH 02/12] test: extend test options from partial root options --- npm/ng-packs/packages/core/src/lib/models/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index 652cc07ea3..e57ef04f7c 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -12,7 +12,7 @@ export namespace ABP { sendNullsAsQueryParam?: boolean; } - export interface Test { + export interface Test extends Partial { baseHref?: Router; } From 2ced7cb2b591fd4efd49f704b3ec602e6bfbcc7c Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 11:47:36 +0300 Subject: [PATCH 03/12] test: provide core options in forTest method --- npm/ng-packs/packages/core/src/lib/core.module.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 4f24ce5ad2..b5029ccc65 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -143,11 +143,22 @@ export class TestCoreModule {} providers: [LocalizationPipe], }) export class CoreModule { - static forTest({ baseHref = '/' } = {} as ABP.Test): ModuleWithProviders { + static forTest( + { baseHref = '/', ...options } = {} as ABP.Test, + ): ModuleWithProviders { return { ngModule: TestCoreModule, providers: [ { provide: APP_BASE_HREF, useValue: baseHref }, + { + provide: 'CORE_OPTIONS', + useValue: options, + }, + { + provide: CORE_OPTIONS, + useFactory: coreOptionsFactory, + deps: ['CORE_OPTIONS'], + }, { provide: LocalizationPipe, useClass: MockLocalizationPipe, From b6608a431f67b12ef5d9b1d790dbd3c24c316090 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:53:39 +0300 Subject: [PATCH 04/12] test: add routes to core test module options --- npm/ng-packs/packages/core/src/lib/models/common.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index e57ef04f7c..88bd75c027 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -1,5 +1,5 @@ import { EventEmitter, Type } from '@angular/core'; -import { Router } from '@angular/router'; +import { Router, Routes } from '@angular/router'; import { Subject } from 'rxjs'; import { eLayoutType } from '../enums/common'; import { Environment } from './environment'; @@ -14,6 +14,7 @@ export namespace ABP { export interface Test extends Partial { baseHref?: Router; + routes?: Routes; } export type PagedResponse = { From 5d63bb316c8aa477b0c6dff6913c3426cdfea2cc Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:54:33 +0300 Subject: [PATCH 05/12] test: add a secondary endpoint for testing module --- npm/ng-packs/packages/core/testing/ng-package.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 npm/ng-packs/packages/core/testing/ng-package.json diff --git a/npm/ng-packs/packages/core/testing/ng-package.json b/npm/ng-packs/packages/core/testing/ng-package.json new file mode 100644 index 0000000000..e647bd0d3e --- /dev/null +++ b/npm/ng-packs/packages/core/testing/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/core/testing", + "lib": { + "entryFile": "src/public-api.ts" + } +} From 8eef49eead8dfc473e0f20164482c7780a36e5e6 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:55:12 +0300 Subject: [PATCH 06/12] test: add a mock localization pipe to core testing --- .../packages/core/testing/src/lib/pipes/index.ts | 1 + .../testing/src/lib/pipes/mock-localization.pipe.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts create mode 100644 npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts diff --git a/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts b/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts new file mode 100644 index 0000000000..60bb9b7dce --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts @@ -0,0 +1 @@ +export * from './mock-localization.pipe'; diff --git a/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts b/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts new file mode 100644 index 0000000000..302173cb0f --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts @@ -0,0 +1,12 @@ +import { Config } from '@abp/ng.core'; +import { Injectable, Pipe, PipeTransform } from '@angular/core'; + +@Injectable() +@Pipe({ + name: 'abpLocalization', +}) +export class MockLocalizationPipe implements PipeTransform { + transform(value: string | Config.LocalizationWithDefault = '', ..._: string[]) { + return typeof value === 'string' ? value : value.defaultValue; + } +} From e1dd34217a9db1ad514bd6079fb18605f7e26ca2 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:55:54 +0300 Subject: [PATCH 07/12] test: add core testing module --- .../testing/src/lib/core-testing.module.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts diff --git a/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts new file mode 100644 index 0000000000..5a43aa9a4c --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts @@ -0,0 +1,48 @@ +import { + ABP, + BaseCoreModule, + coreOptionsFactory, + CORE_OPTIONS, + LocalizationPipe, +} from '@abp/ng.core'; +import { APP_BASE_HREF } from '@angular/common'; +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { provideRoutes } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; +import { MockLocalizationPipe } from './pipes/mock-localization.pipe'; + +/** + * CoreTestingModule is the module that will be used in tests + * and it provides mock alternatives + */ +@NgModule({ + exports: [RouterTestingModule, BaseCoreModule, MockLocalizationPipe], + imports: [RouterTestingModule, BaseCoreModule], + declarations: [MockLocalizationPipe], +}) +export class CoreTestingModule { + static forTest( + { baseHref = '/', routes = [], ...options } = {} as ABP.Test, + ): ModuleWithProviders { + return { + ngModule: CoreTestingModule, + providers: [ + { provide: APP_BASE_HREF, useValue: baseHref }, + { + provide: 'CORE_OPTIONS', + useValue: options, + }, + { + provide: CORE_OPTIONS, + useFactory: coreOptionsFactory, + deps: ['CORE_OPTIONS'], + }, + { + provide: LocalizationPipe, + useClass: MockLocalizationPipe, + }, + provideRoutes(routes), + ], + }; + } +} From 549d8bcfbb8e1fe38b795d2fa8d6b421616a7a8f Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:56:21 +0300 Subject: [PATCH 08/12] build: add path to testing module endpoint --- npm/ng-packs/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/npm/ng-packs/tsconfig.json b/npm/ng-packs/tsconfig.json index 213f5bd437..c67c628f64 100644 --- a/npm/ng-packs/tsconfig.json +++ b/npm/ng-packs/tsconfig.json @@ -17,6 +17,7 @@ "paths": { "@abp/ng.core": ["packages/core/src/public-api.ts"], "@abp/ng.core/locale": ["packages/core/locale/src/public-api.ts"], + "@abp/ng.core/testing": ["packages/core/testing/src/public-api.ts"], "@abp/ng.theme.shared": ["packages/theme-shared/src/public-api.ts"], "@abp/ng.theme.shared/extensions": ["packages/theme-shared/extensions/src/public-api.ts"], "@abp/ng.components/tree": ["packages/components/tree/src/public-api.ts"], From 20fea080a1d2b2100a72efa031524d33ea11bcf1 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:56:38 +0300 Subject: [PATCH 09/12] refactor: remove testing core module --- .../packages/core/src/lib/core.module.ts | 39 +------------------ 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 6df5962962..a661012ac7 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -1,4 +1,4 @@ -import { APP_BASE_HREF, CommonModule } from '@angular/common'; +import { CommonModule } from '@angular/common'; import { HttpClientModule, HttpClientXsrfModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -24,7 +24,7 @@ import { RoutesHandler } from './handlers/routes.handler'; import { ApiInterceptor } from './interceptors/api.interceptor'; import { LocalizationModule } from './localization.module'; import { ABP } from './models/common'; -import { LocalizationPipe, MockLocalizationPipe } from './pipes/localization.pipe'; +import { LocalizationPipe } from './pipes/localization.pipe'; import { SortPipe } from './pipes/sort.pipe'; import { LocaleProvider } from './providers/locale.provider'; import { LocalizationService } from './services/localization.service'; @@ -121,17 +121,6 @@ export class BaseCoreModule {} }) export class RootCoreModule {} -/** - * TestCoreModule is the module that will be used in tests - * and it provides mock alternatives - */ -@NgModule({ - exports: [RouterModule, BaseCoreModule, MockLocalizationPipe], - imports: [RouterModule.forRoot([], { relativeLinkResolution: 'legacy' }), BaseCoreModule], - declarations: [MockLocalizationPipe], -}) -export class TestCoreModule {} - /** * CoreModule is the module that is publicly available */ @@ -141,30 +130,6 @@ export class TestCoreModule {} providers: [LocalizationPipe], }) export class CoreModule { - static forTest( - { baseHref = '/', ...options } = {} as ABP.Test, - ): ModuleWithProviders { - return { - ngModule: TestCoreModule, - providers: [ - { provide: APP_BASE_HREF, useValue: baseHref }, - { - provide: 'CORE_OPTIONS', - useValue: options, - }, - { - provide: CORE_OPTIONS, - useFactory: coreOptionsFactory, - deps: ['CORE_OPTIONS'], - }, - { - provide: LocalizationPipe, - useClass: MockLocalizationPipe, - }, - ], - }; - } - static forRoot(options = {} as ABP.Root): ModuleWithProviders { return { ngModule: RootCoreModule, From a9d081a09e2a6e04826393b523eaba0f55dc4ea4 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:56:54 +0300 Subject: [PATCH 10/12] refactor: remove mock locaization pipe --- .../packages/core/src/lib/pipes/localization.pipe.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts index cc84cfebdd..cf076d414c 100644 --- a/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts +++ b/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts @@ -22,13 +22,3 @@ export class LocalizationPipe implements PipeTransform { ); } } - -@Injectable() -@Pipe({ - name: 'abpLocalization', -}) -export class MockLocalizationPipe implements PipeTransform { - transform(value: string | Config.LocalizationWithDefault = '', ..._: string[]) { - return typeof value === 'string' ? value : value.defaultValue; - } -} From 47868ac2f2dcdcf4432285a16225a896dc4c5696 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:57:16 +0300 Subject: [PATCH 11/12] test: add public api to core testing module --- npm/ng-packs/packages/core/testing/src/public-api.ts | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 npm/ng-packs/packages/core/testing/src/public-api.ts diff --git a/npm/ng-packs/packages/core/testing/src/public-api.ts b/npm/ng-packs/packages/core/testing/src/public-api.ts new file mode 100644 index 0000000000..8028a99aac --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/public-api.ts @@ -0,0 +1,2 @@ +export * from './lib/core-testing.module'; +export * from './lib/pipes'; From 4814ef7b99a7a1326d0ff6ec24e582538efc72c1 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 15 Dec 2020 16:57:38 +0300 Subject: [PATCH 12/12] test: use core testing module instead of core module --- .../src/lib/tests/confirmation.service.spec.ts | 6 +++--- .../src/lib/tests/error.handler.spec.ts | 17 ++++++----------- .../src/lib/tests/toaster.service.spec.ts | 6 +++--- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts index 3cbdcbd7de..88813c44de 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts @@ -1,4 +1,4 @@ -import { CoreModule } from '@abp/ng.core'; +import { CoreTestingModule } from '@abp/ng.core/testing'; import { NgModule } from '@angular/core'; import { fakeAsync, tick } from '@angular/core/testing'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; @@ -13,7 +13,7 @@ import { ConfirmationService } from '../services'; exports: [ConfirmationComponent], entryComponents: [ConfirmationComponent], declarations: [ConfirmationComponent], - imports: [CoreModule.forTest()], + imports: [CoreTestingModule.forTest()], }) export class MockModule {} @@ -22,7 +22,7 @@ describe('ConfirmationService', () => { let service: ConfirmationService; const createService = createServiceFactory({ service: ConfirmationService, - imports: [NgxsModule.forRoot(), CoreModule.forTest(), MockModule], + imports: [NgxsModule.forRoot(), CoreTestingModule.forTest(), MockModule], }); beforeEach(() => { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts index e4fb8e3d37..939f87e5ee 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts @@ -1,14 +1,14 @@ -import { CoreModule, RestOccurError } from '@abp/ng.core'; +import { RestOccurError } from '@abp/ng.core'; +import { CoreTestingModule } from '@abp/ng.core/testing'; import { APP_BASE_HREF } from '@angular/common'; import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; import { Component, NgModule } from '@angular/core'; -import { NavigationError, ResolveEnd, RouterModule } from '@angular/router'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; -import { Actions, NgxsModule, ofActionDispatched, Store } from '@ngxs/store'; +import { NgxsModule, Store } from '@ngxs/store'; import { OAuthService } from 'angular-oauth2-oidc'; import { of } from 'rxjs'; import { HttpErrorWrapperComponent } from '../components/http-error-wrapper/http-error-wrapper.component'; -import { DEFAULT_ERROR_MESSAGES, ErrorHandler, DEFAULT_ERROR_LOCALIZATIONS } from '../handlers'; +import { DEFAULT_ERROR_LOCALIZATIONS, DEFAULT_ERROR_MESSAGES, ErrorHandler } from '../handlers'; import { ConfirmationService } from '../services'; import { httpErrorConfigFactory } from '../tokens/http-error.token'; @@ -16,7 +16,7 @@ import { httpErrorConfigFactory } from '../tokens/http-error.token'; exports: [HttpErrorWrapperComponent], declarations: [HttpErrorWrapperComponent], entryComponents: [HttpErrorWrapperComponent], - imports: [CoreModule], + imports: [CoreTestingModule], }) class MockModule {} @@ -31,12 +31,7 @@ const CONFIRMATION_BUTTONS = { describe('ErrorHandler', () => { const createService = createServiceFactory({ service: ErrorHandler, - imports: [ - RouterModule.forRoot([], { relativeLinkResolution: 'legacy' }), - NgxsModule.forRoot([]), - CoreModule, - MockModule, - ], + imports: [NgxsModule.forRoot([]), CoreTestingModule.forTest(), MockModule], mocks: [OAuthService], providers: [ { provide: APP_BASE_HREF, useValue: '/' }, diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts index d47e4a7cf5..fa6e0e578c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts @@ -1,4 +1,4 @@ -import { CoreModule } from '@abp/ng.core'; +import { CoreTestingModule } from '@abp/ng.core/testing'; import { NgModule } from '@angular/core'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; import { NgxsModule } from '@ngxs/store'; @@ -11,7 +11,7 @@ import { ToasterService } from '../services/toaster.service'; exports: [ToastContainerComponent], entryComponents: [ToastContainerComponent], declarations: [ToastContainerComponent, ToastComponent], - imports: [CoreModule.forTest()], + imports: [CoreTestingModule.forTest()], }) export class MockModule {} const toastClassPrefix = 'abp-toast'; @@ -21,7 +21,7 @@ describe('ToasterService', () => { let service: ToasterService; const createService = createServiceFactory({ service: ToasterService, - imports: [NgxsModule.forRoot(), CoreModule.forTest(), MockModule], + imports: [NgxsModule.forRoot(), CoreTestingModule.forTest(), MockModule], }); beforeEach(() => {