aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.spec.ts
blob: 49b7bbc4d108a2b33fcf0911c009807f5beb4c44 (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
import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

import {
  TodoListService, WorkItem, AzureDevOpsAccessInfo,
  WiqlResult, WiqlWorkItemResult, WorkItemResult, WorkItemTypeResult
} from './todo-list.service';
import { toArray } from 'rxjs/operators';


describe('TodoListServiceService', () => {
  beforeEach(() => TestBed.configureTestingModule({
    imports: [HttpClientTestingModule]
  }));

  it('should be created', () => {

    const service: TodoListService = TestBed.get(TodoListService);
    expect(service).toBeTruthy();
  });

  it('should work well', () => {
    const service: TodoListService = TestBed.get(TodoListService);
    expect(service).toBeTruthy();

    const mockAccessInfo: AzureDevOpsAccessInfo = {
      username: 'testusername',
      personalAccessToken: 'testtoken',
      organization: 'testorganization',
      project: 'testproject'
    };

    const baseUrl = `https://dev.azure.com/${mockAccessInfo.organization}/${mockAccessInfo.project}/`;

    const mockWorkItems: WorkItem[] = Array.from({ length: 2 }, (_, i) => <WorkItem>{
      id: i,
      title: 'Test work item ' + i,
      isCompleted: i === 0,
      detailUrl: `${baseUrl}_workitems/edit/${i}/`,
      iconUrl: `${baseUrl}_api/wit/icon/${i}`,
    });

    const workItemTypeMap = new Map<WorkItem, string>(Array.from(mockWorkItems, v => <[WorkItem, string]>[v, 'type' + v.id]));

    service.getWorkItemList().pipe(toArray()).subscribe(data => {
      expect(data).toEqual(mockWorkItems);
    });

    const httpController: HttpTestingController = TestBed.get(HttpTestingController);

    httpController.expectOne('/api/TodoPage/AzureDevOpsAccessInfo').flush(mockAccessInfo);

    const mockWiqlWorkItems: WiqlWorkItemResult[] = Array.from(mockWorkItems, v => <WiqlWorkItemResult>{
      id: v.id,
      url: `${baseUrl}_apis/wit/workItems/${v.id}`
    });

    const authorizationHeader = 'Basic ' + btoa(mockAccessInfo.username + ':' + mockAccessInfo.personalAccessToken);

    httpController.expectOne(req =>
      req.url === `${baseUrl}_apis/wit/wiql?api-version=5.0` &&
      req.headers.get('Authorization') === authorizationHeader
    ).flush(<WiqlResult>{ workItems: mockWiqlWorkItems });

    function mapWorkItemToResult(mockWorkItem: WorkItem): WorkItemResult {
      return {
        id: mockWorkItem.id,
        fields: {
          [TodoListService.titleFieldName]: mockWorkItem.title,
          [TodoListService.stateFieldName]: (mockWorkItem.isCompleted ? 'Closed' : 'Active'),
          [TodoListService.typeFieldName]: workItemTypeMap.get(mockWorkItem)
        }
      };
    }

    for (let i = 0; i < mockWorkItems.length; i++) {
      httpController.expectOne(req =>
        req.url === mockWiqlWorkItems[i].url &&
        req.headers.get('Authorization') === authorizationHeader
      ).flush(mapWorkItemToResult(mockWorkItems[i]));

      httpController.expectOne(req =>
        req.url === `${baseUrl}_apis/wit/workitemtypes/${encodeURIComponent(workItemTypeMap.get(mockWorkItems[i]))}?api-version=5.0` &&
        req.headers.get('Authorization') === authorizationHeader
      ).flush(<WorkItemTypeResult>{
        icon: {
          url: mockWorkItems[i].iconUrl
        }
      });
    }

    httpController.verify();
  });
});