Browse Source

Merge pull request #6651 from abpframework/test/6648

Enhanced Angular UI unit test setup
pull/6685/head
Mehmet Erim 6 years ago
committed by GitHub
parent
commit
760f4c032b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 28
      npm/ng-packs/packages/core/src/lib/core.module.ts
  2. 5
      npm/ng-packs/packages/core/src/lib/models/common.ts
  3. 10
      npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts
  4. 3
      npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts
  5. 7
      npm/ng-packs/packages/core/testing/ng-package.json
  6. 48
      npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts
  7. 1
      npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts
  8. 12
      npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts
  9. 2
      npm/ng-packs/packages/core/testing/src/public-api.ts
  10. 6
      npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts
  11. 17
      npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts
  12. 6
      npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts
  13. 1
      npm/ng-packs/tsconfig.json

28
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 { HttpClientModule, HttpClientXsrfModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@ -24,7 +24,7 @@ import { RoutesHandler } from './handlers/routes.handler';
import { ApiInterceptor } from './interceptors/api.interceptor'; import { ApiInterceptor } from './interceptors/api.interceptor';
import { LocalizationModule } from './localization.module'; import { LocalizationModule } from './localization.module';
import { ABP } from './models/common'; 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 { SortPipe } from './pipes/sort.pipe';
import { LocaleProvider } from './providers/locale.provider'; import { LocaleProvider } from './providers/locale.provider';
import { LocalizationService } from './services/localization.service'; import { LocalizationService } from './services/localization.service';
@ -121,17 +121,6 @@ export class BaseCoreModule {}
}) })
export class RootCoreModule {} 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 * CoreModule is the module that is publicly available
*/ */
@ -141,19 +130,6 @@ export class TestCoreModule {}
providers: [LocalizationPipe], providers: [LocalizationPipe],
}) })
export class CoreModule { export class CoreModule {
static forTest({ baseHref = '/' } = {} as ABP.Test): ModuleWithProviders<TestCoreModule> {
return {
ngModule: TestCoreModule,
providers: [
{ provide: APP_BASE_HREF, useValue: baseHref },
{
provide: LocalizationPipe,
useClass: MockLocalizationPipe,
},
],
};
}
static forRoot(options = {} as ABP.Root): ModuleWithProviders<RootCoreModule> { static forRoot(options = {} as ABP.Root): ModuleWithProviders<RootCoreModule> {
return { return {
ngModule: RootCoreModule, ngModule: RootCoreModule,

5
npm/ng-packs/packages/core/src/lib/models/common.ts

@ -1,5 +1,5 @@
import { EventEmitter, Type } from '@angular/core'; import { EventEmitter, Type } from '@angular/core';
import { Router } from '@angular/router'; import { Router, Routes } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { eLayoutType } from '../enums/common'; import { eLayoutType } from '../enums/common';
import { Environment } from './environment'; import { Environment } from './environment';
@ -12,8 +12,9 @@ export namespace ABP {
sendNullsAsQueryParam?: boolean; sendNullsAsQueryParam?: boolean;
} }
export interface Test { export interface Test extends Partial<Root> {
baseHref?: Router; baseHref?: Router;
routes?: Routes;
} }
export type PagedResponse<T> = { export type PagedResponse<T> = {

10
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;
}
}

3
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'; 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 // 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) => { return (resourceName: string, key: string, defaultValue: string) => {
if (resourceName === '_') return key; if (resourceName === '_') return key;
const resource = localization.values[resourceName]; const resource = snq(() => localization.values[resourceName]);
if (!resource) return defaultValue; if (!resource) return defaultValue;

7
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"
}
}

48
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<CoreTestingModule> {
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),
],
};
}
}

1
npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts

@ -0,0 +1 @@
export * from './mock-localization.pipe';

12
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;
}
}

2
npm/ng-packs/packages/core/testing/src/public-api.ts

@ -0,0 +1,2 @@
export * from './lib/core-testing.module';
export * from './lib/pipes';

