UNPKG

8.66 kBJavaScriptView Raw
1import * as i0 from '@angular/core';
2import { Injectable, InjectionToken, Inject, Injector } from '@angular/core';
3import { BehaviorSubject } from 'rxjs';
4import * as i2 from '@ngrx/store';
5import { Store, createSelector, INITIAL_STATE, setNgrxMockEnvironment, ActionsSubject, StateObservable, ReducerManager } from '@ngrx/store';
6
7class MockState extends BehaviorSubject {
8 constructor() {
9 super({});
10 }
11}
12/** @nocollapse */ MockState.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MockState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
13/** @nocollapse */ MockState.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MockState });
14i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MockState, decorators: [{
15 type: Injectable
16 }], ctorParameters: function () { return []; } });
17
18const MOCK_SELECTORS = new InjectionToken('@ngrx/store Mock Selectors');
19
20class MockStore extends Store {
21 constructor(state$, actionsObserver, reducerManager, initialState, mockSelectors = []) {
22 super(state$, actionsObserver, reducerManager);
23 this.state$ = state$;
24 this.initialState = initialState;
25 this.selectors = new Map();
26 this.resetSelectors();
27 this.setState(this.initialState);
28 this.scannedActions$ = actionsObserver.asObservable();
29 for (const mockSelector of mockSelectors) {
30 this.overrideSelector(mockSelector.selector, mockSelector.value);
31 }
32 }
33 setState(nextState) {
34 this.state$.next(nextState);
35 this.lastState = nextState;
36 }
37 overrideSelector(selector, value) {
38 this.selectors.set(selector, value);
39 const resultSelector = typeof selector === 'string'
40 ? createSelector(() => { }, () => value)
41 : selector;
42 resultSelector.setResult(value);
43 return resultSelector;
44 }
45 resetSelectors() {
46 for (const selector of this.selectors.keys()) {
47 if (typeof selector !== 'string') {
48 selector.release();
49 selector.clearResult();
50 }
51 }
52 this.selectors.clear();
53 }
54 select(selector, prop) {
55 if (typeof selector === 'string' && this.selectors.has(selector)) {
56 return new BehaviorSubject(this.selectors.get(selector)).asObservable();
57 }
58 return super.select(selector, prop);
59 }
60 addReducer() {
61 /* noop */
62 }
63 removeReducer() {
64 /* noop */
65 }
66 /**
67 * Refreshes the existing state.
68 */
69 refreshState() {
70 if (this.lastState)
71 this.setState({ ...this.lastState });
72 }
73}
74/** @nocollapse */ MockStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.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 });
75/** @nocollapse */ MockStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MockStore });
76i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MockStore, decorators: [{
77 type: Injectable
78 }], ctorParameters: function () { return [{ type: MockState }, { type: i2.ActionsSubject }, { type: i2.ReducerManager }, { type: undefined, decorators: [{
79 type: Inject,
80 args: [INITIAL_STATE]
81 }] }, { type: undefined, decorators: [{
82 type: Inject,
83 args: [MOCK_SELECTORS]
84 }] }]; } });
85
86class MockReducerManager extends BehaviorSubject {
87 constructor() {
88 super(() => undefined);
89 }
90 addFeature(feature) {
91 /* noop */
92 }
93 addFeatures(feature) {
94 /* noop */
95 }
96 removeFeature(feature) {
97 /* noop */
98 }
99 removeFeatures(features) {
100 /* noop */
101 }
102 addReducer(key, reducer) {
103 /* noop */
104 }
105 addReducers(reducers) {
106 /* noop */
107 }
108 removeReducer(featureKey) {
109 /* noop */
110 }
111 removeReducers(featureKeys) {
112 /* noop */
113 }
114}
115/** @nocollapse */ MockReducerManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MockReducerManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
116/** @nocollapse */ MockReducerManager.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MockReducerManager });
117i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: MockReducerManager, decorators: [{
118 type: Injectable
119 }], ctorParameters: function () { return []; } });
120
121/**
122 * @description
123 * Creates mock store providers.
124 *
125 * @param config `MockStoreConfig<T>` to provide the values for `INITIAL_STATE` and `MOCK_SELECTORS` tokens.
126 * By default, `initialState` and `selectors` are not defined.
127 * @returns Mock store providers that can be used with both `TestBed.configureTestingModule` and `Injector.create`.
128 *
129 * @usageNotes
130 *
131 * **With `TestBed.configureTestingModule`**
132 *
133 * ```typescript
134 * describe('Books Component', () => {
135 * let store: MockStore;
136 *
137 * beforeEach(() => {
138 * TestBed.configureTestingModule({
139 * providers: [
140 * provideMockStore({
141 * initialState: { books: { entities: [] } },
142 * selectors: [
143 * { selector: selectAllBooks, value: ['Book 1', 'Book 2'] },
144 * { selector: selectVisibleBooks, value: ['Book 1'] },
145 * ],
146 * }),
147 * ],
148 * });
149 *
150 * store = TestBed.inject(MockStore);
151 * });
152 * });
153 * ```
154 *
155 * **With `Injector.create`**
156 *
157 * ```typescript
158 * describe('Counter Component', () => {
159 * let injector: Injector;
160 * let store: MockStore;
161 *
162 * beforeEach(() => {
163 * injector = Injector.create({
164 * providers: [
165 * provideMockStore({ initialState: { counter: 0 } }),
166 * ],
167 * });
168 * store = injector.get(MockStore);
169 * });
170 * });
171 * ```
172 */
173function provideMockStore(config = {}) {
174 setNgrxMockEnvironment(true);
175 return [
176 {
177 provide: ActionsSubject,
178 useFactory: () => new ActionsSubject(),
179 deps: [],
180 },
181 { provide: MockState, useFactory: () => new MockState(), deps: [] },
182 {
183 provide: MockReducerManager,
184 useFactory: () => new MockReducerManager(),
185 deps: [],
186 },
187 { provide: INITIAL_STATE, useValue: config.initialState || {} },
188 { provide: MOCK_SELECTORS, useValue: config.selectors },
189 { provide: StateObservable, useExisting: MockState },
190 { provide: ReducerManager, useExisting: MockReducerManager },
191 {
192 provide: MockStore,
193 useFactory: mockStoreFactory,
194 deps: [
195 MockState,
196 ActionsSubject,
197 ReducerManager,
198 INITIAL_STATE,
199 MOCK_SELECTORS,
200 ],
201 },
202 { provide: Store, useExisting: MockStore },
203 ];
204}
205function mockStoreFactory(mockState, actionsSubject, reducerManager, initialState, mockSelectors) {
206 return new MockStore(mockState, actionsSubject, reducerManager, initialState, mockSelectors);
207}
208/**
209 * @description
210 * Creates mock store with all necessary dependencies outside of the `TestBed`.
211 *
212 * @param config `MockStoreConfig<T>` to provide the values for `INITIAL_STATE` and `MOCK_SELECTORS` tokens.
213 * By default, `initialState` and `selectors` are not defined.
214 * @returns `MockStore<T>`
215 *
216 * @usageNotes
217 *
218 * ```typescript
219 * describe('Books Effects', () => {
220 * let store: MockStore;
221 *
222 * beforeEach(() => {
223 * store = getMockStore({
224 * initialState: { books: { entities: ['Book 1', 'Book 2', 'Book 3'] } },
225 * selectors: [
226 * { selector: selectAllBooks, value: ['Book 1', 'Book 2'] },
227 * { selector: selectVisibleBooks, value: ['Book 1'] },
228 * ],
229 * });
230 * });
231 * });
232 * ```
233 */
234function getMockStore(config = {}) {
235 const injector = Injector.create({ providers: provideMockStore(config) });
236 return injector.get(MockStore);
237}
238
239/**
240 * Generated bundle index. Do not edit.
241 */
242
243export { MockReducerManager, MockState, MockStore, getMockStore, provideMockStore };
244//# sourceMappingURL=ngrx-store-testing.mjs.map
245//# sourceMappingURL=ngrx-store-testing.mjs.map