|
1 | 1 | import { createReducer, CaseReducer } from './createReducer' |
2 | | -import { PayloadAction } from './createAction' |
| 2 | +import { PayloadAction, createAction } from './createAction' |
3 | 3 | import { Reducer } from 'redux' |
4 | 4 |
|
5 | 5 | interface Todo { |
@@ -74,6 +74,73 @@ describe('createReducer', () => { |
74 | 74 |
|
75 | 75 | behavesLikeReducer(todosReducer) |
76 | 76 | }) |
| 77 | + |
| 78 | + describe('alternative builder callback for actionMap', () => { |
| 79 | + const increment = createAction<number, 'increment'>('increment') |
| 80 | + const decrement = createAction<number, 'decrement'>('decrement') |
| 81 | + |
| 82 | + test('can be used with ActionCreators', () => { |
| 83 | + const reducer = createReducer(0, builder => |
| 84 | + builder |
| 85 | + .addCase(increment, (state, action) => state + action.payload) |
| 86 | + .addCase(decrement, (state, action) => state - action.payload) |
| 87 | + ) |
| 88 | + expect(reducer(0, increment(5))).toBe(5) |
| 89 | + expect(reducer(5, decrement(5))).toBe(0) |
| 90 | + }) |
| 91 | + test('can be used with string types', () => { |
| 92 | + const reducer = createReducer(0, builder => |
| 93 | + builder |
| 94 | + .addCase( |
| 95 | + 'increment', |
| 96 | + (state, action: { type: 'increment'; payload: number }) => |
| 97 | + state + action.payload |
| 98 | + ) |
| 99 | + .addCase( |
| 100 | + 'decrement', |
| 101 | + (state, action: { type: 'decrement'; payload: number }) => |
| 102 | + state - action.payload |
| 103 | + ) |
| 104 | + ) |
| 105 | + expect(reducer(0, increment(5))).toBe(5) |
| 106 | + expect(reducer(5, decrement(5))).toBe(0) |
| 107 | + }) |
| 108 | + test('can be used with ActionCreators and string types combined', () => { |
| 109 | + const reducer = createReducer(0, builder => |
| 110 | + builder |
| 111 | + .addCase(increment, (state, action) => state + action.payload) |
| 112 | + .addCase( |
| 113 | + 'decrement', |
| 114 | + (state, action: { type: 'decrement'; payload: number }) => |
| 115 | + state - action.payload |
| 116 | + ) |
| 117 | + ) |
| 118 | + expect(reducer(0, increment(5))).toBe(5) |
| 119 | + expect(reducer(5, decrement(5))).toBe(0) |
| 120 | + }) |
| 121 | + test('will throw if the same type is used twice', () => { |
| 122 | + expect(() => |
| 123 | + createReducer(0, builder => |
| 124 | + builder |
| 125 | + .addCase(increment, (state, action) => state + action.payload) |
| 126 | + .addCase(increment, (state, action) => state + action.payload) |
| 127 | + .addCase(decrement, (state, action) => state - action.payload) |
| 128 | + ) |
| 129 | + ).toThrowErrorMatchingInlineSnapshot( |
| 130 | + `"addCase cannot be called with two reducers for the same action type"` |
| 131 | + ) |
| 132 | + expect(() => |
| 133 | + createReducer(0, builder => |
| 134 | + builder |
| 135 | + .addCase(increment, (state, action) => state + action.payload) |
| 136 | + .addCase('increment', state => state + 1) |
| 137 | + .addCase(decrement, (state, action) => state - action.payload) |
| 138 | + ) |
| 139 | + ).toThrowErrorMatchingInlineSnapshot( |
| 140 | + `"addCase cannot be called with two reducers for the same action type"` |
| 141 | + ) |
| 142 | + }) |
| 143 | + }) |
77 | 144 | }) |
78 | 145 |
|
79 | 146 | function behavesLikeReducer(todosReducer: TodosReducer) { |
|
0 commit comments