1
1
import React from 'react' ;
2
- import { render } from '@testing-library/react' ;
2
+ import { act , render } from '@testing-library/react' ;
3
3
import Spinner from '../Spinner' ;
4
4
5
+ jest . useFakeTimers ( ) ;
6
+
5
7
describe ( 'Spinner' , ( ) => {
6
8
test ( 'renders a div with class "border-spinner"' , ( ) => {
7
9
const spinner = render ( < Spinner /> ) ;
@@ -12,21 +14,39 @@ describe('Spinner', () => {
12
14
} ) ;
13
15
14
16
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 >
17
21
) ;
18
22
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 ) ;
20
29
21
30
rerender (
22
31
< Spinner loading_state = { { is_loading : true } } > Some spinner content</ Spinner >
23
32
) ;
24
33
25
- const overAll = All . firstChild ;
34
+ const overAll = container . firstChild ;
26
35
const spinner = overAll . lastChild ;
27
36
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 ) ;
30
50
} ) ;
31
51
32
52
test ( 'applies additional CSS classes when props are set' , ( ) => {
@@ -64,4 +84,31 @@ describe('Spinner', () => {
64
84
expect ( spinnerSuccess ) . toHaveClass ( 'text-success' ) ;
65
85
expect ( spinnerDark ) . toHaveClass ( 'text-dark' ) ;
66
86
} ) ;
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
+ } ) ;
67
114
} ) ;
0 commit comments