aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/test-utilities/activated-route.mock.ts
blob: 72707c5ecfe97264a5f30c9bb0f9825897247dfe (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
import { ParamMap, ActivatedRouteSnapshot, ActivatedRoute } from '@angular/router';

import { Observable, BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';

export type PartialMock<T> = {
  [P in keyof T]?: T[P] | PartialMock<T[P]>;
};

export interface ParamMapCreator { [name: string]: string | string[]; }

export class MockActivatedRouteSnapshot implements PartialMock<ActivatedRouteSnapshot> {

  private paramMapInternal: ParamMap;

  constructor({ mockParamMap }: { mockParamMap: ParamMapCreator } = { mockParamMap: {} }) {
    this.paramMapInternal = {
      keys: Object.keys(mockParamMap),
      get(name: string): string | null {
        const param = mockParamMap[name];
        if (typeof param === 'string') {
          return param;
        } else if (param instanceof Array) {
          if (param.length === 0) {
            return null;
          }
          return param[0];
        }
        return null;
      },
      getAll(name: string): string[] {
        const param = mockParamMap[name];
        if (typeof param === 'string') {
          return [param];
        } else if (param instanceof Array) {
          return param;
        }
        return [];
      },
      has(name: string): boolean {
        return mockParamMap.hasOwnProperty(name);
      }
    };
  }

  get paramMap(): ParamMap {
    return this.paramMapInternal;
  }
}

export class MockActivatedRoute implements PartialMock<ActivatedRoute> {

  snapshot$ = new BehaviorSubject<MockActivatedRouteSnapshot>(new MockActivatedRouteSnapshot());

  get paramMap(): Observable<ParamMap> {
    return this.snapshot$.pipe(map(snapshot => snapshot.paramMap));
  }

  get snapshot(): MockActivatedRouteSnapshot {
    return this.snapshot$.value;
  }

  pushSnapshot(snapshot: MockActivatedRouteSnapshot) {
    this.snapshot$.next(snapshot);
  }

  pushSnapshotWithParamMap(mockParamMap: ParamMapCreator) {
    this.pushSnapshot(new MockActivatedRouteSnapshot({mockParamMap}));
  }
}