@@ -58,10 +58,7 @@ describe('test Toast component', () => {
5858 < Modal visible = { isVisible } >
5959 < Text > Inside modal</ Text >
6060 < Button title = 'Hide modal' onPress = { ( ) => setIsVisible ( false ) } />
61- < Toast
62- onShow = { onShowInsideModal }
63- onHide = { onHideInsideModal }
64- />
61+ < Toast onShow = { onShowInsideModal } onHide = { onHideInsideModal } />
6562 </ Modal >
6663 </ >
6764 ) ;
@@ -148,4 +145,102 @@ describe('test Toast component', () => {
148145 } ) ;
149146 expect ( onShow ) . not . toHaveBeenCalled ( ) ;
150147 } ) ;
148+
149+ it ( 'when autoHide: true, the Toast only hides when timer reaches visibilityTime' , ( ) => {
150+ jest . useFakeTimers ( ) ;
151+ const onShow = jest . fn ( ) ;
152+ const onHide = jest . fn ( ) ;
153+ const visibilityTime = 1500 ;
154+
155+ render (
156+ < Toast
157+ onShow = { onShow }
158+ onHide = { onHide }
159+ autoHide = { true }
160+ visibilityTime = { visibilityTime }
161+ />
162+ ) ;
163+
164+ act ( ( ) => {
165+ Toast . show ( {
166+ text1 : 'I am auto hiding, by default'
167+ } ) ;
168+ } ) ;
169+ expect ( onShow ) . toHaveBeenCalled ( ) ;
170+
171+ // Advance time by 1/4 visibilityTime
172+ // Toast should not hide yet
173+ jest . advanceTimersByTime ( visibilityTime / 4 ) ;
174+ expect ( onHide ) . not . toHaveBeenCalled ( ) ;
175+
176+ // Do it again 1/4 visibilityTime
177+ // Toast should still be visible
178+ jest . advanceTimersByTime ( visibilityTime / 4 ) ;
179+ expect ( onHide ) . not . toHaveBeenCalled ( ) ;
180+
181+ // Advance time by the remaining 1/2 visibilityTime
182+ act ( ( ) => {
183+ jest . advanceTimersByTime ( visibilityTime / 2 ) ;
184+ } ) ;
185+ // Now the Toast should hide
186+ expect ( onHide ) . toHaveBeenCalled ( ) ;
187+
188+ jest . useRealTimers ( ) ;
189+ } ) ;
190+
191+ it ( 'clears previous autoHide: true timer when a new Toast is presented with autoHide: false' , ( ) => {
192+ jest . useFakeTimers ( ) ;
193+
194+ const onShow = jest . fn ( ) ;
195+ const onHide = jest . fn ( ) ;
196+ const visibilityTime = 1500 ;
197+
198+ render (
199+ < Toast
200+ onShow = { onShow }
201+ onHide = { onHide }
202+ autoHide = { true }
203+ visibilityTime = { visibilityTime }
204+ />
205+ ) ;
206+
207+ act ( ( ) => {
208+ Toast . show ( {
209+ text1 : 'I am auto hiding, by default'
210+ } ) ;
211+ } ) ;
212+ expect ( onShow ) . toHaveBeenCalled ( ) ;
213+
214+ // Advance by 1/2 visibilityTime
215+ // Toast should not hide
216+ jest . advanceTimersByTime ( visibilityTime / 2 ) ;
217+ expect ( onHide ) . not . toHaveBeenCalled ( ) ;
218+
219+ // Now, show another Toast, before the previous one has the chance to hide
220+ act ( ( ) => {
221+ Toast . show ( {
222+ text1 : 'I am NOT auto hiding' ,
223+ autoHide : false
224+ } ) ;
225+ } ) ;
226+
227+ // Advance time to the end of visibilityTime
228+ act ( ( ) => {
229+ jest . advanceTimersByTime ( visibilityTime / 2 ) ;
230+ } ) ;
231+
232+ // The new Toast should NOT hide
233+ // (the previous timer should have been cleared before reaching the end)
234+ expect ( onHide ) . not . toHaveBeenCalled ( ) ;
235+
236+ // And even go beyond visibilityTime
237+ act ( ( ) => {
238+ jest . advanceTimersByTime ( 1000 ) ;
239+ } ) ;
240+
241+ // The new Toast should still not hide
242+ expect ( onHide ) . not . toHaveBeenCalled ( ) ;
243+
244+ jest . useRealTimers ( ) ;
245+ } ) ;
151246} ) ;
0 commit comments