WIP: 6: Get Data from a Server i) Heroes and HTTP - Update heroes
[examples/angular-tour-of-heroes] / src / app / hero.service.spec.ts
index 082791a..7730d9f 100644 (file)
@@ -1,12 +1,92 @@
-import { TestBed } from '@angular/core/testing';
+import { TestBed} from '@angular/core/testing';
+import { TestScheduler } from 'rxjs/testing';
 
 import { HeroService } from './hero.service';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { Hero } from './hero';
 
 describe('HeroService', () => {
-  beforeEach(() => TestBed.configureTestingModule({}));
+  let service: HeroService;
+  let httpTestingController: HttpTestingController;
+  let scheduler: TestScheduler;
+
+  beforeEach(() =>  {
+    TestBed.configureTestingModule({
+      imports: [ HttpClientTestingModule ]
+    });
+    service = TestBed.inject(HeroService);
+    httpTestingController = TestBed.inject(HttpTestingController);
+    scheduler = new TestScheduler(((actual, expected) => {
+      expect(actual).toEqual(expected);
+    }));
+  });
+
+  afterEach(() => {
+    // After every test, assert that there are no more pending requests.
+    httpTestingController.verify();
+  });
 
   it('should be created', () => {
-    const service: HeroService = TestBed.get(HeroService);
     expect(service).toBeTruthy();
   });
+
+  describe('#getHeroes', () => {
+
+    it('should return the expected heroes on success', () => {
+
+      const expectedHeroes: Hero[] = [{id: 11, name: 'Dr Nice'}];
+
+      service.getHeroes().subscribe(
+        heroes => expect(heroes).toEqual(expectedHeroes, 'should return expected heroes'),
+        fail
+      );
+
+      const req = httpTestingController.expectOne(service.heroesUrl);
+      expect(req.request.method).toEqual('GET');
+
+      req.flush(expectedHeroes);
+    });
+
+    it('should return an empty list if the remote server fails', () => {
+
+      service.getHeroes().subscribe(
+        heroes => expect(heroes).toEqual([], 'should return an empty list'),
+        fail
+      );
+
+      const req = httpTestingController.expectOne(service.heroesUrl);
+      expect(req.request.method).toEqual('GET');
+
+      // Respond with the mock heroes
+      req.flush('deliberate 500 error', {status: 500, statusText: 'Server Error'});
+    });
+  });
+
+  describe('#getHero', () => {
+
+    it('should return an empty observable for an invalid id', () => {
+
+      service.getHero(0).subscribe(fail, fail);
+
+      const req = httpTestingController.expectOne(`${service.heroesUrl}/0`);
+      expect(req.request.method).toEqual('GET');
+
+      req.flush('deliberate 404 error', {status: 404, statusText: 'Not Found'});
+    });
+
+    it('should return an observable with the requested hero for a valid id', () => {
+
+      const expectedHero: Hero = {id: 11, name: 'Dr Nice'};
+
+      service.getHero(11).subscribe(
+        hero => expect(hero).toEqual(expectedHero, 'should return expected heroes'),
+        fail
+      );
+
+      const req = httpTestingController.expectOne(`${service.heroesUrl}/11`);
+      expect(req.request.method).toEqual('GET');
+
+      req.flush(expectedHero);
+    });
+  });
 });