1
1
/* global Meteor, Tinytest */
2
- import React , { Suspense } from 'react'
3
- import { renderToString } from 'react-dom/server'
4
- import { Mongo } from 'meteor/mongo'
2
+ import React , { Suspense } from 'react' ;
3
+ import { renderToString } from 'react-dom/server' ;
4
+ import { Mongo } from 'meteor/mongo' ;
5
+ import { renderHook } from '@testing-library/react' ;
6
+ import { useFindSuspenseClient , useFindSuspenseServer } from './useFind' ;
7
+
8
+ /**
9
+ * Test for useFindSuspenseClient
10
+ */
11
+ if ( Meteor . isClient ) {
12
+ Tinytest . addAsync (
13
+ 'suspense/useFindSuspenseClient - Verify reference stability between rerenders' ,
14
+ async ( test ) => {
15
+ const TestDocs = new Mongo . Collection ( null ) ;
16
+
17
+ TestDocs . insert ( { id : 0 , updated : 0 } ) ;
18
+ TestDocs . insert ( { id : 1 , updated : 0 } ) ;
19
+
20
+ const { result, rerender } = renderHook ( ( ) =>
21
+ useFindSuspenseClient ( TestDocs , [ { } ] )
22
+ ) ;
23
+
24
+ test . equal (
25
+ result . current . length ,
26
+ 2 ,
27
+ '2 items should have rendered, only 2, no more.'
28
+ ) ;
29
+
30
+ await TestDocs . updateAsync ( { id : 1 } , { $inc : { updated : 1 } } ) ;
31
+
32
+ rerender ( ) ;
33
+
34
+ test . equal (
35
+ result . current . length ,
36
+ 2 ,
37
+ '2 items should have rendered - only 1 of the items should have been matched by the reconciler after a single change.'
38
+ ) ;
39
+ }
40
+ ) ;
5
41
6
- import { useFindSuspense } from './useFind'
42
+ Tinytest . addAsync (
43
+ 'suspense/useFindSuspenseClient - null return is allowed' ,
44
+ async ( test ) => {
45
+ const TestDocs = new Mongo . Collection ( null ) ;
46
+
47
+ TestDocs . insertAsync ( { id : 0 , updated : 0 } ) ;
48
+
49
+ const { result } = renderHook ( ( ) =>
50
+ useFindSuspenseClient ( TestDocs , null )
51
+ ) ;
7
52
53
+ test . isNull (
54
+ result . current ,
55
+ 'Return value should be null when the factory returns null'
56
+ ) ;
57
+ }
58
+ ) ;
59
+ }
60
+
61
+ /**
62
+ * Test for useFindSuspenseServer
63
+ */
8
64
if ( Meteor . isServer ) {
9
65
Tinytest . addAsync (
10
- 'suspense/useFind - Data query validation' ,
66
+ 'suspense/useFindSuspenseServer - Data query validation' ,
11
67
async function ( test ) {
12
- const TestDocs = new Mongo . Collection ( null )
68
+ const TestDocs = new Mongo . Collection ( null ) ;
13
69
14
- TestDocs . insertAsync ( { id : 0 , updated : 0 } )
70
+ TestDocs . insertAsync ( { id : 0 , updated : 0 } ) ;
15
71
16
- let returnValue
72
+ let returnValue ;
17
73
18
74
const Test = ( ) => {
19
- returnValue = useFindSuspense ( TestDocs , [ { } ] )
75
+ returnValue = useFindSuspenseServer ( TestDocs , [ { } ] ) ;
20
76
21
- return null
22
- }
77
+ return null ;
78
+ } ;
23
79
const TestSuspense = ( ) => {
24
80
return (
25
81
< Suspense fallback = { < div > Loading...</ div > } >
26
82
< Test />
27
83
</ Suspense >
28
- )
29
- }
84
+ ) ;
85
+ } ;
30
86
31
87
// first return promise
32
- renderToString ( < TestSuspense /> )
88
+ renderToString ( < TestSuspense /> ) ;
33
89
test . isUndefined (
34
90
returnValue ,
35
91
'Return value should be undefined as find promise unresolved'
36
92
) ;
37
93
// wait promise
38
- await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) )
94
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
39
95
// return data
40
- renderToString ( < TestSuspense /> )
96
+ renderToString ( < TestSuspense /> ) ;
41
97
42
98
test . equal (
43
99
returnValue . length ,
44
100
1 ,
45
101
'Return value should be an array with one document'
46
- )
102
+ ) ;
47
103
}
48
- )
104
+ ) ;
49
105
50
106
Tinytest . addAsync (
51
- 'suspense/useFind - Test proper cache invalidation' ,
107
+ 'suspense/useFindSuspenseServer - Test proper cache invalidation' ,
52
108
async function ( test ) {
53
- const TestDocs = new Mongo . Collection ( null )
109
+ const TestDocs = new Mongo . Collection ( null ) ;
54
110
55
- TestDocs . insertAsync ( { id : 0 , updated : 0 } )
111
+ TestDocs . insertAsync ( { id : 0 , updated : 0 } ) ;
56
112
57
- let returnValue
113
+ let returnValue ;
58
114
59
115
const Test = ( ) => {
60
- returnValue = useFindSuspense ( TestDocs , [ { } ] )
116
+ returnValue = useFindSuspenseServer ( TestDocs , [ { } ] ) ;
61
117
62
- return null
63
- }
118
+ return null ;
119
+ } ;
64
120
const TestSuspense = ( ) => {
65
121
return (
66
122
< Suspense fallback = { < div > Loading...</ div > } >
67
123
< Test />
68
124
</ Suspense >
69
- )
70
- }
125
+ ) ;
126
+ } ;
71
127
72
128
// first return promise
73
- renderToString ( < TestSuspense /> )
129
+ renderToString ( < TestSuspense /> ) ;
74
130
75
131
test . isUndefined (
76
132
returnValue ,
77
133
'Return value should be undefined as find promise unresolved'
78
134
) ;
79
135
// wait promise
80
- await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) )
136
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
81
137
// return data
82
- renderToString ( < TestSuspense /> )
138
+ renderToString ( < TestSuspense /> ) ;
83
139
84
140
test . equal (
85
141
returnValue [ 0 ] . updated ,
86
142
0 ,
87
143
'Return value should be an array with initial value as find promise resolved'
88
144
) ;
89
145
90
- TestDocs . updateAsync ( { id : 0 } , { $inc : { updated : 1 } } )
91
- await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) )
146
+ TestDocs . updateAsync ( { id : 0 } , { $inc : { updated : 1 } } ) ;
147
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
92
148
93
149
// second return promise
94
- renderToString ( < TestSuspense /> )
150
+ renderToString ( < TestSuspense /> ) ;
95
151
96
152
test . equal (
97
153
returnValue [ 0 ] . updated ,
@@ -100,46 +156,46 @@ if (Meteor.isServer) {
100
156
) ;
101
157
102
158
// wait promise
103
- await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) )
159
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
104
160
// return data
105
- renderToString ( < TestSuspense /> )
161
+ renderToString ( < TestSuspense /> ) ;
106
162
107
163
test . equal (
108
164
returnValue [ 0 ] . updated ,
109
165
1 ,
110
166
'Return value should be an array with one document with value updated'
111
- )
167
+ ) ;
112
168
}
113
- )
169
+ ) ;
114
170
115
171
Tinytest . addAsync (
116
- 'suspense/useFind - null return is allowed' ,
172
+ 'suspense/useFindSuspenseServer - null return is allowed' ,
117
173
async function ( test ) {
118
- const TestDocs = new Mongo . Collection ( null )
174
+ const TestDocs = new Mongo . Collection ( null ) ;
119
175
120
- TestDocs . insertAsync ( { id : 0 , updated : 0 } )
176
+ TestDocs . insertAsync ( { id : 0 , updated : 0 } ) ;
121
177
122
- let returnValue
178
+ let returnValue ;
123
179
124
180
const Test = ( ) => {
125
- returnValue = useFindSuspense ( TestDocs , null )
181
+ returnValue = useFindSuspenseServer ( TestDocs , null ) ;
126
182
127
- return null
128
- }
183
+ return null ;
184
+ } ;
129
185
const TestSuspense = ( ) => {
130
186
return (
131
187
< Suspense fallback = { < div > Loading...</ div > } >
132
188
< Test />
133
189
</ Suspense >
134
- )
135
- }
190
+ ) ;
191
+ } ;
136
192
137
- renderToString ( < TestSuspense returnNull = { true } /> )
193
+ renderToString ( < TestSuspense returnNull = { true } /> ) ;
138
194
139
195
test . isNull (
140
196
returnValue ,
141
197
'Return value should be null when the factory returns null'
142
- )
198
+ ) ;
143
199
}
144
- )
200
+ ) ;
145
201
}
0 commit comments