source: node_modules/@reduxjs/toolkit/src/entities/tests/entity_slice_enhancer.test.ts

Last change on this file was a762898, checked in by istevanoska <ilinastevanoska@…>, 5 months ago

Added visualizations

  • Property mode set to 100644
File size: 1.4 KB
Line 
1import { createEntityAdapter, createSlice } from '../..'
2import type {
3 PayloadAction,
4 Slice,
5 SliceCaseReducers,
6 UnknownAction,
7} from '../..'
8import type { EntityId, EntityState, IdSelector } from '../models'
9import type { BookModel } from './fixtures/book'
10
11describe('Entity Slice Enhancer', () => {
12 let slice: Slice<EntityState<BookModel, BookModel['id']>>
13
14 beforeEach(() => {
15 const indieSlice = entitySliceEnhancer({
16 name: 'book',
17 selectId: (book: BookModel) => book.id,
18 })
19 slice = indieSlice
20 })
21
22 it('exposes oneAdded', () => {
23 const book = {
24 id: '0',
25 title: 'Der Steppenwolf',
26 author: 'Herman Hesse',
27 }
28 const action = slice.actions.oneAdded(book)
29 const oneAdded = slice.reducer(undefined, action as UnknownAction)
30 expect(oneAdded.entities['0']).toBe(book)
31 })
32})
33
34interface EntitySliceArgs<T, Id extends EntityId> {
35 name: string
36 selectId: IdSelector<T, Id>
37 modelReducer?: SliceCaseReducers<T>
38}
39
40function entitySliceEnhancer<T, Id extends EntityId>({
41 name,
42 selectId,
43 modelReducer,
44}: EntitySliceArgs<T, Id>) {
45 const modelAdapter = createEntityAdapter({
46 selectId,
47 })
48
49 return createSlice({
50 name,
51 initialState: modelAdapter.getInitialState(),
52 reducers: {
53 oneAdded(state, action: PayloadAction<T>) {
54 modelAdapter.addOne(state, action.payload)
55 },
56 ...modelReducer,
57 },
58 })
59}
Note: See TracBrowser for help on using the repository browser.