UNPKG

13.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"ngrx-store-testing.mjs","sources":["../../../../modules/store/testing/src/mock_state.ts","../../../../modules/store/testing/src/tokens.ts","../../../../modules/store/testing/src/mock_store.ts","../../../../modules/store/testing/src/mock_reducer_manager.ts","../../../../modules/store/testing/src/testing.ts","../../../../modules/store/testing/src/ngrx-store-testing.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable()\nexport class MockState<T> extends BehaviorSubject<T> {\n constructor() {\n super(<T>{});\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const MOCK_SELECTORS = new InjectionToken('@ngrx/store Mock Selectors');\n","import { Inject, Injectable } from '@angular/core';\nimport { Observable, BehaviorSubject } from 'rxjs';\nimport {\n Action,\n ActionsSubject,\n INITIAL_STATE,\n ReducerManager,\n Store,\n createSelector,\n MemoizedSelectorWithProps,\n MemoizedSelector,\n} from '@ngrx/store';\nimport { MockState } from './mock_state';\nimport { MockSelector } from './mock_selector';\nimport { MOCK_SELECTORS } from './tokens';\n\ntype OnlyMemoized<T, Result> = T extends string | MemoizedSelector<any, any>\n ? MemoizedSelector<any, Result>\n : T extends MemoizedSelectorWithProps<any, any, any>\n ? MemoizedSelectorWithProps<any, any, Result>\n : never;\n\ntype Memoized<Result> =\n | MemoizedSelector<any, Result>\n | MemoizedSelectorWithProps<any, any, Result>;\n\n@Injectable()\nexport class MockStore<T = object> extends Store<T> {\n private readonly selectors = new Map<Memoized<any> | string, any>();\n\n readonly scannedActions$: Observable<Action>;\n private lastState?: T;\n\n constructor(\n private state$: MockState<T>,\n actionsObserver: ActionsSubject,\n reducerManager: ReducerManager,\n @Inject(INITIAL_STATE) private initialState: T,\n @Inject(MOCK_SELECTORS) mockSelectors: MockSelector[] = []\n ) {\n super(state$, actionsObserver, reducerManager);\n this.resetSelectors();\n this.setState(this.initialState);\n this.scannedActions$ = actionsObserver.asObservable();\n for (const mockSelector of mockSelectors) {\n this.overrideSelector(mockSelector.selector, mockSelector.value);\n }\n }\n\n setState(nextState: T): void {\n this.state$.next(nextState);\n this.lastState = nextState;\n }\n\n overrideSelector<\n Selector extends Memoized<Result>,\n Value extends Result,\n Result = Selector extends MemoizedSelector<any, infer T>\n ? T\n : Selector extends MemoizedSelectorWithProps<any, any, infer U>\n ? U\n : Value\n >(\n selector: Selector | string,\n value: Value\n ): OnlyMemoized<typeof selector, Result> {\n this.selectors.set(selector, value);\n\n const resultSelector: Memoized<Result> =\n typeof selector === 'string'\n ? createSelector(\n () => {},\n (): Result => value\n )\n : selector;\n\n resultSelector.setResult(value);\n\n return resultSelector as OnlyMemoized<typeof selector, Result>;\n }\n\n resetSelectors() {\n for (const selector of this.selectors.keys()) {\n if (typeof selector !== 'string') {\n selector.release();\n selector.clearResult();\n }\n }\n\n this.selectors.clear();\n }\n\n override select(selector: any, prop?: any) {\n if (typeof selector === 'string' && this.selectors.has(selector)) {\n return new BehaviorSubject<any>(\n this.selectors.get(selector)\n ).asObservable();\n }\n\n return super.select(selector, prop);\n }\n\n override addReducer() {\n /* noop */\n }\n\n override removeReducer() {\n /* noop */\n }\n\n /**\n * Refreshes the existing state.\n */\n refreshState() {\n if (this.lastState) this.setState({ ...this.lastState });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { ActionReducer } from '@ngrx/store';\n\n@Injectable()\nexport class MockReducerManager extends BehaviorSubject<\n ActionReducer<any, any>\n> {\n constructor() {\n super(() => undefined);\n }\n\n addFeature(feature: any) {\n /* noop */\n }\n\n addFeatures(feature: any) {\n /* noop */\n }\n\n removeFeature(feature: any) {\n /* noop */\n }\n\n removeFeatures(features: any) {\n /* noop */\n }\n\n addReducer(key: any, reducer: any) {\n /* noop */\n }\n\n addReducers(reducers: any) {\n /* noop */\n }\n\n removeReducer(featureKey: any) {\n /* noop */\n }\n\n removeReducers(featureKeys: any) {\n /* noop */\n }\n}\n","import {\n ExistingProvider,\n FactoryProvider,\n Injector,\n ValueProvider,\n} from '@angular/core';\nimport { MockState } from './mock_state';\nimport {\n ActionsSubject,\n INITIAL_STATE,\n ReducerManager,\n StateObservable,\n Store,\n setNgrxMockEnvironment,\n} from '@ngrx/store';\nimport { MockStore } from './mock_store';\nimport { MockReducerManager } from './mock_reducer_manager';\nimport { MockSelector } from './mock_selector';\nimport { MOCK_SELECTORS } from './tokens';\n\nexport interface MockStoreConfig<T> {\n initialState?: T;\n selectors?: MockSelector[];\n}\n\n/**\n * @description\n * Creates mock store providers.\n *\n * @param config `MockStoreConfig<T>` to provide the values for `INITIAL_STATE` and `MOCK_SELECTORS` tokens.\n * By default, `initialState` and `selectors` are not defined.\n * @returns Mock store providers that can be used with both `TestBed.configureTestingModule` and `Injector.create`.\n *\n * @usageNotes\n *\n * **With `TestBed.configureTestingModule`**\n *\n * ```typescript\n * describe('Books Component', () => {\n * let store: MockStore;\n *\n * beforeEach(() => {\n * TestBed.configureTestingModule({\n * providers: [\n * provideMockStore({\n * initialState: { books: { entities: [] } },\n * selectors: [\n * { selector: selectAllBooks, value: ['Book 1', 'Book 2'] },\n * { selector: selectVisibleBooks, value: ['Book 1'] },\n * ],\n * }),\n * ],\n * });\n *\n * store = TestBed.inject(MockStore);\n * });\n * });\n * ```\n *\n * **With `Injector.create`**\n *\n * ```typescript\n * describe('Counter Component', () => {\n * let injector: Injector;\n * let store: MockStore;\n *\n * beforeEach(() => {\n * injector = Injector.create({\n * providers: [\n * provideMockStore({ initialState: { counter: 0 } }),\n * ],\n * });\n * store = injector.get(MockStore);\n * });\n * });\n * ```\n */\nexport function provideMockStore<T = any>(\n config: MockStoreConfig<T> = {}\n): (ValueProvider | ExistingProvider | FactoryProvider)[] {\n setNgrxMockEnvironment(true);\n return [\n {\n provide: ActionsSubject,\n useFactory: () => new ActionsSubject(),\n deps: [],\n },\n { provide: MockState, useFactory: () => new MockState<T>(), deps: [] },\n {\n provide: MockReducerManager,\n useFactory: () => new MockReducerManager(),\n deps: [],\n },\n { provide: INITIAL_STATE, useValue: config.initialState || {} },\n { provide: MOCK_SELECTORS, useValue: config.selectors },\n { provide: StateObservable, useExisting: MockState },\n { provide: ReducerManager, useExisting: MockReducerManager },\n {\n provide: MockStore,\n useFactory: mockStoreFactory,\n deps: [\n MockState,\n ActionsSubject,\n ReducerManager,\n INITIAL_STATE,\n MOCK_SELECTORS,\n ],\n },\n { provide: Store, useExisting: MockStore },\n ];\n}\n\nfunction mockStoreFactory<T>(\n mockState: MockState<T>,\n actionsSubject: ActionsSubject,\n reducerManager: ReducerManager,\n initialState: T,\n mockSelectors: MockSelector[]\n): MockStore<T> {\n return new MockStore(\n mockState,\n actionsSubject,\n reducerManager,\n initialState,\n mockSelectors\n );\n}\n\n/**\n * @description\n * Creates mock store with all necessary dependencies outside of the `TestBed`.\n *\n * @param config `MockStoreConfig<T>` to provide the values for `INITIAL_STATE` and `MOCK_SELECTORS` tokens.\n * By default, `initialState` and `selectors` are not defined.\n * @returns `MockStore<T>`\n *\n * @usageNotes\n *\n * ```typescript\n * describe('Books Effects', () => {\n * let store: MockStore;\n *\n * beforeEach(() => {\n * store = getMockStore({\n * initialState: { books: { entities: ['Book 1', 'Book 2', 'Book 3'] } },\n * selectors: [\n * { selector: selectAllBooks, value: ['Book 1', 'Book 2'] },\n * { selector: selectVisibleBooks, value: ['Book 1'] },\n * ],\n * });\n * });\n * });\n * ```\n */\nexport function getMockStore<T>(config: MockStoreConfig<T> = {}): MockStore<T> {\n const injector = Injector.create({ providers: provideMockStore(config) });\n return injector.get(MockStore);\n}\n\nexport { MockReducerManager } from './mock_reducer_manager';\nexport { MockState } from './mock_state';\nexport { MockStore } from './mock_store';\nexport { MockSelector } from './mock_selector';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.MockState"],"mappings":"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"}
\No newline at end of file