UNPKG

@ngrx/store

Version:

RxJS powered Redux for Angular apps

247 lines (239 loc) 8.74 kB
import * as i0 from '@angular/core'; import { Injectable, InjectionToken, Inject, Injector } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { BehaviorSubject } from 'rxjs'; import * as i2 from '@ngrx/store'; import { Store, createSelector, INITIAL_STATE, setNgrxMockEnvironment, ActionsSubject, StateObservable, ReducerManager } from '@ngrx/store'; class MockState extends BehaviorSubject { constructor() { super({}); this.state = toSignal(this, { manualCleanup: true, requireSync: true }); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockState, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockState }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockState, decorators: [{ type: Injectable }], ctorParameters: () => [] }); const MOCK_SELECTORS = new InjectionToken('@ngrx/store Mock Selectors'); class MockStore extends Store { constructor(state$, actionsObserver, reducerManager, initialState, mockSelectors = []) { super(state$, actionsObserver, reducerManager); this.state$ = state$; this.initialState = initialState; this.selectors = new Map(); this.resetSelectors(); this.setState(this.initialState); this.scannedActions$ = actionsObserver.asObservable(); for (const mockSelector of mockSelectors) { this.overrideSelector(mockSelector.selector, mockSelector.value); } } setState(nextState) { this.state$.next(nextState); this.lastState = nextState; } overrideSelector(selector, value) { this.selectors.set(selector, value); const resultSelector = typeof selector === 'string' ? createSelector(() => { }, () => value) : selector; resultSelector.setResult(value); return resultSelector; } resetSelectors() { for (const selector of this.selectors.keys()) { if (typeof selector !== 'string') { selector.release(); selector.clearResult(); } } this.selectors.clear(); } select(selector, prop) { if (typeof selector === 'string' && this.selectors.has(selector)) { return new BehaviorSubject(this.selectors.get(selector)).asObservable(); } return super.select(selector, prop); } addReducer() { /* noop */ } removeReducer() { /* noop */ } /** * Refreshes the existing state. */ refreshState() { if (this.lastState) this.setState({ ...this.lastState }); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockStore, deps: [{ token: MockState }, { token: i2.ActionsSubject }, { token: i2.ReducerManager }, { token: INITIAL_STATE }, { token: MOCK_SELECTORS }], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockStore }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockStore, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: MockState }, { type: i2.ActionsSubject }, { type: i2.ReducerManager }, { type: undefined, decorators: [{ type: Inject, args: [INITIAL_STATE] }] }, { type: undefined, decorators: [{ type: Inject, args: [MOCK_SELECTORS] }] }] }); class MockReducerManager extends BehaviorSubject { constructor() { super(() => undefined); } addFeature(feature) { /* noop */ } addFeatures(feature) { /* noop */ } removeFeature(feature) { /* noop */ } removeFeatures(features) { /* noop */ } addReducer(key, reducer) { /* noop */ } addReducers(reducers) { /* noop */ } removeReducer(featureKey) { /* noop */ } removeReducers(featureKeys) { /* noop */ } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockReducerManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockReducerManager }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MockReducerManager, decorators: [{ type: Injectable }], ctorParameters: () => [] }); /** * @description * Creates mock store providers. * * @param config `MockStoreConfig<T>` to provide the values for `INITIAL_STATE` and `MOCK_SELECTORS` tokens. * By default, `initialState` and `selectors` are not defined. * @returns Mock store providers that can be used with both `TestBed.configureTestingModule` and `Injector.create`. * * @usageNotes * * **With `TestBed.configureTestingModule`** * * ```typescript * describe('Books Component', () => { * let store: MockStore; * * beforeEach(() => { * TestBed.configureTestingModule({ * providers: [ * provideMockStore({ * initialState: { books: { entities: [] } }, * selectors: [ * { selector: selectAllBooks, value: ['Book 1', 'Book 2'] }, * { selector: selectVisibleBooks, value: ['Book 1'] }, * ], * }), * ], * }); * * store = TestBed.inject(MockStore); * }); * }); * ``` * * **With `Injector.create`** * * ```typescript * describe('Counter Component', () => { * let injector: Injector; * let store: MockStore; * * beforeEach(() => { * injector = Injector.create({ * providers: [ * provideMockStore({ initialState: { counter: 0 } }), * ], * }); * store = injector.get(MockStore); * }); * }); * ``` */ function provideMockStore(config = {}) { setNgrxMockEnvironment(true); return [ { provide: ActionsSubject, useFactory: () => new ActionsSubject(), deps: [], }, { provide: MockState, useFactory: () => new MockState(), deps: [] }, { provide: MockReducerManager, useFactory: () => new MockReducerManager(), deps: [], }, { provide: INITIAL_STATE, useValue: config.initialState || {} }, { provide: MOCK_SELECTORS, useValue: config.selectors }, { provide: StateObservable, useExisting: MockState }, { provide: ReducerManager, useExisting: MockReducerManager }, { provide: MockStore, useFactory: mockStoreFactory, deps: [ MockState, ActionsSubject, ReducerManager, INITIAL_STATE, MOCK_SELECTORS, ], }, { provide: Store, useExisting: MockStore }, ]; } function mockStoreFactory(mockState, actionsSubject, reducerManager, initialState, mockSelectors) { return new MockStore(mockState, actionsSubject, reducerManager, initialState, mockSelectors); } /** * @description * Creates mock store with all necessary dependencies outside of the `TestBed`. * * @param config `MockStoreConfig<T>` to provide the values for `INITIAL_STATE` and `MOCK_SELECTORS` tokens. * By default, `initialState` and `selectors` are not defined. * @returns `MockStore<T>` * * @usageNotes * * ```typescript * describe('Books Effects', () => { * let store: MockStore; * * beforeEach(() => { * store = createMockStore({ * initialState: { books: { entities: ['Book 1', 'Book 2', 'Book 3'] } }, * selectors: [ * { selector: selectAllBooks, value: ['Book 1', 'Book 2'] }, * { selector: selectVisibleBooks, value: ['Book 1'] }, * ], * }); * }); * }); * ``` */ function createMockStore(config = {}) { const injector = Injector.create({ providers: provideMockStore(config) }); return injector.get(MockStore); } /** * Generated bundle index. Do not edit. */ export { MockReducerManager, MockState, MockStore, createMockStore, provideMockStore }; //# sourceMappingURL=ngrx-store-testing.mjs.map