presidential-innovation-fellows/code-gov-web

View on GitHub
src/app/components/app/app.component.spec.ts

Summary

Maintainability
B
4 hrs
Test Coverage
import { APP_BASE_HREF, Location } from '@angular/common';
import {
  Component,
  Type,
  Compiler,
  NgModuleFactoryLoader,
  Injector
} from '@angular/core';
import {
  Router,
  Routes,
  UrlSerializer,
  NavigationStart,
  NavigationEnd,
  Event
} from '@angular/router';
import { Angulartics2Module, Angulartics2, Angulartics2GoogleTagManager } from 'angulartics2';
import { RouterModule } from '@angular/router';
import { HttpModule } from '@angular/http';
import { RouterTestingModule } from '@angular/router/testing';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { AppComponent } from './app.component';
import { TestBed, ComponentFixture, inject } from '@angular/core/testing';

class MockRouter {
  routerState = {root: ''};
  private rootComponentType: Type<any>;

  private events: Observable<Event>;

  constructor() {
      this.events = Observable.of(new NavigationStart(2, ''));
  }

  createUrlTree() {
      return {};
  }

  serializeUrl() {
      return 'foo';
  }
}

describe('AppComponent', () => {

 describe('component logic', () => {
    let fixture: ComponentFixture<AppComponent>;
    let component: AppComponent;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [
                Angulartics2Module.forRoot(),
                HttpModule,
                RouterModule.forRoot([]),
            ],
            declarations: [ AppComponent ],
            providers: [
                Angulartics2,
                Angulartics2GoogleTagManager,
                {provide: APP_BASE_HREF, useValue: '/'},
                {provide: Router, useClass: MockRouter}
          ]
        });
        fixture = TestBed.createComponent(AppComponent);
        component = fixture.componentInstance;
    });

    it('should have defined AppComponent instance', () => {
        fixture.detectChanges();
        expect(component).toBeDefined();
    });

    it('should have defined router event subscription', () => {
        fixture.detectChanges();
        expect(component.eventSub).toBeDefined();
    });

    it('should unsubscribe from router events when component is destroyed', () => {
        fixture.detectChanges();
        spyOn(component.eventSub, 'unsubscribe');
        fixture.destroy();
        expect(component.eventSub.unsubscribe).toHaveBeenCalled();
    });


 });

 describe('component template', () => {
    let fixture: ComponentFixture<AppComponent>;
    let component: AppComponent;
    beforeEach(() => {
        TestBed.resetTestingModule();
        TestBed.configureTestingModule({
            imports: [
                Angulartics2Module.forRoot(),
                HttpModule,
                RouterModule.forRoot([]),
            ],
            declarations: [AppComponent],
            providers: [
                Angulartics2,
                Angulartics2GoogleTagManager,
                {provide: APP_BASE_HREF, useValue: '/'},
                {provide: Router, useClass: MockRouter}
          ]
        });

        fixture = TestBed.createComponent(AppComponent);
        component = fixture.componentInstance;
    });

    it('should have header, nav and footer elements', () => {
        fixture.detectChanges();
        let head = fixture.nativeElement.querySelector('header');
        let nav = fixture.nativeElement.querySelector('nav');
        let foot = fixture.nativeElement.querySelector('footer');

        expect(head).toBeDefined();
        expect(nav).toBeDefined();
        expect(foot).toBeDefined();
    });

    it('should have a main element with router-outlet child', () => {
        fixture.detectChanges();
        let outlet = fixture.nativeElement.querySelector('main router-outlet');

        expect(outlet).toBeDefined();
    });

 });

});