Skip to content

Commit 6a60524

Browse files
committed
services testing complete
1 parent d403ef1 commit 6a60524

File tree

4 files changed

+163
-14
lines changed

4 files changed

+163
-14
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {CalculatorService} from './calculator.service';
2+
import {LoggerService} from './logger.service';
3+
import {TestBed} from '@angular/core/testing';
4+
5+
describe('CalculatorService', () => {
6+
let calculator: CalculatorService;
7+
let loggerSpy: any;
8+
beforeEach(() => {
9+
console.log('Calling beforeEach');
10+
loggerSpy = jasmine.createSpyObj('LoggerService', ['log']);
11+
12+
TestBed.configureTestingModule({
13+
providers: [
14+
CalculatorService,
15+
{ provide: LoggerService, useValue: loggerSpy }
16+
]
17+
});
18+
19+
calculator = TestBed.get(CalculatorService); // simulate angular DI
20+
});
21+
22+
it ('should add two numbers', () => {
23+
console.log('add test');
24+
const result = calculator.add(2, 2);
25+
expect(result).toBe(4);
26+
expect(loggerSpy.log).toHaveBeenCalledTimes(1);
27+
28+
});
29+
it ('should subtract two numbers', () => {
30+
console.log('subtract test');
31+
const result = calculator.subtract(2, 2);
32+
expect(result).toBe(0, 'unexpected subtraction result');
33+
expect(loggerSpy.log).toHaveBeenCalledTimes(1);
34+
});
35+
});

src/app/courses/services/calculator.service.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ export class CalculatorService {
1212

1313
}
1414

