import { NgModule } from '@angular/core'; import { TestBed } from '@angular/core/testing'; import { readFirst } from '@nrwl/nx/testing'; import { EffectsModule } from '@ngrx/effects'; import { StoreModule, Store } from '@ngrx/store'; import { NxModule } from '@nrwl/nx'; /** * NgRx feature slice for 'Cars' state */ import { CarsQuery } from './Cars.selectors'; import { LoadCars, CarsLoaded } from './Cars.actions'; import { CarsState, Entity, initialState, CarsReducer } from './Cars.reducer'; import { CarsEffects } from './Cars.effects'; import { CarsFacade } from './Cars.facade'; interface TestSchema { 'Cars' : CarsState } describe('CarsFacade', () => { let facade: CarsFacade; let store: Store; let createCars; beforeEach(() => { createCars = ( id:string, name = '' ): Entity => ({ id, name: name || `name-${id}` }); }); describe('used in NgModule', () => { beforeEach(() => { @NgModule({ imports: [ StoreModule.forFeature('Cars', CarsReducer, { initialState }), EffectsModule.forFeature([CarsEffects]) ], providers: [CarsFacade] }) class CustomFeatureModule {} @NgModule({ imports: [ NxModule.forRoot(), StoreModule.forRoot({}), EffectsModule.forRoot([]), CustomFeatureModule, ] }) class RootModule {} TestBed.configureTestingModule({ imports: [RootModule] }); store = TestBed.get(Store); facade = TestBed.get(CarsFacade); }); /** * The initially generated facade::loadAll() returns empty array */ it('loadAll() should return empty list with loaded == true', async (done) => { try { let list = await readFirst(facade.allCars$); let isLoaded = await readFirst(facade.loaded$); expect(list.length).toBe(0); // initially empty expect(isLoaded).toBe(false); // initially not loaded // Note: the default Nx schematic-generated logic in `cars.effects.ts` // will simulate a load and return an empty array. facade.loadAll(); list = await readFirst(facade.allCars$); isLoaded = await readFirst(facade.loaded$); expect(list.length).toBe(0); expect(isLoaded).toBe(true); done(); } catch (err) { done.fail(err); } }); /** * Use `CarsLoaded` to manually submit list for state management */ it('allCars$ should return the loaded list; and loaded flag == true', async (done) => { try { let list = await readFirst(facade.allCars$); let isLoaded = await readFirst(facade.loaded$); expect(list.length).toBe(0); expect(isLoaded).toBe(false); // Update our 'cars' state with two (2) cars loaded store.dispatch(new CarsLoaded([ createCars('AAA'), createCars('BBB') ])); list = await readFirst(facade.allCars$); isLoaded = await readFirst(facade.loaded$); expect(list.length).toBe(2); expect(isLoaded).toBe(true); done(); } catch (err) { done.fail(err); } }); }); });