aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/user/user-service/user.service.spec.ts
blob: 28cfefd7620947083f79b2d6b1f27f82fe226cc2 (plain)
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.
});