99 Subject ,
1010} from "rxjs"
1111import { renderHook , act as actHook } from "@testing-library/react-hooks"
12- import { switchMap , delay , take } from "rxjs/operators"
12+ import { switchMap , delay , take , catchError } from "rxjs/operators"
1313import { FC , Suspense , useState } from "react"
1414import React from "react"
1515import {
@@ -55,7 +55,8 @@ describe("connectFactoryObservable", () => {
5555
5656 it ( "suspends the component when the observable hasn't emitted yet." , async ( ) => {
5757 const source$ = of ( 1 ) . pipe ( delay ( 100 ) )
58- const [ useDelayedNumber ] = bind ( ( ) => source$ )
58+ const [ useDelayedNumber , getDelayedNumber$ ] = bind ( ( ) => source$ )
59+ const subs = getDelayedNumber$ ( ) . subscribe ( )
5960 const Result : React . FC = ( ) => < div > Result { useDelayedNumber ( ) } </ div >
6061 const TestSuspense : React . FC = ( ) => {
6162 return (
@@ -74,6 +75,7 @@ describe("connectFactoryObservable", () => {
7475
7576 expect ( screen . queryByText ( "Result 1" ) ) . not . toBeNull ( )
7677 expect ( screen . queryByText ( "Waiting" ) ) . toBeNull ( )
78+ subs . unsubscribe ( )
7779 } )
7880
7981 it ( "shares the multicasted subscription with all of the components that use the same parameters" , async ( ) => {
@@ -92,19 +94,21 @@ describe("connectFactoryObservable", () => {
9294 expect ( subscriberCount ) . toBe ( 0 )
9395
9496 const first = { val : 1 }
97+ latestNumber$ ( 1 , first ) . subscribe ( )
9598 renderHook ( ( ) => useLatestNumber ( 1 , first ) )
9699 expect ( subscriberCount ) . toBe ( 1 )
97100
98101 renderHook ( ( ) => useLatestNumber ( 1 , first ) )
99102 expect ( subscriberCount ) . toBe ( 1 )
100103
101- latestNumber$ ( 1 , first ) . subscribe ( )
102104 expect ( subscriberCount ) . toBe ( 1 )
103105
104106 const second = { val : 2 }
107+ latestNumber$ ( 1 , second ) . subscribe ( )
105108 renderHook ( ( ) => useLatestNumber ( 1 , second ) )
106109 expect ( subscriberCount ) . toBe ( 2 )
107110
111+ latestNumber$ ( 2 , second ) . subscribe ( )
108112 renderHook ( ( ) => useLatestNumber ( 2 , second ) )
109113 expect ( subscriberCount ) . toBe ( 3 )
110114 } )
@@ -135,7 +139,9 @@ describe("connectFactoryObservable", () => {
135139 } )
136140
137141 it ( "suspends the component when the factory-observable hasn't emitted yet." , async ( ) => {
138- const [ useDelayedNumber ] = bind ( ( x : number ) => of ( x ) . pipe ( delay ( 50 ) ) )
142+ const [ useDelayedNumber , getDelayedNumber$ ] = bind ( ( x : number ) =>
143+ of ( x ) . pipe ( delay ( 50 ) ) ,
144+ )
139145 const Result : React . FC < { input : number } > = ( p ) => (
140146 < div > Result { useDelayedNumber ( p . input ) } </ div >
141147 )
@@ -151,6 +157,7 @@ describe("connectFactoryObservable", () => {
151157 )
152158 }
153159
160+ getDelayedNumber$ ( 0 ) . subscribe ( )
154161 render ( < TestSuspense /> )
155162 expect ( screen . queryByText ( "Result" ) ) . toBeNull ( )
156163 expect ( screen . queryByText ( "Waiting" ) ) . not . toBeNull ( )
@@ -161,6 +168,7 @@ describe("connectFactoryObservable", () => {
161168 expect ( screen . queryByText ( "Waiting" ) ) . toBeNull ( )
162169
163170 componentAct ( ( ) => {
171+ getDelayedNumber$ ( 1 ) . subscribe ( )
164172 fireEvent . click ( screen . getByText ( / i n c r e a s e / i) )
165173 } )
166174 expect ( screen . queryByText ( "Result" ) ) . toBeNull ( )
@@ -172,6 +180,7 @@ describe("connectFactoryObservable", () => {
172180 expect ( screen . queryByText ( "Waiting" ) ) . toBeNull ( )
173181
174182 componentAct ( ( ) => {
183+ getDelayedNumber$ ( 2 ) . subscribe ( )
175184 fireEvent . click ( screen . getByText ( / i n c r e a s e / i) )
176185 } )
177186 expect ( screen . queryByText ( "Result" ) ) . toBeNull ( )
@@ -190,9 +199,10 @@ describe("connectFactoryObservable", () => {
190199 return from ( [ 1 , 2 , 3 , 4 , 5 ] )
191200 } )
192201
193- const [ useLatestNumber ] = bind ( ( id : number ) =>
202+ const [ useLatestNumber , getLatestNumber$ ] = bind ( ( id : number ) =>
194203 concat ( observable$ , of ( id ) ) ,
195204 )
205+ let subs = getLatestNumber$ ( 6 ) . subscribe ( )
196206 const { unmount } = renderHook ( ( ) => useLatestNumber ( 6 ) )
197207 const { unmount : unmount2 } = renderHook ( ( ) => useLatestNumber ( 6 ) )
198208 const { unmount : unmount3 } = renderHook ( ( ) => useLatestNumber ( 6 ) )
@@ -201,13 +211,13 @@ describe("connectFactoryObservable", () => {
201211 unmount2 ( )
202212 unmount3 ( )
203213
204- await wait ( 230 )
205214 const { unmount : unmount4 } = renderHook ( ( ) => useLatestNumber ( 6 ) )
206215 expect ( nInitCount ) . toBe ( 1 )
207216
208217 unmount4 ( )
209- await wait ( 270 )
218+ subs . unsubscribe ( )
210219
220+ getLatestNumber$ ( 6 ) . subscribe ( )
211221 renderHook ( ( ) => useLatestNumber ( 6 ) )
212222 expect ( nInitCount ) . toBe ( 2 )
213223 } )
@@ -307,7 +317,13 @@ describe("connectFactoryObservable", () => {
307317 observer . error ( "controlled error" )
308318 } )
309319
310- const [ useOkKo ] = bind ( ( ok : boolean ) => ( ok ? normal$ : errored$ ) )
320+ const [ useOkKo , getObs$ ] = bind ( ( ok : boolean ) =>
321+ ok ? normal$ : errored$ ,
322+ )
323+ getObs$ ( true ) . subscribe ( )
324+ getObs$ ( false )
325+ . pipe ( catchError ( ( ) => [ ] ) )
326+ . subscribe ( )
311327
312328 const ErrorComponent = ( ) => {
313329 const [ ok , setOk ] = useState ( true )
@@ -407,6 +423,7 @@ describe("connectFactoryObservable", () => {
407423 expect ( sub1 . closed ) . toBe ( false )
408424 sub1 . unsubscribe ( )
409425
426+ let sub = getShared ( 0 ) . subscribe ( )
410427 const { result, unmount } = renderHook ( ( ) => useLatestNumber ( 0 ) )
411428 expect ( result . current ) . toBe ( 5 )
412429 expect ( nUpdates ) . toBe ( 4 )
@@ -432,7 +449,7 @@ describe("connectFactoryObservable", () => {
432449 sub3 . unsubscribe ( )
433450
434451 unmount ( )
435- await wait ( 260 )
452+ sub . unsubscribe ( )
436453
437454 let latestValue4 : number = 0
438455 const sub4 = getShared ( 0 ) . subscribe ( ( x ) => {
0 commit comments