@@ -205,7 +205,7 @@ describe('decorator', () => {
205205 expect ( spy . mock . calls [ 6 ] [ 0 ] . values ) . toEqual ( { items : [ 3 , 4 , 5 ] , total : 12 } )
206206 } )
207207
208- it ( 'should allow seperate array summing' , ( ) => {
208+ it ( 'should allow separate array summing' , ( ) => {
209209 const form = createForm ( { onSubmit : onSubmitMock } )
210210 const spy = jest . fn ( )
211211 const total = jest . fn ( )
@@ -278,4 +278,81 @@ describe('decorator', () => {
278278 list : [ { items : [ 3 , 4 , 5 ] , total : 12 } ]
279279 } )
280280 } )
281+
282+ it ( 'should notify form subscribers of updated values' , ( ) => {
283+ const form = createForm ( { onSubmit : onSubmitMock } )
284+ const spy = jest . fn ( )
285+ const minimum = jest . fn ( )
286+ const maximum = jest . fn ( )
287+ const calcMax = jest . fn ( ( minimumValue , allValues ) =>
288+ Math . max ( minimumValue || 0 , allValues . maximum || 0 )
289+ )
290+ const calcMin = jest . fn ( ( maximumValue , allValues ) =>
291+ Math . min ( maximumValue || 0 , allValues . minimum || 0 )
292+ )
293+ form . subscribe ( spy , { values : true } )
294+ form . registerField ( 'minimum' , minimum , { value : true } )
295+ form . registerField ( 'maximum' , maximum , { value : true } )
296+ const decorator = createDecorator (
297+ {
298+ field : 'minimum' , // when minimum changes...
299+ updates : {
300+ // ...update maximum to the result of this function
301+ maximum : calcMax
302+ }
303+ } ,
304+ {
305+ field : 'maximum' , // when maximum changes...
306+ updates : {
307+ // update minimum to the result of this function
308+ minimum : calcMin
309+ }
310+ }
311+ )
312+ decorator ( form )
313+
314+ expect ( spy ) . toHaveBeenCalled ( )
315+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
316+ expect ( spy . mock . calls [ 0 ] [ 0 ] . values ) . toEqual ( { } )
317+
318+ expect ( minimum ) . toHaveBeenCalled ( )
319+ expect ( minimum ) . toHaveBeenCalledTimes ( 1 )
320+ expect ( minimum . mock . calls [ 0 ] [ 0 ] . value ) . toBeUndefined ( )
321+
322+ expect ( maximum ) . toHaveBeenCalled ( )
323+ expect ( maximum ) . toHaveBeenCalledTimes ( 1 )
324+ expect ( maximum . mock . calls [ 0 ] [ 0 ] . value ) . toBeUndefined ( )
325+
326+ expect ( calcMax ) . not . toHaveBeenCalled ( )
327+ expect ( calcMin ) . not . toHaveBeenCalled ( )
328+
329+ // change minimum
330+ form . change ( 'minimum' , 3 )
331+
332+ expect ( calcMax ) . toHaveBeenCalled ( )
333+ expect ( calcMax ) . toHaveBeenCalledTimes ( 1 )
334+ expect ( calcMin ) . toHaveBeenCalled ( )
335+ expect ( calcMin ) . toHaveBeenCalledTimes ( 1 )
336+
337+ expect ( spy ) . toHaveBeenCalledTimes ( 3 )
338+ expect ( spy . mock . calls [ 1 ] [ 0 ] . values ) . toEqual ( { minimum : 3 } )
339+ expect ( spy . mock . calls [ 2 ] [ 0 ] . values ) . toEqual ( { minimum : 3 , maximum : 3 } )
340+
341+ // raise maximum higher
342+ form . change ( 'maximum' , 5 )
343+
344+ expect ( calcMin ) . toHaveBeenCalledTimes ( 2 )
345+
346+ expect ( spy ) . toHaveBeenCalledTimes ( 4 )
347+ expect ( spy . mock . calls [ 3 ] [ 0 ] . values ) . toEqual ( { minimum : 3 , maximum : 5 } )
348+
349+ form . change ( 'maximum' , 2 )
350+
351+ expect ( calcMin ) . toHaveBeenCalledTimes ( 3 )
352+ expect ( calcMax ) . toHaveBeenCalledTimes ( 2 )
353+
354+ expect ( spy ) . toHaveBeenCalledTimes ( 6 )
355+ expect ( spy . mock . calls [ 4 ] [ 0 ] . values ) . toEqual ( { minimum : 3 , maximum : 2 } )
356+ expect ( spy . mock . calls [ 5 ] [ 0 ] . values ) . toEqual ( { minimum : 2 , maximum : 2 } )
357+ } )
281358} )
0 commit comments