1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
import { TestBed } from '@angular/core/testing';
import { HttpRequest } from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { UserInfo } from '../user-info';
import {
UserService, UserCredentials, CreateTokenResult,
UserLoginState, TokenValidationRequest, TokenValidationResult
} from './user.service';
describe('UserService', () => {
const tokenCreateUrl = '/api/User/CreateToken';
beforeEach(() => TestBed.configureTestingModule({
imports: [HttpClientTestingModule]
}));
it('should be created', () => {
const service: UserService = TestBed.get(UserService);
expect(service).toBeTruthy();
});
it('should be nologin at first', () => {
const service: UserService = TestBed.get(UserService);
service.validateUserLoginState().subscribe(result => {
expect(result.state).toBe('nologin');
});
});
it('login should work well', () => {
const service: UserService = TestBed.get(UserService);
const mockUserInfo: UserInfo = {
username: 'user',
roles: ['user', 'other']
};
service.tryLogin('user', 'user').subscribe(result => {
expect(result).toEqual(mockUserInfo);
});
const httpController = TestBed.get(HttpTestingController) as HttpTestingController;
httpController.expectOne((request: HttpRequest<UserCredentials>) =>
request.url === tokenCreateUrl &&
request.body.username === 'user' &&
request.body.password === 'user').flush(<CreateTokenResult>{
token: 'test-token',
userInfo: mockUserInfo
});
httpController.verify();
});
describe('validateUserLoginState', () => {
let service: UserService;
let httpController: HttpTestingController;
const mockUserInfo: UserInfo = {
username: 'user',
roles: ['user', 'other']
};
const mockToken = 'mock-token';
const tokenValidateRequestMatcher = (req: HttpRequest<TokenValidationRequest>) => {
return req.url === '/api/User/ValidateToken' && req.body.token === mockToken;
}
beforeEach(() => {
service = TestBed.get(UserService);
httpController = TestBed.get(HttpTestingController);
service.tryLogin('user', 'user').subscribe(); // subscribe to activate login
httpController.expectOne(tokenCreateUrl).flush(<CreateTokenResult>{
token: mockToken,
userInfo: mockUserInfo
});
});
it('success should work well', () => {
service.validateUserLoginState().subscribe((result: UserLoginState) => {
expect(result).toEqual(<UserLoginState>{
state: 'success',
userInfo: mockUserInfo
});
});
httpController.expectOne(tokenValidateRequestMatcher).flush(<TokenValidationResult>{
isValid: true,
userInfo: mockUserInfo
});
httpController.verify();
});
it('invalid should work well', () => {
service.validateUserLoginState().subscribe((result: UserLoginState) => {
expect(result).toEqual(<UserLoginState>{
state: 'invalidlogin'
});
});
httpController.expectOne(tokenValidateRequestMatcher).flush(<TokenValidationResult>{
isValid: false
});
httpController.verify();
});
});
// TODO: test on error situations.
});
|