@@ -73,7 +73,12 @@ class CountController extends BaseController<
73
73
state : Draft < CountControllerState > ,
74
74
) => void | CountControllerState ,
75
75
) {
76
- super . update ( callback ) ;
76
+ const res = super . update ( callback ) ;
77
+ return res ;
78
+ }
79
+
80
+ applyPatches ( patches : Patch [ ] ) {
81
+ super . applyPatches ( patches ) ;
77
82
}
78
83
79
84
destroy ( ) {
@@ -170,6 +175,29 @@ describe('BaseController', () => {
170
175
expect ( controller . state ) . toStrictEqual ( { count : 1 } ) ;
171
176
} ) ;
172
177
178
+ it ( 'should return next state, patches and inverse patches after an update' , ( ) => {
179
+ const controller = new CountController ( {
180
+ messenger : getCountMessenger ( ) ,
181
+ name : 'CountController' ,
182
+ state : { count : 0 } ,
183
+ metadata : countControllerStateMetadata ,
184
+ } ) ;
185
+
186
+ const returnObj = controller . update ( ( draft ) => {
187
+ draft . count += 1 ;
188
+ } ) ;
189
+
190
+ expect ( returnObj ) . not . toBeUndefined ( ) ;
191
+ expect ( returnObj . nextState ) . toStrictEqual ( { count : 1 } ) ;
192
+ expect ( returnObj . patches ) . toStrictEqual ( [
193
+ { op : 'replace' , path : [ 'count' ] , value : 1 } ,
194
+ ] ) ;
195
+
196
+ expect ( returnObj . inversePatches ) . toStrictEqual ( [
197
+ { op : 'replace' , path : [ 'count' ] , value : 0 } ,
198
+ ] ) ;
199
+ } ) ;
200
+
173
201
it ( 'should throw an error if update callback modifies draft and returns value' , ( ) => {
174
202
const controller = new CountController ( {
175
203
messenger : getCountMessenger ( ) ,
@@ -188,6 +216,55 @@ describe('BaseController', () => {
188
216
) ;
189
217
} ) ;
190
218
219
+ it ( 'should allow for applying immer patches to state' , ( ) => {
220
+ const controller = new CountController ( {
221
+ messenger : getCountMessenger ( ) ,
222
+ name : 'CountController' ,
223
+ state : { count : 0 } ,
224
+ metadata : countControllerStateMetadata ,
225
+ } ) ;
226
+
227
+ const returnObj = controller . update ( ( draft ) => {
228
+ draft . count += 1 ;
229
+ } ) ;
230
+
231
+ controller . applyPatches ( returnObj . inversePatches ) ;
232
+
233
+ expect ( controller . state ) . toStrictEqual ( { count : 0 } ) ;
234
+ } ) ;
235
+
236
+ it ( 'should inform subscribers of state changes as a result of applying patches' , ( ) => {
237
+ const controllerMessenger = new ControllerMessenger <
238
+ never ,
239
+ CountControllerEvent
240
+ > ( ) ;
241
+ const controller = new CountController ( {
242
+ messenger : getCountMessenger ( controllerMessenger ) ,
243
+ name : 'CountController' ,
244
+ state : { count : 0 } ,
245
+ metadata : countControllerStateMetadata ,
246
+ } ) ;
247
+ const listener1 = sinon . stub ( ) ;
248
+
249
+ controllerMessenger . subscribe ( 'CountController:stateChange' , listener1 ) ;
250
+ const { inversePatches } = controller . update ( ( ) => {
251
+ return { count : 1 } ;
252
+ } ) ;
253
+
254
+ controller . applyPatches ( inversePatches ) ;
255
+
256
+ expect ( listener1 . callCount ) . toStrictEqual ( 2 ) ;
257
+ expect ( listener1 . firstCall . args ) . toStrictEqual ( [
258
+ { count : 1 } ,
259
+ [ { op : 'replace' , path : [ ] , value : { count : 1 } } ] ,
260
+ ] ) ;
261
+
262
+ expect ( listener1 . secondCall . args ) . toStrictEqual ( [
263
+ { count : 0 } ,
264
+ [ { op : 'replace' , path : [ ] , value : { count : 0 } } ] ,
265
+ ] ) ;
266
+ } ) ;
267
+
191
268
it ( 'should inform subscribers of state changes' , ( ) => {
192
269
const controllerMessenger = new ControllerMessenger <
193
270
never ,
0 commit comments