diff options
author | crupest <crupest@outlook.com> | 2019-03-26 19:21:31 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2019-03-26 19:21:31 +0800 |
commit | e436cf9ebb4776e3c837f1b0935f3ea2bf254d79 (patch) | |
tree | 4181096cc9f4c08148faee4a115f5a6f44f05497 | |
parent | 1834e12467b06d4a5f8a3610e93ed201502d872f (diff) | |
download | timeline-e436cf9ebb4776e3c837f1b0935f3ea2bf254d79.tar.gz timeline-e436cf9ebb4776e3c837f1b0935f3ea2bf254d79.tar.bz2 timeline-e436cf9ebb4776e3c837f1b0935f3ea2bf254d79.zip |
Add unit test.
6 files changed, 53 insertions, 19 deletions
diff --git a/Timeline/ClientApp/src/app/test-utilities/router-link.mock.ts b/Timeline/ClientApp/src/app/test-utilities/router-link.mock.ts new file mode 100644 index 00000000..7f4cde4d --- /dev/null +++ b/Timeline/ClientApp/src/app/test-utilities/router-link.mock.ts @@ -0,0 +1,9 @@ +import { Directive, Input } from '@angular/core'; + +@Directive({ + /* tslint:disable-next-line:directive-selector*/ + selector: '[routerLink]' +}) +export class RouterLinkStubDirective { + @Input('routerLink') linkParams: any; +} diff --git a/Timeline/ClientApp/src/app/user/auth.guard.spec.ts b/Timeline/ClientApp/src/app/user/auth.guard.spec.ts index 42e35bf7..6a36fea6 100644 --- a/Timeline/ClientApp/src/app/user/auth.guard.spec.ts +++ b/Timeline/ClientApp/src/app/user/auth.guard.spec.ts @@ -1,3 +1,5 @@ +import { Observable, of } from 'rxjs'; + import { AuthGuard, AuthStrategy } from './auth.guard'; import { UserInfo } from './entities'; @@ -8,10 +10,9 @@ describe('AuthGuard', () => { } authStrategy: AuthStrategy = 'all'; - onAuthFailed: () => void = () => { }; } - let mockUserService: { currentUserInfo: UserInfo | null }; + let mockUserService: { userInfo$: Observable<UserInfo | null> }; let guard: ConfiurableAuthGuard; let onAuthFialedSpy: jasmine.Spy; @@ -28,19 +29,27 @@ describe('AuthGuard', () => { return () => { guard.authStrategy = authStrategy; - mockUserService.currentUserInfo = null; - expect(guard.canActivate(<any>null, <any>null)).toBe(result.nologin); + function testWith(userInfo: UserInfo | null, r: boolean) { + mockUserService.userInfo$ = of(userInfo); - mockUserService.currentUserInfo = { username: 'user', roles: [] }; - expect(guard.canActivate(<any>null, <any>null)).toBe(result.loginWithNoRole); + const rawResult = guard.canActivate(<any>null, <any>null); + if (typeof rawResult === 'boolean') { + expect(rawResult).toBe(r); + } else if (rawResult instanceof Observable) { + rawResult.subscribe(next => expect(next).toBe(r)); + } else { + throw new Error('Unsupported return type.'); + } + } - mockUserService.currentUserInfo = { username: 'user', roles: mockRoles }; - expect(guard.canActivate(<any>null, <any>null)).toBe(result.loginWithMockRoles); + testWith(null, result.nologin); + testWith({ username: 'user', roles: [] }, result.loginWithNoRole); + testWith({ username: 'user', roles: mockRoles }, result.loginWithMockRoles); }; } beforeEach(() => { - mockUserService = { currentUserInfo: null }; + mockUserService = { userInfo$: of(null) }; guard = new ConfiurableAuthGuard(mockUserService); onAuthFialedSpy = spyOn(guard, 'onAuthFailed'); }); @@ -54,8 +63,7 @@ describe('AuthGuard', () => { it('auth failed callback should be called', () => { guard.authStrategy = 'requirelogin'; - mockUserService.currentUserInfo = null; - guard.canActivate(<any>null, <any>null); + (<Observable<boolean>>guard.canActivate(<any>null, <any>null)).subscribe(); expect(onAuthFialedSpy).toHaveBeenCalled(); }); }); diff --git a/Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.spec.ts b/Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.spec.ts index ff253add..3eba2696 100644 --- a/Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.spec.ts +++ b/Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.spec.ts @@ -2,7 +2,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { ActivatedRoute } from '@angular/router'; -import { MockActivatedRoute } from 'src/app/test-utilities/activated-route.mock'; +import { RouterLinkStubDirective } from '../../test-utilities/router-link.mock'; +import { MockActivatedRoute } from '../../test-utilities/activated-route.mock'; import { createMockInternalUserService } from '../internal-user-service/internal-user.service.mock'; import { UserLoginSuccessComponent } from './user-login-success.component'; @@ -29,7 +30,7 @@ describe('UserLoginSuccessComponent', () => { (<any>mockInternalUserService).currentUserInfo = mockUserInfo; TestBed.configureTestingModule({ - declarations: [UserLoginSuccessComponent], + declarations: [UserLoginSuccessComponent, RouterLinkStubDirective], providers: [ { provide: InternalUserService, useValue: mockInternalUserService }, { provide: ActivatedRoute, useValue: mockActivatedRoute } @@ -64,4 +65,11 @@ describe('UserLoginSuccessComponent', () => { fixture.detectChanges(); expect((fixture.debugElement.query(By.css('p.login-success-message')))).toBeTruthy(); }); + + it('logout button should be set well', () => { + fixture.detectChanges(); + const routerLinkDirective: RouterLinkStubDirective = + fixture.debugElement.query(By.css('a')).injector.get(RouterLinkStubDirective); + expect(routerLinkDirective.linkParams).toEqual(['..', 'logout']); + }); }); diff --git a/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.html b/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.html index 56d96b83..309e5c83 100644 --- a/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.html +++ b/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.html @@ -1 +1 @@ -<p class="mat-body">Log out succeeded!</p> +<p class="mat-body">Logout successfully!</p> diff --git a/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.spec.ts b/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.spec.ts index 91369e01..855ea4a1 100644 --- a/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.spec.ts +++ b/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.spec.ts @@ -1,25 +1,35 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { UserLogoutComponent } from './user-logout.component'; +import { InternalUserService } from '../internal-user-service/internal-user.service'; describe('UserLogoutComponent', () => { let component: UserLogoutComponent; let fixture: ComponentFixture<UserLogoutComponent>; + let mockInternalUserService: jasmine.SpyObj<InternalUserService>; + beforeEach(async(() => { + mockInternalUserService = jasmine.createSpyObj('InternalUserService', ['logout']); + TestBed.configureTestingModule({ - declarations: [ UserLogoutComponent ] + declarations: [UserLogoutComponent], + providers: [{ provide: InternalUserService, useValue: mockInternalUserService }] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(UserLogoutComponent); component = fixture.componentInstance; - fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should logout on init', () => { + fixture.detectChanges(); + expect(mockInternalUserService.logout).toHaveBeenCalled(); + }); }); diff --git a/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.ts b/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.ts index 24002c84..e004196f 100644 --- a/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.ts +++ b/Timeline/ClientApp/src/app/user/user-logout/user-logout.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; + import { InternalUserService } from '../internal-user-service/internal-user.service'; @Component({ @@ -7,11 +8,9 @@ import { InternalUserService } from '../internal-user-service/internal-user.serv styleUrls: ['./user-logout.component.css'] }) export class UserLogoutComponent implements OnInit { - constructor(private userService: InternalUserService) { } ngOnInit() { this.userService.logout(); } - } |