{"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, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable()\nexport class MockState<T> extends BehaviorSubject<T> {\n  /**\n   * @internal\n   */\n  readonly state: Signal<T>;\n\n  constructor() {\n    super(<T>{});\n\n    this.state = toSignal(this, { manualCleanup: true, requireSync: true });\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 = createMockStore({\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 createMockStore<T>(\n  config: MockStoreConfig<T> = {}\n): 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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"}