import { createEntityAdapter, createSlice } from '../..' import type { PayloadAction, Slice, SliceCaseReducers, UnknownAction, } from '../..' import type { EntityId, EntityState, IdSelector } from '../models' import type { BookModel } from './fixtures/book' describe('Entity Slice Enhancer', () => { let slice: Slice> beforeEach(() => { const indieSlice = entitySliceEnhancer({ name: 'book', selectId: (book: BookModel) => book.id, }) slice = indieSlice }) it('exposes oneAdded', () => { const book = { id: '0', title: 'Der Steppenwolf', author: 'Herman Hesse', } const action = slice.actions.oneAdded(book) const oneAdded = slice.reducer(undefined, action as UnknownAction) expect(oneAdded.entities['0']).toBe(book) }) }) interface EntitySliceArgs { name: string selectId: IdSelector modelReducer?: SliceCaseReducers } function entitySliceEnhancer({ name, selectId, modelReducer, }: EntitySliceArgs) { const modelAdapter = createEntityAdapter({ selectId, }) return createSlice({ name, initialState: modelAdapter.getInitialState(), reducers: { oneAdded(state, action: PayloadAction) { modelAdapter.addOne(state, action.payload) }, ...modelReducer, }, }) }