arranbartish/angular-cli-seed

View on GitHub
src/app/car/guards/car-lazy-menu.spec.ts

Summary

Maintainability
D
2 days
Test Coverage
import { inject, TestBed } from '@angular/core/testing';
import { Store, StoreModule } from '@ngrx/store';
import { MenuState, MenuActionFactory, TreeElement, treeElements } from 'arranbartish-angular-cli-widgets';
import { expect } from 'chai';
import { of } from 'rxjs/observable/of';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

import { CarsLazyMenuGuard } from './car-lazy-menu';
import { ActionFactory } from '../actions/cars';
import { Car, CarState } from '../domain/car';
import { CarModule } from '../car.module';
import { cars } from '../reducers/car.reducer';

describe('HousesLazyMenuGuard', () => {
  class MenuStore extends Store<MenuState> {
  }

  class CarStore extends Store<CarState> {
  }

  let guard: CarsLazyMenuGuard;
  let menuStore: Store<MenuState>;
  let subscribedMenuItems: TreeElement[];

  let carStore: Store<CarState>;
  let subscribedCars: Car[];

  const mockResponseMenu: TreeElement[] = [
      { title: 'Search root', targetUrl: '/something/overview', imageCssClass: 'glyphicon glyphicon-home' },
      { title: 'Search something', targetUrl: '/something/search', imageCssClass: 'glyphicon glyphicon-search' },
  ];

  const mockResponseCar: Car[] = [
    { brand: 'Toyota', model: 'Camery', year: '2011', condition: 'Awesome' }
  ];

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [CarModule, StoreModule.provideStore({ cars, treeElements })],
      providers: [
        {
          provide: MenuStore,
          useClass: class <Store> { dispatch = sinon.stub(); select = () => of(mockResponseMenu); }
        },
        {
          provide: CarStore,
          useClass: class <Store> { dispatch = sinon.stub(); select = () => of(mockResponseCar); }
        }
      ]
    });
  });

  beforeEach(inject([CarsLazyMenuGuard, MenuStore, CarStore],
                   (carsLazyMenuGuard: CarsLazyMenuGuard, _menuStore: MenuStore, _carStore: CarStore) => {
    guard = carsLazyMenuGuard;
    menuStore = _menuStore;
    carStore = _carStore;
  }));

  beforeEach(() => {
    menuStore.select(state => state.treeElements)
             .subscribe(menuItemList => subscribedMenuItems = menuItemList);
    menuStore.dispatch(MenuActionFactory.setMenuItems([]));

    carStore.select(state => state.cars)
               .subscribe(carList => subscribedCars = carList);
    carStore.dispatch(ActionFactory.clearCars());
  });

  describe('when response comes from Store<CarState>', () => {
    it('will ensure menu items are inserted', () => {
      const expected = [
        {
          title: 'Car',
          targetUrl: '/car',
          imageCssClass: 'glyphicon-road',
          children: [
            { title: 'Search cars', targetUrl: '/car/search', imageCssClass: 'glyphicon glyphicon-search' },
            { title: mockResponseCar[0].brand,
              targetUrl: '/housing/search?q=' + mockResponseCar[0].brand,
              imageCssClass: 'glyphicon glyphicon-list' }
          ]
        }
      ];

      guard.canActivate(null).subscribe();
      expect((menuStore.dispatch as sinon.SinonStub).called).to.be.true;
      // expect((menuStore.dispatch as sinon.SinonStub).calledWithExactly(
      //   MenuActionFactory.addMenuItems(expected))).to.be.true;
    });

    it('will allow activation', () => {
      let result = false;
      guard.canActivate(null).subscribe(value => result = value);
      expect(result).to.be.ok;
    });
  });
});