aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-03-26 19:21:31 +0800
committercrupest <crupest@outlook.com>2019-03-26 19:21:31 +0800
commite436cf9ebb4776e3c837f1b0935f3ea2bf254d79 (patch)
tree4181096cc9f4c08148faee4a115f5a6f44f05497
parent1834e12467b06d4a5f8a3610e93ed201502d872f (diff)
downloadtimeline-e436cf9ebb4776e3c837f1b0935f3ea2bf254d79.tar.gz
timeline-e436cf9ebb4776e3c837f1b0935f3ea2bf254d79.tar.bz2
timeline-e436cf9ebb4776e3c837f1b0935f3ea2bf254d79.zip
Add unit test.
-rw-r--r--Timeline/ClientApp/src/app/test-utilities/router-link.mock.ts9
-rw-r--r--Timeline/ClientApp/src/app/user/auth.guard.spec.ts30
-rw-r--r--Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.spec.ts12
-rw-r--r--Timeline/ClientApp/src/app/user/user-logout/user-logout.component.html2
-rw-r--r--Timeline/ClientApp/src/app/user/user-logout/user-logout.component.spec.ts16
-rw-r--r--Timeline/ClientApp/src/app/user/user-logout/user-logout.component.ts3
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();
}
-
}