diff --git a/npm/ng-packs/packages/core/src/lib/tests/content-projection.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/content-projection.service.spec.ts index 30f9f92e73..34f9451b0a 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/content-projection.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/content-projection.service.spec.ts @@ -10,7 +10,6 @@ describe('ContentProjectionService', () => { // createServiceFactory does not accept entryComponents directly @NgModule({ declarations: [TestComponent], - entryComponents: [TestComponent], }) class TestModule {} diff --git a/npm/ng-packs/packages/core/src/lib/tests/dynamic-layout.component.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/dynamic-layout.component.spec.ts index 2076be84b4..411a9e8041 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/dynamic-layout.component.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/dynamic-layout.component.spec.ts @@ -36,7 +36,6 @@ const LAYOUTS = [ @NgModule({ imports: [RouterModule], declarations: [...LAYOUTS], - entryComponents: [...LAYOUTS], }) class DummyLayoutModule {} diff --git a/npm/ng-packs/packages/core/src/lib/tests/object-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/object-utils.spec.ts index 235d2e90ed..f2548bfc79 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/object-utils.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/object-utils.spec.ts @@ -43,11 +43,9 @@ describe('DeepMerge', () => { ); it('should correctly return when both inputs are objects with different fields', () => { - const target = { a: 1 }; - const source = { b: 2 }; const expected = { a: 1, b: 2 }; - expect(deepMerge(target, source)).toEqual(expected); - expect(deepMerge(source, target)).toEqual(expected); + expect(deepMerge({ a: 1 }, { b: 2 })).toEqual(expected); + expect(deepMerge({ b: 2 }, { a: 1 })).toEqual(expected); }); it('should correctly return when both inputs are object with same fields but different values', () => { diff --git a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts index ab9c6a76ae..b2ce154421 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts @@ -3,14 +3,15 @@ import { take } from 'rxjs/operators'; import { RoutesService } from '../services/routes.service'; import { DummyInjector } from './utils/common.utils'; import { mockPermissionService } from './utils/permission-service.spec.utils'; +import { mockCompareFunction } from './utils/mock-compare-function'; const updateStream$ = new Subject(); - export const mockRoutesService = (injectorPayload = {} as { [key: string]: any }) => { const injector = new DummyInjector({ PermissionService: mockPermissionService(), ConfigStateService: { createOnUpdateStream: () => updateStream$ }, OTHERS_GROUP: 'OthersGroup', + SORT_COMPARE_FUNC: mockCompareFunction, ...injectorPayload, }); return new RoutesService(injector); @@ -50,7 +51,6 @@ describe('Routes Service', () => { const flat = await lastValueFrom(service.flat$.pipe(take(1))); const tree = await lastValueFrom(service.tree$.pipe(take(1))); const visible = await lastValueFrom(service.visible$.pipe(take(1))); - expect(flat.length).toBe(5); expect(flat[0].name).toBe('baz'); expect(flat[1].name).toBe('qux'); diff --git a/npm/ng-packs/packages/core/src/lib/tests/utils/mock-compare-function.ts b/npm/ng-packs/packages/core/src/lib/tests/utils/mock-compare-function.ts new file mode 100644 index 0000000000..d43adcc2f0 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/utils/mock-compare-function.ts @@ -0,0 +1,19 @@ +import { ABP } from '@abp/ng.core'; + +export const mockCompareFunction = (a: ABP.Route, b: ABP.Route) => { + const aName = a.name; + const bName = b.name; + const aNumber = a.order; + const bNumber = b.order; + + if (!Number.isInteger(aNumber)) return 1; + if (!Number.isInteger(bNumber)) return -1; + + if (aNumber > bNumber) return 1 + if (aNumber < bNumber) return -1 + + if ( aName > bName ) return 1; + if ( aName < bName ) return -1; + + return 0 +} \ No newline at end of file diff --git a/npm/ng-packs/packages/oauth/src/lib/tests/api.interceptor.spec.ts b/npm/ng-packs/packages/oauth/src/lib/tests/api.interceptor.spec.ts index 1b102b8589..04a7652300 100644 --- a/npm/ng-packs/packages/oauth/src/lib/tests/api.interceptor.spec.ts +++ b/npm/ng-packs/packages/oauth/src/lib/tests/api.interceptor.spec.ts @@ -3,11 +3,12 @@ import { SpyObject } from '@ngneat/spectator'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; import { OAuthService } from 'angular-oauth2-oidc'; import { Subject, timer } from 'rxjs'; -import { ApiInterceptor, HttpWaitService, SessionStateService, TENANT_KEY } from '@abp/ng.core'; +import { HttpWaitService, SessionStateService, TENANT_KEY } from '@abp/ng.core'; +import { OAuthApiInterceptor } from '../interceptors'; describe('ApiInterceptor', () => { - let spectator: SpectatorService; - let interceptor: ApiInterceptor; + let spectator: SpectatorService; + let interceptor: OAuthApiInterceptor; let oauthService: SpyObject; let sessionState: SpyObject; let httpWaitService: SpyObject; @@ -15,7 +16,7 @@ describe('ApiInterceptor', () => { const testTenantKey = 'TEST_TENANT_KEY'; const createService = createServiceFactory({ - service: ApiInterceptor, + service: OAuthApiInterceptor, mocks: [OAuthService, SessionStateService], providers: [{ provide: TENANT_KEY, useValue: testTenantKey }], }); diff --git a/npm/ng-packs/packages/oauth/src/lib/tests/auth.guard.spec.ts b/npm/ng-packs/packages/oauth/src/lib/tests/auth.guard.spec.ts index 1440f9249a..dbfb3c74f3 100644 --- a/npm/ng-packs/packages/oauth/src/lib/tests/auth.guard.spec.ts +++ b/npm/ng-packs/packages/oauth/src/lib/tests/auth.guard.spec.ts @@ -1,11 +1,15 @@ -import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { createServiceFactory, SpectatorService, createSpyObject } from '@ngneat/spectator/jest'; import { OAuthService } from 'angular-oauth2-oidc'; import { AbpOAuthGuard } from '../guards/oauth.guard'; import { AuthService } from '@abp/ng.core'; +import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; describe('AuthGuard', () => { let spectator: SpectatorService; - let guard: AbpOAuthGuard; + let guard : AbpOAuthGuard; + let route = createSpyObject(ActivatedRouteSnapshot) + let state = createSpyObject(RouterStateSnapshot) + const createService = createServiceFactory({ service: AbpOAuthGuard, mocks: [OAuthService, AuthService], @@ -18,7 +22,7 @@ describe('AuthGuard', () => { it('should return true when user logged in', () => { spectator.inject(OAuthService).hasValidAccessToken.andReturn(true); - expect(guard.canActivate()).toBe(true); + expect(guard.canActivate(route, state)).toBe(true); }); it('should execute the navigateToLogin method of the authService', () => { @@ -26,7 +30,7 @@ describe('AuthGuard', () => { spectator.inject(OAuthService).hasValidAccessToken.andReturn(false); const navigateToLoginSpy = jest.spyOn(authService, 'navigateToLogin'); - expect(guard.canActivate()).toBe(false); + expect(guard.canActivate(route, state)).toBe(false); expect(navigateToLoginSpy).toHaveBeenCalled(); }); }); diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-actions.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-actions.spec.ts index 35833a1950..5ee3889c0c 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-actions.spec.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-actions.spec.ts @@ -107,7 +107,7 @@ describe('EntityAction', () => { expect(action.text).toBe(options.text); expect(action.action).toBe(options.action); - expect(action.permission).toBeUndefined(); + expect(action.permission).toBe(''); expect(action.visible(null)).toBe(true); expect(action.icon).toBe(''); }); diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-props.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-props.spec.ts index 8de503c5f0..bb1c2c7cc4 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-props.spec.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-props.spec.ts @@ -111,13 +111,11 @@ describe('EntityProp', () => { type: ePropType.String, name: 'NAME', }; - const prop = new EntityProp(options); - expect(prop.type).toBe(options.type); expect(prop.name).toBe(options.name); expect(prop.displayName).toBe(options.name); - expect(prop.permission).toBeUndefined(); + expect(prop.permission).toBe(''); expect(prop.visible()).toBe(true); expect(prop.sortable).toBe(false); expect(prop.columnWidth).toBeUndefined(); diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts index d0fbdde765..56c61e1fc8 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts @@ -1,4 +1,4 @@ -import { ConfigStateService, LocalizationService } from '@abp/ng.core'; +import { ConfigStateService, ExtensionEnumFieldDto, LocalizationService } from '@abp/ng.core'; import { BehaviorSubject, of } from 'rxjs'; import { take } from 'rxjs/operators'; import { PropData } from '../lib/models/props'; @@ -11,10 +11,10 @@ const mockSessionState = { onLanguageChange$: () => new BehaviorSubject('tr'), } as any; -const fields = [ - { name: 'foo', value: 1 }, - { name: 'bar', value: 2 }, - { name: 'baz', value: 3 }, +const fields: ExtensionEnumFieldDto[] = [ + { name: 'foo', value: {number: 1} }, + { name: 'bar', value: {number: 2} }, + { name: 'baz', value: {number: 3} }, ]; class MockPropData extends PropData { @@ -42,17 +42,13 @@ describe('Enum Utils', () => { describe('#createEnum', () => { const enumFromFields = createEnum(fields); - test.each` - key | expected - ${'foo'} | ${1} - ${'bar'} | ${2} - ${'baz'} | ${3} - ${1} | ${'foo'} - ${2} | ${'bar'} - ${3} | ${'baz'} - `('should create an enum that returns $expected when $key is accessed', ({ key, expected }) => { - expect(enumFromFields[key]).toBe(expected); - }); + test.each([ + {name:'foo', value: 'number', expected: 1}, + {name:'bar', value: 'number', expected: 2}, + {name:'baz', value: 'number', expected: 3} + ])('should create an enum that returns $expected when $name $value is accessed',({name, value, expected})=>{ + expect(enumFromFields[name][value]).toBe(expected); + }) }); describe('#createEnumValueResolver', () => { @@ -75,7 +71,7 @@ describe('Enum Utils', () => { 'EnumProp', ); const propData = new MockPropData({ - extraProperties: { EnumProp: value }, + extraProperties: { EnumProp: value }, }); propData.getInjected = () => service as any; @@ -111,8 +107,9 @@ describe('Enum Utils', () => { function createMockLocalizationService() { const fakeAppConfigService = { get: () => of({ localization: mockL10n }) } as any; - const configState = new ConfigStateService(fakeAppConfigService); + const fakeLocalizationService = { get: () => of({ localization: mockL10n }) } as any; + const configState = new ConfigStateService(fakeAppConfigService, fakeLocalizationService, false); configState.refreshAppState(); return new LocalizationService(mockSessionState, null, null, configState); -} +} \ No newline at end of file diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.spec.ts index bd933741a5..3b3298babc 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.spec.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.spec.ts @@ -127,14 +127,14 @@ describe('FormProp', () => { expect(prop.type).toBe(options.type); expect(prop.name).toBe(options.name); expect(prop.displayName).toBe(options.name); - expect(prop.permission).toBeUndefined(); + expect(prop.permission).toBe(''); expect(prop.visible()).toBe(true); expect(prop.asyncValidators(null)).toEqual([]); expect(prop.validators(null)).toEqual([]); expect(prop.disabled()).toBe(false); expect(prop.readonly()).toBe(false); expect(prop.autocomplete).toBe('off'); - expect(prop.defaultValue).toBeNull(); + expect(prop.defaultValue).toBe(''); expect(prop.options).toBeUndefined(); expect(prop.id).toBe(options.name); }); @@ -144,7 +144,7 @@ describe('FormProp', () => { ${0} | ${0} ${''} | ${''} ${false} | ${false} - ${undefined} | ${null} + ${undefined} | ${''} `( 'should set defaultValue as $expected when $defaultValue is given', ({ defaultValue, expected }) => { diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/localization.util.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/localization.util.spec.ts index 007b304b42..da41ea913b 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/tests/localization.util.spec.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/localization.util.spec.ts @@ -3,17 +3,20 @@ import { createDisplayNameLocalizationPipeKeyGenerator } from '../lib/utils/loca describe('Localization Utils', () => { describe('#createDisplayNameLocalizationPipeKeyGenerator', () => { - const generateDisplayName = createDisplayNameLocalizationPipeKeyGenerator({ - values: { + const localization: ApplicationLocalizationConfigurationDto = { + values:{ Foo: { Bar: 'Bar', 'DisplayName:Bar': 'Bar' }, Default: { Bar: 'Bar', 'DisplayName:Bar': 'Bar' }, }, defaultResourceName: 'Default', - currentCulture: null, + resources: {}, languages: [], languageFilesMap: null, languagesMap: null, - } as ApplicationLocalizationConfigurationDto); + currentCulture: null + } + + const generateDisplayName = createDisplayNameLocalizationPipeKeyGenerator(localization); test.each` displayName | fallback | expected diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts index cedd632165..c9efdce913 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts @@ -11,7 +11,8 @@ import { } from '../lib/utils/state.util'; const fakeAppConfigService = { get: () => of(createMockState()) } as any; -const configState = new ConfigStateService(fakeAppConfigService); +const fakeLocalizationService = { get: () => of(createMockState()) } as any; +const configState = new ConfigStateService(fakeAppConfigService,fakeLocalizationService,false); configState.refreshAppState(); describe('State Utils', () => { @@ -30,7 +31,7 @@ describe('State Utils', () => { }); it('should not emit when object extensions do not exist', done => { - const emptyConfigState = new ConfigStateService(null); + const emptyConfigState = new ConfigStateService(null,null,false); const emit = jest.fn(); getObjectExtensionEntitiesFromStore(emptyConfigState, 'Identity').subscribe(emit); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts index 75f0c8ab55..40a1109de0 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts @@ -5,7 +5,7 @@ import { RouterOutletComponent, RoutesService, } from '@abp/ng.core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; import { RouterModule } from '@angular/router'; import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator/jest'; // eslint-disable-next-line @nx/enforce-module-boundaries @@ -34,7 +34,7 @@ describe('BreadcrumbComponent', () => { }, ], declarations: [LocalizationPipe, BreadcrumbComponent, BreadcrumbItemsComponent], - imports: [RouterModule], + imports: [RouterModule,HttpClientModule], routes: [ { path: '', @@ -62,7 +62,6 @@ describe('BreadcrumbComponent', () => { routes.add(mockRoutes); await spectator.router.navigateByUrl('/identity/users'); spectator.detectChanges(); - const elements = spectator.queryAll('li'); expect(elements).toHaveLength(3); expect(elements[1]).toHaveText('Identity'); 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 5674a501de..587365e3f6 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 @@ -10,7 +10,6 @@ import { CONFIRMATION_ICONS, DEFAULT_CONFIRMATION_ICONS } from '../tokens/confir @NgModule({ exports: [ConfirmationComponent], - entryComponents: [ConfirmationComponent], declarations: [ConfirmationComponent], imports: [CoreTestingModule.withConfig()], providers: [{ provide: CONFIRMATION_ICONS, useValue: DEFAULT_CONFIRMATION_ICONS }], diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.component.spec.ts index 510ef4104d..5bde4d2a54 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.component.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.component.spec.ts @@ -1,5 +1,5 @@ import { CORE_OPTIONS, LocalizationPipe } from '@abp/ng.core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; import { ElementRef, Renderer2 } from '@angular/core'; import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest'; import { Subject } from 'rxjs'; @@ -19,6 +19,7 @@ describe('ErrorComponent', () => { useValue: { nativeElement: document.createElement('div') }, }, ], + imports:[HttpClientModule] }); beforeEach(() => { 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 d0d41edf22..4e1b2830c7 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 @@ -8,7 +8,6 @@ import { ToasterService } from '../services/toaster.service'; @NgModule({ exports: [ToastContainerComponent], - entryComponents: [ToastContainerComponent], declarations: [ToastContainerComponent, ToastComponent], imports: [CoreTestingModule.withConfig()], })