11import React from 'react' ;
2- import { render } from '@testing-library/react' ;
2+ import { act , render } from '@testing-library/react' ;
33import Spinner from '../Spinner' ;
44
5+ jest . useFakeTimers ( ) ;
6+
57describe ( 'Spinner' , ( ) => {
68 test ( 'renders a div with class "border-spinner"' , ( ) => {
79 const spinner = render ( < Spinner /> ) ;
@@ -12,21 +14,39 @@ describe('Spinner', () => {
1214 } ) ;
1315
1416 test ( "renders its content if object isn't loading" , ( ) => {
15- const { container : All , rerender} = render (
16- < Spinner > Some spinner content</ Spinner >
17+ const { container : container , rerender} = render (
18+ < Spinner loading_state = { { is_loading : false } } >
19+ Some spinner content
20+ </ Spinner >
1721 ) ;
1822
19- expect ( All ) . toHaveTextContent ( 'Some spinner content' ) ;
23+ // spinner is initially visible until we've had time to update based on
24+ // loading state. this can be disabled with show_initially={false}
25+ act ( ( ) => jest . advanceTimersByTime ( 10 ) ) ;
26+
27+ expect ( container ) . toHaveTextContent ( 'Some spinner content' ) ;
28+ expect ( container . querySelector ( 'div.spinner-border' ) ) . toBe ( null ) ;
2029
2130 rerender (
2231 < Spinner loading_state = { { is_loading : true } } > Some spinner content</ Spinner >
2332 ) ;
2433
25- const overAll = All . firstChild ;
34+ const overAll = container . firstChild ;
2635 const spinner = overAll . lastChild ;
2736
28- expect ( overAll ) . toHaveTextContent ( 'Some spinner content' ) ;
29- expect ( spinner . firstChild ) . toHaveClass ( 'spinner-border' ) ;
37+ act ( ( ) => jest . advanceTimersByTime ( 10 ) ) ;
38+
39+ expect ( container ) . toHaveTextContent ( 'Some spinner content' ) ;
40+ expect ( container . querySelector ( 'div.spinner-border' ) ) . not . toBe ( null ) ;
41+ } ) ;
42+
43+ test ( "doesn't show initially when show_initially is false" , ( ) => {
44+ const { container : container } = render (
45+ < Spinner show_initially = { false } > Some spinner content</ Spinner >
46+ ) ;
47+
48+ expect ( container ) . toHaveTextContent ( 'Some spinner content' ) ;
49+ expect ( container . querySelector ( 'div.spinner-border' ) ) . toBe ( null ) ;
3050 } ) ;
3151
3252 test ( 'applies additional CSS classes when props are set' , ( ) => {
@@ -64,4 +84,31 @@ describe('Spinner', () => {
6484 expect ( spinnerSuccess ) . toHaveClass ( 'text-success' ) ;
6585 expect ( spinnerDark ) . toHaveClass ( 'text-dark' ) ;
6686 } ) ;
87+
88+ test ( 'spinner can be debounced with debounce prop' , ( ) => {
89+ const { container : container , rerender} = render (
90+ < Spinner loading_state = { { is_loading : true } } debounce = { 1000 } >
91+ Some spinner content
92+ </ Spinner >
93+ ) ;
94+
95+ const overAll = container . firstChild ;
96+ const spinner = overAll . lastChild ;
97+
98+ expect ( overAll ) . toHaveTextContent ( 'Some spinner content' ) ;
99+ expect ( spinner . firstChild ) . toHaveClass ( 'spinner-border' ) ;
100+
101+ rerender (
102+ < Spinner loading_state = { { is_loading : false } } debounce = { 1000 } >
103+ Some spinner content
104+ </ Spinner >
105+ ) ;
106+
107+ expect ( overAll ) . toHaveTextContent ( 'Some spinner content' ) ;
108+ expect ( spinner . firstChild ) . toHaveClass ( 'spinner-border' ) ;
109+
110+ act ( ( ) => jest . advanceTimersByTime ( 1000 ) ) ;
111+
112+ expect ( container . querySelector ( 'div.spinner-border' ) ) . toBe ( null ) ;
113+ } ) ;
67114} ) ;
0 commit comments