15-
add(n1: number, n2:number) {
16-
this.logger.log("Addition operation called");
15+
add(n1: number, n2: number) {
16+
this.logger.log('Addition operation called');
1717
return n1 + n2;
1818
}
1919

20-
subtract(n1: number, n2:number) {
21-
this.logger.log("Subtraction operation called");
20+
subtract(n1: number, n2: number) {
21+
this.logger.log('Subtraction operation called');
2222
return n1 - n2;
2323
}
2424

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import {CoursesService} from './courses.service';
2+
import {TestBed} from '@angular/core/testing';
3+
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
4+
import {COURSES, findLessonsForCourse} from '../../../../server/db-data';
5+
import {Course} from '../model/course';
6+
import {HttpErrorResponse} from '@angular/common/http';
7+
8+
describe('CoursesService', () => {
9+
let coursesService: CoursesService;
10+
let httpTestingController: HttpTestingController;
11+
12+
beforeEach(() => {
13+
TestBed.configureTestingModule({
14+
imports: [
15+
HttpClientTestingModule
16+
],
17+
providers: [
18+
CoursesService,
19+
]
20+
});
21+
22+
coursesService = TestBed.get(CoursesService);
23+
httpTestingController = TestBed.get(HttpTestingController);
24+
});
25+
it('should retrieve all courses', () => {
26+
coursesService.findAllCourses()
27+
.subscribe(courses => {
28+
expect(courses).toBeTruthy('no courses returned');
29+
expect(courses.length).toBe(12, 'incorrect number of courses');
30+
31+
const course = courses.find(course => course.id == 12);
32+
33+
expect(course.titles.description).toBe('Angular Testing Course');
34+
});
35+
36+
const req = httpTestingController.expectOne('/api/courses');
37+
expect(req.request.method).toEqual('GET');
38+
req.flush({
39+
payload: Object.values(COURSES)
40+
});
41+
42+
});
43+
it('should find a course by id', () => {
44+
coursesService.findCourseById(12)
45+
.subscribe(course => {
46+
expect(course).toBeTruthy('no course returned');
47+
expect(course.id).toBe(12, 'incorrect course id');
48+
});
49+
50+
const req = httpTestingController.expectOne('/api/courses/12');
51+
expect(req.request.method).toEqual('GET');
52+
req.flush(COURSES[12]);
53+
});
54+
55+
it('should save the course data', () => {
56+
const changes: Partial<Course> = {
57+
titles: {description: 'Testing Course'}
58+
};
59+
coursesService.saveCourse(12, changes).subscribe(course => {
60+
expect(course.id).toBe(12);
61+
});
62+
63+
const req = httpTestingController.expectOne('/api/courses/12');
64+
expect(req.request.method).toEqual('PUT');
65+
expect(req.request.body.titles).toEqual(changes.titles);
66+
67+
req.flush({
68+
...COURSES[12],
69+
...changes
70+
});
71+
72+
});
73+
74+
it('should give an error if save course fails', () => {
75+
const changes: Partial<Course> = {
76+
titles: {description: 'Testing Course'}
77+
};
78+
coursesService.saveCourse(12, changes)
79+
.subscribe(() => fail('the save course op should have failed'),
80+
(error: HttpErrorResponse) => {
81+
expect(error.status).toBe(500);
82+
}
83+
);
84+
85+
const req = httpTestingController.expectOne('/api/courses/12');
86+
expect(req.request.method).toEqual('PUT');
87+
req.flush('Save course failed', {status: 500, statusText: 'Internal Server Error'});
88+
89+
});
90+
91+
it('should find a list of lessons', () => {
92+
coursesService.findLessons(12)
93+
.subscribe(lessons => {
94+
expect(lessons).toBeTruthy();
95+
expect(lessons.length).toBe(3);
96+
97+
});
98+
99+
const req = httpTestingController.expectOne(request => request.url === '/api/lessons');
100+
expect(req.request.method).toEqual('GET');
101+
expect(req.request.params.get('courseId')).toEqual('12');
102+
expect(req.request.params.get('filter')).toEqual('');
103+
expect(req.request.params.get('sortOrder')).toEqual('asc');
104+
expect(req.request.params.get('pageNumber')).toEqual('0');
105+
expect(req.request.params.get('pageSize')).toEqual('3');
106+
req.flush({
107+
payload: findLessonsForCourse(12).slice(0, 3)
108+
});
109+
});
110+
111+
afterEach(() => {
112+
httpTestingController.verify();
113+
});
114+
});

src/app/courses/services/courses.service.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11

22

3-
import {Injectable} from "@angular/core";
4-
import {HttpClient, HttpParams} from "@angular/common/http";
5-
import {Observable} from "rxjs";
6-
import {Course} from "../model/course";
7-
import {map} from "rxjs/operators";
8-
import {Lesson} from "../model/lesson";
3+
import {Injectable} from '@angular/core';
4+
import {HttpClient, HttpParams} from '@angular/common/http';
5+
import {Observable} from 'rxjs';
6+
import {Course} from '../model/course';
7+
import {map} from 'rxjs/operators';
8+
import {Lesson} from '../model/lesson';
99

1010

1111
@Injectable()
1212
export class CoursesService {
1313

14-
constructor(private http:HttpClient) {
14+
constructor(private http: HttpClient) {
1515

1616
}
1717

@@ -27,12 +27,12 @@ export class CoursesService {
2727
}
2828

2929

30-
saveCourse(courseId:number, changes: Partial<Course>): Observable<Course> {
30+
saveCourse(courseId: number, changes: Partial<Course>): Observable<Course> {
3131
return this.http.put<Course>(`/api/courses/${courseId}`, changes);
3232
}
3333

3434
findLessons(
35-
courseId:number, filter = '', sortOrder = 'asc',
35+
courseId: number, filter = '', sortOrder = 'asc',
3636
pageNumber = 0, pageSize = 3): Observable<Lesson[]> {
3737

3838
return this.http.get('/api/lessons', {
@@ -43,7 +43,7 @@ export class CoursesService {
4343
.set('pageNumber', pageNumber.toString())
4444
.set('pageSize', pageSize.toString())
4545
}).pipe(
46-
map(res => res["payload"])
46+
map(res => res['payload'])
4747
);
4848
}
4949

0 commit comments

Comments
 (0)