From 898c800d8202264bfdeeeb593c924a6561c43ce8 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 11 Oct 2019 15:40:54 +0300 Subject: [PATCH 1/4] test(core): add premission.directive.spec --- .../lib/tests/permission.directive.spec.ts | 46 +++++++++++++++++++ .../core/src/lib/tests/rest.service.spec.ts | 4 +- 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts new file mode 100644 index 0000000000..c1d324620d --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts @@ -0,0 +1,46 @@ +import { PermissionDirective } from '../directives/permission.directive'; +import { SpectatorDirective, createDirectiveFactory, SpyObject } from '@ngneat/spectator/jest'; +import { Store } from '@ngxs/store'; +import { of, Subject } from 'rxjs'; + +describe('PermissionDirective', () => { + let spectator: SpectatorDirective; + let directive: PermissionDirective; + const grantedPolicy$ = new Subject(); + + const createDirective = createDirectiveFactory({ + directive: PermissionDirective, + providers: [{ provide: Store, useValue: { select: () => grantedPolicy$ } }], + }); + + describe('with condition', () => { + beforeEach(() => { + spectator = createDirective(`
Testing Permission Directive
`); + directive = spectator.directive; + }); + + it('should be created', () => { + expect(directive).toBeTruthy(); + }); + + it('should remove the element from DOM', () => { + grantedPolicy$.next(true); + expect(spectator.query('#test-element')).toBeTruthy(); + grantedPolicy$.next(false); + expect(spectator.query('#test-element')).toBeFalsy(); + }); + }); + + describe('without condition', () => { + beforeEach(() => { + spectator = createDirective('
Testing Permission Directive
'); + directive = spectator.directive; + }); + + it('should do nothing when condition is undefined', () => { + const spy = jest.spyOn(spectator.get(Store), 'select'); + grantedPolicy$.next(false); + expect(spy.mock.calls).toHaveLength(0); + }); + }); +}); diff --git a/npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts index 6a06ec2c12..3d5cc11287 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts @@ -62,7 +62,7 @@ describe('HttpClient testing', () => { }); test('should handle the error', () => { - jest.spyOn(spectator.httpClient, 'request').mockReturnValue(throwError('An error')); + jest.spyOn(spectator.httpClient, 'request').mockReturnValue(throwError('Testing error')); const spy = jest.spyOn(store, 'dispatch'); spectator.service @@ -78,7 +78,7 @@ describe('HttpClient testing', () => { }); test('should not handle the error when skipHandleError is true', () => { - jest.spyOn(spectator.httpClient, 'request').mockReturnValue(throwError('An error')); + jest.spyOn(spectator.httpClient, 'request').mockReturnValue(throwError('Testing error')); const spy = jest.spyOn(store, 'dispatch'); spectator.service From 7dfce0ef581aca7cb10ac1be329433c83af12cae Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 11 Oct 2019 16:02:34 +0300 Subject: [PATCH 2/4] test(core): add auth.guard.spec --- .../core/src/lib/tests/auth.guard.spec.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/auth.guard.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/auth.guard.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/auth.guard.spec.ts new file mode 100644 index 0000000000..3ae113c948 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/auth.guard.spec.ts @@ -0,0 +1,35 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator'; +import { AuthGuard } from '../guards/auth.guard'; +import { OAuthService } from 'angular-oauth2-oidc'; +import { RouterModule, UrlTree, Router } from '@angular/router'; +import { RouterOutletComponent } from '../components'; +import { APP_BASE_HREF } from '@angular/common'; + +describe('AuthGuard', () => { + let spectator: SpectatorService; + let guard: AuthGuard; + const createService = createServiceFactory({ + service: AuthGuard, + mocks: [OAuthService], + imports: [RouterModule.forRoot([{ path: '', component: RouterOutletComponent }])], + declarations: [RouterOutletComponent], + providers: [{ provide: APP_BASE_HREF, useValue: '/' }], + }); + + beforeEach(() => { + spectator = createService(); + guard = spectator.service; + }); + + it('should return true when user logged in', () => { + spectator.get(OAuthService).hasValidAccessToken.andReturn(true); + expect(guard.canActivate(null, null)).toBe(true); + }); + + it('should return url tree when user not logged in', () => { + const router = spectator.get(Router); + const expectedUrlTree = router.createUrlTree(['/account/login'], { state: { redirectUrl: '/' } }); + spectator.get(OAuthService).hasValidAccessToken.andReturn(false); + expect(guard.canActivate(null, { url: '/' } as any) as UrlTree).toEqual(expectedUrlTree); + }); +}); From edea62e938319782263cebaffaf4995ecaeacb72 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 11 Oct 2019 16:21:54 +0300 Subject: [PATCH 3/4] test(core): add permission.guard.spec --- .../core/src/lib/tests/auth.guard.spec.ts | 2 +- .../src/lib/tests/permission.guard.spec.ts | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/auth.guard.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/auth.guard.spec.ts index 3ae113c948..93339bcbcc 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/auth.guard.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/auth.guard.spec.ts @@ -1,4 +1,4 @@ -import { createServiceFactory, SpectatorService } from '@ngneat/spectator'; +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; import { AuthGuard } from '../guards/auth.guard'; import { OAuthService } from 'angular-oauth2-oidc'; import { RouterModule, UrlTree, Router } from '@angular/router'; diff --git a/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts new file mode 100644 index 0000000000..b358005837 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts @@ -0,0 +1,43 @@ +import { createServiceFactory, SpectatorService, SpyObject } from '@ngneat/spectator/jest'; +import { Store } from '@ngxs/store'; +import { of } from 'rxjs'; +import { PermissionGuard } from '../guards/permission.guard'; +import { RestOccurError } from '../actions'; + +describe('PermissionGuard', () => { + let spectator: SpectatorService; + let guard: PermissionGuard; + let store: SpyObject; + + const createService = createServiceFactory({ + service: PermissionGuard, + mocks: [Store], + }); + + beforeEach(() => { + spectator = createService(); + guard = spectator.service; + store = spectator.get(Store); + }); + + it('should return true when the grantedPolicy is true', done => { + store.select.andReturn(of(true)); + const spy = jest.spyOn(store, 'dispatch'); + guard.canActivate({ data: { requiredPolicy: '' } } as any).subscribe(res => { + expect(res).toBe(true); + expect(spy.mock.calls).toHaveLength(0); + done(); + }); + }); + + it('should return false and dispatch RestOccurError when the grantedPolicy is false', done => { + store.select.andReturn(of(false)); + const spy = jest.spyOn(store, 'dispatch'); + guard.canActivate({ data: { requiredPolicy: '' } } as any).subscribe(res => { + expect(res).toBe(false); + expect(spy.mock.calls[0][0] instanceof RestOccurError).toBeTruthy(); + expect((spy.mock.calls[0][0] as RestOccurError).payload).toEqual({ status: 403 }); + done(); + }); + }); +}); From 2d3645843c92564ab0f55babd8e67cf0314f6f0d Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 11 Oct 2019 17:08:20 +0300 Subject: [PATCH 4/4] refactor(core): remove unnecessary injected service --- npm/ng-packs/packages/core/src/lib/guards/auth.guard.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/guards/auth.guard.ts b/npm/ng-packs/packages/core/src/lib/guards/auth.guard.ts index 5ef01db246..cbd59fb5df 100644 --- a/npm/ng-packs/packages/core/src/lib/guards/auth.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/guards/auth.guard.ts @@ -1,15 +1,13 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, UrlTree, Router } from '@angular/router'; -import { Store } from '@ngxs/store'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; import { OAuthService } from 'angular-oauth2-oidc'; import { Observable } from 'rxjs'; -import { Navigate } from '@ngxs/router-plugin'; @Injectable({ providedIn: 'root', }) export class AuthGuard implements CanActivate { - constructor(private oauthService: OAuthService, private store: Store, private router: Router) {} + constructor(private oauthService: OAuthService, private router: Router) {} canActivate(_: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | boolean | UrlTree { const hasValidAccessToken = this.oauthService.hasValidAccessToken();