@@ -132,6 +132,96 @@ describe('decorator', () => {
132132 expect ( bar . mock . calls [ 1 ] [ 0 ] . value ) . toBe ( 'bazbar' )
133133 } )
134134
135+ it ( 'should update one field when another changes, using promises' , ( ) => {
136+ const form = createForm ( { onSubmit : onSubmitMock } )
137+ const spy = jest . fn ( )
138+ const foo = jest . fn ( )
139+ const bar = jest . fn ( )
140+ const promise = Promise . resolve ( 'bar' )
141+ form . subscribe ( spy , { values : true } )
142+ form . registerField ( 'foo' , foo , { value : true } )
143+ form . registerField ( 'bar' , bar , { value : true } )
144+ const decorator = createDecorator ( {
145+ field : 'foo' ,
146+ updates : {
147+ bar : fooValue => promise
148+ }
149+ } )
150+ const unsubscribe = decorator ( form )
151+ expect ( typeof unsubscribe ) . toBe ( 'function' )
152+
153+ expect ( spy ) . toHaveBeenCalled ( )
154+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
155+ expect ( spy . mock . calls [ 0 ] [ 0 ] . values ) . toEqual ( { } )
156+
157+ expect ( foo ) . toHaveBeenCalled ( )
158+ expect ( foo ) . toHaveBeenCalledTimes ( 1 )
159+ expect ( foo . mock . calls [ 0 ] [ 0 ] . value ) . toBeUndefined ( )
160+
161+ expect ( bar ) . toHaveBeenCalled ( )
162+ expect ( bar ) . toHaveBeenCalledTimes ( 1 )
163+ expect ( bar . mock . calls [ 0 ] [ 0 ] . value ) . toBeUndefined ( )
164+
165+ // change foo (should trigger calculation on bar)
166+ form . change ( 'foo' , 'baz' )
167+
168+ return promise . then ( ( ) => {
169+ expect ( spy ) . toHaveBeenCalledTimes ( 3 )
170+ expect ( spy . mock . calls [ 1 ] [ 0 ] . values ) . toEqual ( { foo : 'baz' } )
171+ expect ( spy . mock . calls [ 2 ] [ 0 ] . values ) . toEqual ( { foo : 'baz' , bar : 'bar' } )
172+
173+ expect ( foo ) . toHaveBeenCalledTimes ( 2 )
174+ expect ( foo . mock . calls [ 1 ] [ 0 ] . value ) . toBe ( 'baz' )
175+
176+ expect ( bar ) . toHaveBeenCalledTimes ( 2 )
177+ expect ( bar . mock . calls [ 1 ] [ 0 ] . value ) . toBe ( 'bar' )
178+ } )
179+ } )
180+
181+ it ( 'should update one field when another changes, using a single promise' , ( ) => {
182+ const form = createForm ( { onSubmit : onSubmitMock } )
183+ const spy = jest . fn ( )
184+ const foo = jest . fn ( )
185+ const bar = jest . fn ( )
186+ const promise = Promise . resolve ( { bar : 'bar' } )
187+ form . subscribe ( spy , { values : true } )
188+ form . registerField ( 'foo' , foo , { value : true } )
189+ form . registerField ( 'bar' , bar , { value : true } )
190+ const decorator = createDecorator ( {
191+ field : 'foo' ,
192+ updates : ( ) => promise
193+ } )
194+ const unsubscribe = decorator ( form )
195+ expect ( typeof unsubscribe ) . toBe ( 'function' )
196+
197+ expect ( spy ) . toHaveBeenCalled ( )
198+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
199+ expect ( spy . mock . calls [ 0 ] [ 0 ] . values ) . toEqual ( { } )
200+
201+ expect ( foo ) . toHaveBeenCalled ( )
202+ expect ( foo ) . toHaveBeenCalledTimes ( 1 )
203+ expect ( foo . mock . calls [ 0 ] [ 0 ] . value ) . toBeUndefined ( )
204+
205+ expect ( bar ) . toHaveBeenCalled ( )
206+ expect ( bar ) . toHaveBeenCalledTimes ( 1 )
207+ expect ( bar . mock . calls [ 0 ] [ 0 ] . value ) . toBeUndefined ( )
208+
209+ // change foo (should trigger calculation on bar)
210+ form . change ( 'foo' , 'baz' )
211+
212+ return promise . then ( ( ) => {
213+ expect ( spy ) . toHaveBeenCalledTimes ( 3 )
214+ expect ( spy . mock . calls [ 1 ] [ 0 ] . values ) . toEqual ( { foo : 'baz' } )
215+ expect ( spy . mock . calls [ 2 ] [ 0 ] . values ) . toEqual ( { foo : 'baz' , bar : 'bar' } )
216+
217+ expect ( foo ) . toHaveBeenCalledTimes ( 2 )
218+ expect ( foo . mock . calls [ 1 ] [ 0 ] . value ) . toBe ( 'baz' )
219+
220+ expect ( bar ) . toHaveBeenCalledTimes ( 2 )
221+ expect ( bar . mock . calls [ 1 ] [ 0 ] . value ) . toBe ( 'bar' )
222+ } )
223+ } )
224+
135225 it ( 'should cease when unsubscribed' , ( ) => {
136226 const form = createForm ( { onSubmit : onSubmitMock } )
137227 const spy = jest . fn ( )
0 commit comments