1
1
import { act , render , renderHook } from '@testing-library/react'
2
- import { createElement , Fragment , useMemo } from 'react'
2
+ import { useMemo } from 'react'
3
+ import { renderToString } from 'react-dom/server'
3
4
import { asyncScheduler , Observable , of , ReplaySubject , scheduled , share , Subject , timer } from 'rxjs'
4
5
import { map } from 'rxjs/operators'
5
6
import { expect , test } from 'vitest'
@@ -51,9 +52,9 @@ test('should not return undefined during render if initial value is given', () =
51
52
function ObservableComponent ( ) {
52
53
const observedValue = useObservable ( observable , 'initial value' )
53
54
returnedValues . push ( observedValue )
54
- return createElement ( Fragment , null , observedValue )
55
+ return < > { observedValue } </ >
55
56
}
56
- render ( createElement ( ObservableComponent ) )
57
+ render ( < ObservableComponent /> )
57
58
expect ( returnedValues ) . toEqual ( expect . arrayContaining ( [ 'initial value' ] ) )
58
59
} )
59
60
@@ -64,9 +65,9 @@ test('should not return undefined during render if observable is sync', () => {
64
65
function ObservableComponent ( ) {
65
66
const observedValue = useObservable ( observable )
66
67
returnedValues . push ( observedValue )
67
- return createElement ( Fragment , null , observedValue )
68
+ return < > { observedValue } </ >
68
69
}
69
- render ( createElement ( ObservableComponent ) )
70
+ render ( < ObservableComponent /> )
70
71
expect ( returnedValues ) . toEqual ( expect . arrayContaining ( [ 'initial value' ] ) )
71
72
} )
72
73
@@ -77,9 +78,9 @@ test('should return undefined during first render if observable is async', () =>
77
78
function ObservableComponent ( ) {
78
79
const observedValue = useObservable ( observable )
79
80
returnedValues . push ( observedValue )
80
- return createElement ( Fragment , null , observedValue )
81
+ return < > { observedValue } </ >
81
82
}
82
- render ( createElement ( ObservableComponent ) )
83
+ render ( < ObservableComponent /> )
83
84
expect ( returnedValues ) . toEqual ( expect . arrayContaining ( [ undefined ] ) )
84
85
} )
85
86
@@ -261,16 +262,16 @@ test('should return undefined if observable emits undefined, also when given ini
261
262
[ props . prefix ] ,
262
263
)
263
264
snapshots . push ( useObservable ( observable , 'initial' ) )
264
- return createElement ( Fragment , null )
265
+ return null
265
266
}
266
267
267
- const { unmount, rerender} = render ( createElement ( ObservableComponent , { prefix : ' first' } ) )
268
+ const { unmount, rerender} = render ( < ObservableComponent prefix = " first" /> )
268
269
act ( ( ) => subject . next ( 'foo' ) )
269
270
act ( ( ) => subject . next ( undefined ) )
270
271
act ( ( ) => subject . next ( 'bar' ) )
271
272
272
273
// now change the prefix
273
- rerender ( createElement ( ObservableComponent , { prefix : ' second' } ) )
274
+ rerender ( < ObservableComponent prefix = " second" /> )
274
275
act ( ( ) => subject . next ( 'foo again' ) )
275
276
act ( ( ) => subject . next ( undefined ) )
276
277
act ( ( ) => subject . next ( 'bar again' ) )
@@ -286,3 +287,25 @@ test('should return undefined if observable emits undefined, also when given ini
286
287
] )
287
288
unmount ( )
288
289
} )
290
+
291
+ test ( 'should support SSR if an initial value is given' , ( ) => {
292
+ const observable = scheduled ( 'async value' , asyncScheduler )
293
+ function ObservableComponent ( ) {
294
+ const observedValue = useObservable ( observable , 'initial value' )
295
+ return < > { observedValue } </ >
296
+ }
297
+
298
+ expect ( renderToString ( < ObservableComponent /> ) ) . toBe ( 'initial value' )
299
+ } )
300
+
301
+ test ( 'should throw during SSR if no initial value is defined' , ( ) => {
302
+ const observable = scheduled ( 'async value' , asyncScheduler )
303
+ function ObservableComponent ( ) {
304
+ const observedValue = useObservable ( observable )
305
+ return < > { observedValue } </ >
306
+ }
307
+
308
+ expect ( ( ) => renderToString ( < ObservableComponent /> ) ) . toThrowErrorMatchingInlineSnapshot (
309
+ `[Error: Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering.]` ,
310
+ )
311
+ } )
0 commit comments