6
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 { NgModule } from '@angular/core';
import { fakeAsync, tick } from '@angular/core/testing'; import { fakeAsync, tick } from '@angular/core/testing';
import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest';
@ -13,7 +13,7 @@ import { ConfirmationService } from '../services';
exports: [ConfirmationComponent], exports: [ConfirmationComponent],
entryComponents: [ConfirmationComponent], entryComponents: [ConfirmationComponent],
declarations: [ConfirmationComponent], declarations: [ConfirmationComponent],
imports: [CoreModule.forTest()], imports: [CoreTestingModule.forTest()],
}) })
export class MockModule {} export class MockModule {}
@ -22,7 +22,7 @@ describe('ConfirmationService', () => {
let service: ConfirmationService; let service: ConfirmationService;
const createService = createServiceFactory({ const createService = createServiceFactory({
service: ConfirmationService, service: ConfirmationService,
imports: [NgxsModule.forRoot(), CoreModule.forTest(), MockModule], imports: [NgxsModule.forRoot(), CoreTestingModule.forTest(), MockModule],
}); });
beforeEach(() => { beforeEach(() => {

17
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 { APP_BASE_HREF } from '@angular/common';
import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; import { HttpErrorResponse, HttpHeaders } from '@angular/common/http';
import { Component, NgModule } from '@angular/core'; import { Component, NgModule } from '@angular/core';
import { NavigationError, ResolveEnd, RouterModule } from '@angular/router';
import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; 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 { OAuthService } from 'angular-oauth2-oidc';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { HttpErrorWrapperComponent } from '../components/http-error-wrapper/http-error-wrapper.component'; 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 { ConfirmationService } from '../services';
import { httpErrorConfigFactory } from '../tokens/http-error.token'; import { httpErrorConfigFactory } from '../tokens/http-error.token';
@ -16,7 +16,7 @@ import { httpErrorConfigFactory } from '../tokens/http-error.token';
exports: [HttpErrorWrapperComponent], exports: [HttpErrorWrapperComponent],
declarations: [HttpErrorWrapperComponent], declarations: [HttpErrorWrapperComponent],
entryComponents: [HttpErrorWrapperComponent], entryComponents: [HttpErrorWrapperComponent],
imports: [CoreModule], imports: [CoreTestingModule],
}) })
class MockModule {} class MockModule {}
@ -31,12 +31,7 @@ const CONFIRMATION_BUTTONS = {
describe('ErrorHandler', () => { describe('ErrorHandler', () => {
const createService = createServiceFactory({ const createService = createServiceFactory({
service: ErrorHandler, service: ErrorHandler,
imports: [ imports: [NgxsModule.forRoot([]), CoreTestingModule.forTest(), MockModule],
RouterModule.forRoot([], { relativeLinkResolution: 'legacy' }),
NgxsModule.forRoot([]),
CoreModule,
MockModule,
],
mocks: [OAuthService], mocks: [OAuthService],
providers: [ providers: [
{ provide: APP_BASE_HREF, useValue: '/' }, { provide: APP_BASE_HREF, useValue: '/' },

6
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 { NgModule } from '@angular/core';
import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest';
import { NgxsModule } from '@ngxs/store'; import { NgxsModule } from '@ngxs/store';
@ -11,7 +11,7 @@ import { ToasterService } from '../services/toaster.service';
exports: [ToastContainerComponent], exports: [ToastContainerComponent],
entryComponents: [ToastContainerComponent], entryComponents: [ToastContainerComponent],
declarations: [ToastContainerComponent, ToastComponent], declarations: [ToastContainerComponent, ToastComponent],
imports: [CoreModule.forTest()], imports: [CoreTestingModule.forTest()],
}) })
export class MockModule {} export class MockModule {}
const toastClassPrefix = 'abp-toast'; const toastClassPrefix = 'abp-toast';
@ -21,7 +21,7 @@ describe('ToasterService', () => {
let service: ToasterService; let service: ToasterService;
const createService = createServiceFactory({ const createService = createServiceFactory({
service: ToasterService, service: ToasterService,
imports: [NgxsModule.forRoot(), CoreModule.forTest(), MockModule], imports: [NgxsModule.forRoot(), CoreTestingModule.forTest(), MockModule],
}); });
beforeEach(() => { beforeEach(() => {

1
npm/ng-packs/tsconfig.json

@ -17,6 +17,7 @@
"paths": { "paths": {
"@abp/ng.core": ["packages/core/src/public-api.ts"], "@abp/ng.core": ["packages/core/src/public-api.ts"],
"@abp/ng.core/locale": ["packages/core/locale/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": ["packages/theme-shared/src/public-api.ts"],
"@abp/ng.theme.shared/extensions": ["packages/theme-shared/extensions/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"], "@abp/ng.components/tree": ["packages/components/tree/src/public-api.ts"],

Loading…
Cancel
Save