2323 THE SOFTWARE.
2424*/
2525import React from 'react' ;
26-
27- import Enzyme , { mount , ReactWrapper } from 'enzyme' ;
26+ import { act } from 'react-dom/test-utils' ;
27+ import Enzyme , { ReactWrapper } from 'enzyme' ;
2828import Adapter from '@wojtekmaj/enzyme-adapter-react-17' ;
2929import { ControlElement } from '@jsonforms/core' ;
3030import {
@@ -33,12 +33,10 @@ import {
3333 materialRenderers ,
3434} from '../../src' ;
3535import { JsonForms , JsonFormsStateProvider } from '@jsonforms/react' ;
36- import { initCore , TestEmitter } from './util' ;
36+ import { initCore , mountWithAct , TestEmitter } from './util' ;
3737
3838Enzyme . configure ( { adapter : new Adapter ( ) } ) ;
3939
40- const waitForAsync = ( ) => new Promise ( ( resolve ) => setTimeout ( resolve , 0 ) ) ;
41-
4240const clickAddButton = ( wrapper : ReactWrapper , times : number ) => {
4341 const buttons = wrapper . find ( 'button' ) ;
4442 const addButton = buttons . at ( 2 ) ;
@@ -57,9 +55,23 @@ const selectanyOfTab = (wrapper: ReactWrapper, at: number) => {
5755describe ( 'Material anyOf renderer' , ( ) => {
5856 let wrapper : ReactWrapper ;
5957
60- afterEach ( ( ) => wrapper . unmount ( ) ) ;
58+ beforeEach ( ( ) => {
59+ jest . useFakeTimers ( ) ;
60+ } ) ;
61+
62+ afterEach ( ( ) => {
63+ // flush any pending debounce / async updates
64+ jest . runOnlyPendingTimers ( ) ;
65+
66+ // cleanup React tree FIRST
67+ if ( wrapper ) {
68+ wrapper . unmount ( ) ;
69+ }
70+
71+ jest . useRealTimers ( ) ;
72+ } ) ;
6173
62- it ( 'should add an item at correct path' , ( done ) => {
74+ it ( 'should add an item at correct path' , ( ) => {
6375 const schema = {
6476 type : 'object' ,
6577 properties : {
@@ -85,7 +97,7 @@ describe('Material anyOf renderer', () => {
8597 const onChangeData : any = {
8698 data : undefined ,
8799 } ;
88- wrapper = mount (
100+ wrapper = mountWithAct (
89101 < JsonForms
90102 data = { undefined }
91103 schema = { schema }
@@ -96,19 +108,23 @@ describe('Material anyOf renderer', () => {
96108 } }
97109 />
98110 ) ;
111+
99112 expect ( wrapper . find ( MaterialAnyOfRenderer ) . length ) . toBeTruthy ( ) ;
100- const input = wrapper . find ( 'input' ) . first ( ) ;
101- input . simulate ( 'change' , { target : { value : 'test' } } ) ;
113+
114+ act ( ( ) => {
115+ const input = wrapper . find ( 'input' ) . first ( ) ;
116+ input . simulate ( 'change' , { target : { value : 'test' } } ) ;
117+
118+ jest . runAllTimers ( ) ;
119+ } ) ;
120+
102121 wrapper . update ( ) ;
103- setTimeout ( ( ) => {
104- expect ( onChangeData . data ) . toEqual ( {
105- value : 'test' ,
106- } ) ;
107- done ( ) ;
108- } , 1000 ) ;
122+ expect ( onChangeData . data ) . toEqual ( {
123+ value : 'test' ,
124+ } ) ;
109125 } ) ;
110126
111- it ( 'should add a "mything"' , async ( ) => {
127+ it ( 'should add a "mything"' , ( ) => {
112128 const schema = {
113129 type : 'object' ,
114130 properties : {
@@ -155,18 +171,14 @@ describe('Material anyOf renderer', () => {
155171 scope : '#/properties/myThingsAndOrYourThings' ,
156172 } ;
157173 const core = initCore ( schema , uischema ) ;
158- wrapper = mount (
174+ wrapper = mountWithAct (
159175 < JsonFormsStateProvider
160176 initState = { { renderers : materialRenderers , core } }
161177 >
162178 < MaterialAnyOfRenderer schema = { schema } uischema = { uischema } />
163179 </ JsonFormsStateProvider >
164180 ) ;
165181
166- await waitForAsync ( ) ;
167-
168- wrapper . update ( ) ;
169-
170182 selectanyOfTab ( wrapper , 1 ) ;
171183 const nrOfRowsBeforeAdd = wrapper . find ( 'tr' ) ;
172184 clickAddButton ( wrapper , 2 ) ;
@@ -178,7 +190,7 @@ describe('Material anyOf renderer', () => {
178190 expect ( nrOfRowsAfterAdd . length ) . toBe ( 4 ) ;
179191 } ) ;
180192
181- it ( 'should switch to "yourThing" edit, then switch back, then edit' , async ( ) => {
193+ it ( 'should switch to "yourThing" edit, then switch back, then edit' , ( ) => {
182194 const schema = {
183195 type : 'object' ,
184196 properties : {
@@ -228,9 +240,14 @@ describe('Material anyOf renderer', () => {
228240 data : undefined ,
229241 } ;
230242 const core = initCore ( schema , uischema ) ;
231- wrapper = mount (
243+
244+ wrapper = mountWithAct (
232245 < JsonFormsStateProvider
233- initState = { { renderers : materialRenderers , cells : materialCells , core } }
246+ initState = { {
247+ renderers : materialRenderers ,
248+ cells : materialCells ,
249+ core,
250+ } }
234251 >
235252 < TestEmitter
236253 onChange = { ( { data } ) => {
@@ -241,10 +258,6 @@ describe('Material anyOf renderer', () => {
241258 </ JsonFormsStateProvider >
242259 ) ;
243260
244- await waitForAsync ( ) ;
245-
246- wrapper . update ( ) ;
247-
248261 selectanyOfTab ( wrapper , 1 ) ;
249262 clickAddButton ( wrapper , 1 ) ;
250263 wrapper
@@ -255,20 +268,15 @@ describe('Material anyOf renderer', () => {
255268 selectanyOfTab ( wrapper , 0 ) ;
256269
257270 const input = wrapper . find ( 'input' ) . first ( ) ;
258- input . simulate ( 'change' , { target : { value : 'test' } } ) ;
271+ act ( ( ) => {
272+ input . simulate ( 'change' , { target : { value : 'test' } } ) ;
273+ jest . runAllTimers ( ) ;
274+ } ) ;
259275 wrapper . update ( ) ;
260276
261- let done : ( value : undefined ) => void ;
262- const donePromise = new Promise < undefined > ( ( resolve ) => {
263- done = resolve ;
277+ expect ( onChangeData . data ) . toEqual ( {
278+ myThingsAndOrYourThings : [ { age : 5 , name : 'test' } ] ,
264279 } ) ;
265- setTimeout ( ( ) => {
266- expect ( onChangeData . data ) . toEqual ( {
267- myThingsAndOrYourThings : [ { age : 5 , name : 'test' } ] ,
268- } ) ;
269- done ( undefined ) ;
270- } , 1000 ) ;
271- return donePromise ;
272280 } ) ;
273281
274282 it ( 'should be hideable' , ( ) => {
@@ -295,7 +303,8 @@ describe('Material anyOf renderer', () => {
295303 scope : '#/properties/value' ,
296304 } ;
297305 const core = initCore ( schema , uischema ) ;
298- wrapper = mount (
306+
307+ wrapper = mountWithAct (
299308 < JsonFormsStateProvider
300309 initState = { { renderers : materialRenderers , core } }
301310 >
0 commit comments