1- import { StrictMode , Suspense } from 'react'
1+ /// <reference types="react/canary" />
2+
3+ import ReactExports , { StrictMode , Suspense } from 'react'
24import { fireEvent , render , waitFor } from '@testing-library/react'
35import { it } from 'vitest'
46import { proxy , useSnapshot } from 'valtio'
@@ -8,7 +10,10 @@ const sleep = (ms: number) =>
810 setTimeout ( resolve , ms )
911 } )
1012
11- it ( 'delayed increment' , async ( ) => {
13+ const { use } = ReactExports as any // for TS < 4.3 FIXME later
14+ const use2 = ( x : any ) => ( x instanceof Promise ? use ( x ) : x )
15+
16+ it . skipIf ( typeof use === 'undefined' ) ( 'delayed increment' , async ( ) => {
1217 const state = proxy < any > ( { count : 0 } )
1318 const delayedIncrement = ( ) => {
1419 const nextCount = state . count + 1
@@ -19,7 +24,7 @@ it('delayed increment', async () => {
1924 const snap = useSnapshot ( state )
2025 return (
2126 < >
22- < div > count: { snap . count } </ div >
27+ < div > count: { use2 ( snap . count ) } </ div >
2328 < button onClick = { delayedIncrement } > button</ button >
2429 </ >
2530 )
@@ -40,7 +45,7 @@ it('delayed increment', async () => {
4045 await findByText ( 'count: 1' )
4146} )
4247
43- it ( 'delayed object' , async ( ) => {
48+ it . skipIf ( typeof use === 'undefined' ) ( 'delayed object' , async ( ) => {
4449 const state = proxy < any > ( { object : { text : 'none' } } )
4550 const delayedObject = ( ) => {
4651 state . object = sleep ( 300 ) . then ( ( ) => ( { text : 'hello' } ) )
@@ -50,7 +55,7 @@ it('delayed object', async () => {
5055 const snap = useSnapshot ( state )
5156 return (
5257 < >
53- < div > text: { snap . object . text } </ div >
58+ < div > text: { use2 ( snap . object ) . text } </ div >
5459 < button onClick = { delayedObject } > button</ button >
5560 </ >
5661 )
@@ -71,51 +76,54 @@ it('delayed object', async () => {
7176 await findByText ( 'text: hello' )
7277} )
7378
74- it ( 'delayed object update fulfilled' , async ( ) => {
75- const state = proxy < any > ( {
76- object : sleep ( 300 ) . then ( ( ) => ( { text : 'counter' , count : 0 } ) ) ,
77- } )
78- const updateObject = ( ) => {
79- state . object = state . object . then ( ( v : any ) =>
80- sleep ( 300 ) . then ( ( ) => ( { ...v , count : v . count + 1 } ) )
79+ it . skipIf ( typeof use === 'undefined' ) (
80+ 'delayed object update fulfilled' ,
81+ async ( ) => {
82+ const state = proxy < any > ( {
83+ object : sleep ( 300 ) . then ( ( ) => ( { text : 'counter' , count : 0 } ) ) ,
84+ } )
85+ const updateObject = ( ) => {
86+ state . object = state . object . then ( ( v : any ) =>
87+ sleep ( 300 ) . then ( ( ) => ( { ...v , count : v . count + 1 } ) )
88+ )
89+ }
90+
91+ const Counter = ( ) => {
92+ const snap = useSnapshot ( state )
93+ return (
94+ < >
95+ < div > text: { use2 ( snap . object ) . text } </ div >
96+ < div > count: { use2 ( snap . object ) . count } </ div >
97+ < button onClick = { updateObject } > button</ button >
98+ </ >
99+ )
100+ }
101+
102+ const { getByText, findByText } = render (
103+ < StrictMode >
104+ < Suspense fallback = "loading" >
105+ < Counter />
106+ </ Suspense >
107+ </ StrictMode >
81108 )
82- }
83109
84- const Counter = ( ) => {
85- const snap = useSnapshot ( state )
86- return (
87- < >
88- < div > text: { snap . object . text } </ div >
89- < div > count: { snap . object . count } </ div >
90- < button onClick = { updateObject } > button</ button >
91- </ >
92- )
93- }
110+ await findByText ( 'loading' )
111+ await waitFor ( ( ) => {
112+ getByText ( 'text: counter' )
113+ getByText ( 'count: 0' )
114+ } )
94115
95- const { getByText, findByText } = render (
96- < StrictMode >
97- < Suspense fallback = "loading" >
98- < Counter />
99- </ Suspense >
100- </ StrictMode >
101- )
102-
103- await findByText ( 'loading' )
104- await waitFor ( ( ) => {
105- getByText ( 'text: counter' )
106- getByText ( 'count: 0' )
107- } )
116+ fireEvent . click ( getByText ( 'button' ) )
108117
109- fireEvent . click ( getByText ( 'button' ) )
110-
111- await findByText ( 'loading' )
112- await waitFor ( ( ) => {
113- getByText ( 'text: counter' )
114- getByText ( 'count: 1' )
115- } )
116- } )
118+ await findByText ( 'loading' )
119+ await waitFor ( ( ) => {
120+ getByText ( 'text: counter' )
121+ getByText ( 'count: 1' )
122+ } )
123+ }
124+ )
117125
118- it ( 'delayed falsy value' , async ( ) => {
126+ it . skipIf ( typeof use === 'undefined' ) ( 'delayed falsy value' , async ( ) => {
119127 const state = proxy < any > ( { value : true } )
120128 const delayedValue = ( ) => {
121129 state . value = sleep ( 300 ) . then ( ( ) => null )
@@ -125,7 +133,7 @@ it('delayed falsy value', async () => {
125133 const snap = useSnapshot ( state )
126134 return (
127135 < >
128- < div > value: { String ( snap . value ) } </ div >
136+ < div > value: { String ( use2 ( snap . value ) ) } </ div >
129137 < button onClick = { delayedValue } > button</ button >
130138 </ >
131139 )
0 commit comments