| 
7 | 7 | 
 
  | 
8 | 8 | import React from 'react';  | 
9 | 9 | import { render, act } from 'garden-test-utils';  | 
10 |  | -import mockDate from 'mockdate';  | 
11 | 10 | import { PALETTE } from '@zendeskgarden/react-theming';  | 
12 | 11 | import { Dots } from './Dots';  | 
13 | 12 | 
 
  | 
14 |  | -jest.useFakeTimers({ legacyFakeTimers: true });  | 
15 |  | - | 
16 |  | -const DEFAULT_DATE = new Date(2019, 1, 5, 1, 1, 1);  | 
17 |  | - | 
18 | 13 | describe('Dots', () => {  | 
19 |  | -  beforeEach(() => {  | 
20 |  | -    jest.mocked(clearTimeout).mockClear();  | 
21 |  | -    (global as any).cancelAnimationFrame = jest.fn();  | 
22 |  | -    (global as any).requestAnimationFrame = jest.fn();  | 
23 |  | -    (global as any).document.elementFromPoint = jest.fn();  | 
24 |  | -    mockDate.set(DEFAULT_DATE);  | 
25 |  | -  });  | 
 | 14 | +  it('renders loader, starting as hidden by default', () => {  | 
 | 15 | +    const { queryByTestId } = render(<Dots data-test-id="dots" />);  | 
26 | 16 | 
 
  | 
27 |  | -  afterEach(() => {  | 
28 |  | -    mockDate.reset();  | 
 | 17 | +    expect(queryByTestId('dots')).toBeInTheDocument();  | 
 | 18 | +    expect(queryByTestId('dots')).not.toBeVisible();  | 
29 | 19 |   });  | 
30 | 20 | 
 
  | 
31 |  | -  describe('Loading delay', () => {  | 
32 |  | -    it('hides loader for initial delay', () => {  | 
33 |  | -      const { queryByTestId } = render(<Dots data-test-id="dots" />);  | 
34 |  | - | 
35 |  | -      expect(queryByTestId('dots')).toBeNull();  | 
36 |  | -    });  | 
37 |  | - | 
38 |  | -    it('shows loader after initial delay', () => {  | 
39 |  | -      const { queryByTestId } = render(<Dots data-test-id="dots" />);  | 
40 |  | - | 
41 |  | -      act(() => {  | 
42 |  | -        jest.runOnlyPendingTimers();  | 
43 |  | -      });  | 
44 |  | - | 
45 |  | -      expect(queryByTestId('dots')).not.toBeNull();  | 
46 |  | -    });  | 
47 |  | -  });  | 
48 |  | - | 
49 |  | -  describe('Animation', () => {  | 
50 |  | -    it('relies on svg transition attribute if css svg animation is not supported', () => {  | 
51 |  | -      const { container } = render(<Dots data-test-id="dots" />);  | 
52 |  | - | 
53 |  | -      act(() => {  | 
54 |  | -        jest.runOnlyPendingTimers();  | 
55 |  | -      });  | 
56 |  | - | 
57 |  | -      expect(container.querySelector('g')).toMatchInlineSnapshot(`  | 
58 |  | -        .c0 {  | 
59 |  | -          animation: kVOdef 1250ms linear infinite;  | 
60 |  | -        }  | 
61 |  | -
  | 
62 |  | -        .c1 {  | 
63 |  | -          animation: idDvaf 1250ms linear infinite;  | 
64 |  | -        }  | 
65 |  | -
  | 
66 |  | -        .c2 {  | 
67 |  | -          animation: bDxIcz 1250ms linear infinite;  | 
68 |  | -        }  | 
69 |  | -
  | 
70 |  | -        <g  | 
71 |  | -          fill="currentColor"  | 
72 |  | -        >  | 
73 |  | -          <circle  | 
74 |  | -            class="c0"  | 
75 |  | -            cx="9"  | 
76 |  | -            cy="36"  | 
77 |  | -            r="9"  | 
78 |  | -            transform=""  | 
79 |  | -          />  | 
80 |  | -          <circle  | 
81 |  | -            class="c1"  | 
82 |  | -            cx="40"  | 
83 |  | -            cy="36"  | 
84 |  | -            r="9"  | 
85 |  | -            transform=""  | 
86 |  | -          />  | 
87 |  | -          <circle  | 
88 |  | -            class="c2"  | 
89 |  | -            cx="71"  | 
90 |  | -            cy="36"  | 
91 |  | -            r="9"  | 
92 |  | -            transform=""  | 
93 |  | -          />  | 
94 |  | -        </g>  | 
95 |  | -      `);  | 
96 |  | -    });  | 
97 |  | - | 
98 |  | -    it('updates animation after request animation frame', () => {  | 
99 |  | -      const { container } = render(<Dots data-test-id="dots" />);  | 
100 |  | - | 
101 |  | -      act(() => {  | 
102 |  | -        jest.runOnlyPendingTimers();  | 
103 |  | -      });  | 
104 |  | - | 
105 |  | -      expect(container.querySelector('g')).toMatchInlineSnapshot(`  | 
106 |  | -        .c0 {  | 
107 |  | -          animation: kVOdef 1250ms linear infinite;  | 
108 |  | -        }  | 
109 |  | -
  | 
110 |  | -        .c1 {  | 
111 |  | -          animation: idDvaf 1250ms linear infinite;  | 
112 |  | -        }  | 
113 |  | -
  | 
114 |  | -        .c2 {  | 
115 |  | -          animation: bDxIcz 1250ms linear infinite;  | 
116 |  | -        }  | 
117 |  | -
  | 
118 |  | -        <g  | 
119 |  | -          fill="currentColor"  | 
120 |  | -        >  | 
121 |  | -          <circle  | 
122 |  | -            class="c0"  | 
123 |  | -            cx="9"  | 
124 |  | -            cy="36"  | 
125 |  | -            r="9"  | 
126 |  | -            transform=""  | 
127 |  | -          />  | 
128 |  | -          <circle  | 
129 |  | -            class="c1"  | 
130 |  | -            cx="40"  | 
131 |  | -            cy="36"  | 
132 |  | -            r="9"  | 
133 |  | -            transform=""  | 
134 |  | -          />  | 
135 |  | -          <circle  | 
136 |  | -            class="c2"  | 
137 |  | -            cx="71"  | 
138 |  | -            cy="36"  | 
139 |  | -            r="9"  | 
140 |  | -            transform=""  | 
141 |  | -          />  | 
142 |  | -        </g>  | 
143 |  | -      `);  | 
144 |  | - | 
145 |  | -      act(() => {  | 
146 |  | -        // move time forward 1 second  | 
147 |  | -        mockDate.set(DEFAULT_DATE.setSeconds(2));  | 
148 |  | -        jest.mocked(requestAnimationFrame).mock.calls[0][0](0);  | 
149 |  | -      });  | 
150 |  | - | 
151 |  | -      expect(container.querySelector('g')).toMatchInlineSnapshot(`  | 
152 |  | -        .c0 {  | 
153 |  | -          animation: kVOdef 1250ms linear infinite;  | 
154 |  | -        }  | 
155 |  | -
  | 
156 |  | -        .c1 {  | 
157 |  | -          animation: idDvaf 1250ms linear infinite;  | 
158 |  | -        }  | 
 | 21 | +  it('renders loader but does not hide if no delay', () => {  | 
 | 22 | +    const { queryByTestId } = render(<Dots data-test-id="dots" delayMS={0} />);  | 
159 | 23 | 
 
  | 
160 |  | -        .c2 {  | 
161 |  | -          animation: bDxIcz 1250ms linear infinite;  | 
162 |  | -        }  | 
163 |  | -
  | 
164 |  | -        <g  | 
165 |  | -          fill="currentColor"  | 
166 |  | -        >  | 
167 |  | -          <circle  | 
168 |  | -            class="c0"  | 
169 |  | -            cx="9"  | 
170 |  | -            cy="36"  | 
171 |  | -            r="9"  | 
172 |  | -            transform=""  | 
173 |  | -          />  | 
174 |  | -          <circle  | 
175 |  | -            class="c1"  | 
176 |  | -            cx="40"  | 
177 |  | -            cy="36"  | 
178 |  | -            r="9"  | 
179 |  | -            transform=""  | 
180 |  | -          />  | 
181 |  | -          <circle  | 
182 |  | -            class="c2"  | 
183 |  | -            cx="71"  | 
184 |  | -            cy="36"  | 
185 |  | -            r="9"  | 
186 |  | -            transform=""  | 
187 |  | -          />  | 
188 |  | -        </g>  | 
189 |  | -      `);  | 
190 |  | -    });  | 
191 |  | - | 
192 |  | -    it('updates animation after request animation frame with slower duration', () => {  | 
193 |  | -      const { container } = render(<Dots duration={1125} />);  | 
194 |  | - | 
195 |  | -      act(() => {  | 
196 |  | -        jest.runOnlyPendingTimers();  | 
197 |  | -      });  | 
198 |  | - | 
199 |  | -      expect(container.querySelector('g')).toMatchInlineSnapshot(`  | 
200 |  | -        .c0 {  | 
201 |  | -          animation: kVOdef 1125ms linear infinite;  | 
202 |  | -        }  | 
203 |  | -
  | 
204 |  | -        .c1 {  | 
205 |  | -          animation: idDvaf 1125ms linear infinite;  | 
206 |  | -        }  | 
207 |  | -
  | 
208 |  | -        .c2 {  | 
209 |  | -          animation: bDxIcz 1125ms linear infinite;  | 
210 |  | -        }  | 
211 |  | -
  | 
212 |  | -        <g  | 
213 |  | -          fill="currentColor"  | 
214 |  | -        >  | 
215 |  | -          <circle  | 
216 |  | -            class="c0"  | 
217 |  | -            cx="9"  | 
218 |  | -            cy="36"  | 
219 |  | -            r="9"  | 
220 |  | -            transform=""  | 
221 |  | -          />  | 
222 |  | -          <circle  | 
223 |  | -            class="c1"  | 
224 |  | -            cx="40"  | 
225 |  | -            cy="36"  | 
226 |  | -            r="9"  | 
227 |  | -            transform=""  | 
228 |  | -          />  | 
229 |  | -          <circle  | 
230 |  | -            class="c2"  | 
231 |  | -            cx="71"  | 
232 |  | -            cy="36"  | 
233 |  | -            r="9"  | 
234 |  | -            transform=""  | 
235 |  | -          />  | 
236 |  | -        </g>  | 
237 |  | -      `);  | 
238 |  | - | 
239 |  | -      act(() => {  | 
240 |  | -        // move time forward 1 second  | 
241 |  | -        mockDate.set(DEFAULT_DATE.setSeconds(2));  | 
242 |  | -        jest.mocked(requestAnimationFrame).mock.calls[0][0](0);  | 
243 |  | -      });  | 
244 |  | - | 
245 |  | -      expect(container.querySelector('g')).toMatchInlineSnapshot(`  | 
246 |  | -        .c0 {  | 
247 |  | -          animation: kVOdef 1125ms linear infinite;  | 
248 |  | -        }  | 
249 |  | -
  | 
250 |  | -        .c1 {  | 
251 |  | -          animation: idDvaf 1125ms linear infinite;  | 
252 |  | -        }  | 
253 |  | -
  | 
254 |  | -        .c2 {  | 
255 |  | -          animation: bDxIcz 1125ms linear infinite;  | 
256 |  | -        }  | 
257 |  | -
  | 
258 |  | -        <g  | 
259 |  | -          fill="currentColor"  | 
260 |  | -        >  | 
261 |  | -          <circle  | 
262 |  | -            class="c0"  | 
263 |  | -            cx="9"  | 
264 |  | -            cy="36"  | 
265 |  | -            r="9"  | 
266 |  | -            transform=""  | 
267 |  | -          />  | 
268 |  | -          <circle  | 
269 |  | -            class="c1"  | 
270 |  | -            cx="40"  | 
271 |  | -            cy="36"  | 
272 |  | -            r="9"  | 
273 |  | -            transform=""  | 
274 |  | -          />  | 
275 |  | -          <circle  | 
276 |  | -            class="c2"  | 
277 |  | -            cx="71"  | 
278 |  | -            cy="36"  | 
279 |  | -            r="9"  | 
280 |  | -            transform=""  | 
281 |  | -          />  | 
282 |  | -        </g>  | 
283 |  | -      `);  | 
284 |  | -    });  | 
285 |  | - | 
286 |  | -    it('updates animation after request animation frame with increased duration', () => {  | 
287 |  | -      const { container } = render(<Dots duration={1375} />);  | 
288 |  | - | 
289 |  | -      act(() => {  | 
290 |  | -        jest.runOnlyPendingTimers();  | 
291 |  | -      });  | 
292 |  | - | 
293 |  | -      expect(container.querySelector('g')).toMatchInlineSnapshot(`  | 
294 |  | -        .c0 {  | 
295 |  | -          animation: kVOdef 1375ms linear infinite;  | 
296 |  | -        }  | 
297 |  | -
  | 
298 |  | -        .c1 {  | 
299 |  | -          animation: idDvaf 1375ms linear infinite;  | 
300 |  | -        }  | 
301 |  | -
  | 
302 |  | -        .c2 {  | 
303 |  | -          animation: bDxIcz 1375ms linear infinite;  | 
304 |  | -        }  | 
305 |  | -
  | 
306 |  | -        <g  | 
307 |  | -          fill="currentColor"  | 
308 |  | -        >  | 
309 |  | -          <circle  | 
310 |  | -            class="c0"  | 
311 |  | -            cx="9"  | 
312 |  | -            cy="36"  | 
313 |  | -            r="9"  | 
314 |  | -            transform=""  | 
315 |  | -          />  | 
316 |  | -          <circle  | 
317 |  | -            class="c1"  | 
318 |  | -            cx="40"  | 
319 |  | -            cy="36"  | 
320 |  | -            r="9"  | 
321 |  | -            transform=""  | 
322 |  | -          />  | 
323 |  | -          <circle  | 
324 |  | -            class="c2"  | 
325 |  | -            cx="71"  | 
326 |  | -            cy="36"  | 
327 |  | -            r="9"  | 
328 |  | -            transform=""  | 
329 |  | -          />  | 
330 |  | -        </g>  | 
331 |  | -      `);  | 
332 |  | - | 
333 |  | -      act(() => {  | 
334 |  | -        // move time forward 1 second  | 
335 |  | -        mockDate.set(DEFAULT_DATE.setSeconds(2));  | 
336 |  | -        jest.mocked(requestAnimationFrame).mock.calls[0][0](0);  | 
337 |  | -      });  | 
338 |  | - | 
339 |  | -      expect(container.querySelector('g')).toMatchInlineSnapshot(`  | 
340 |  | -        .c0 {  | 
341 |  | -          animation: kVOdef 1375ms linear infinite;  | 
342 |  | -        }  | 
343 |  | -
  | 
344 |  | -        .c1 {  | 
345 |  | -          animation: idDvaf 1375ms linear infinite;  | 
346 |  | -        }  | 
347 |  | -
  | 
348 |  | -        .c2 {  | 
349 |  | -          animation: bDxIcz 1375ms linear infinite;  | 
350 |  | -        }  | 
351 |  | -
  | 
352 |  | -        <g  | 
353 |  | -          fill="currentColor"  | 
354 |  | -        >  | 
355 |  | -          <circle  | 
356 |  | -            class="c0"  | 
357 |  | -            cx="9"  | 
358 |  | -            cy="36"  | 
359 |  | -            r="9"  | 
360 |  | -            transform=""  | 
361 |  | -          />  | 
362 |  | -          <circle  | 
363 |  | -            class="c1"  | 
364 |  | -            cx="40"  | 
365 |  | -            cy="36"  | 
366 |  | -            r="9"  | 
367 |  | -            transform=""  | 
368 |  | -          />  | 
369 |  | -          <circle  | 
370 |  | -            class="c2"  | 
371 |  | -            cx="71"  | 
372 |  | -            cy="36"  | 
373 |  | -            r="9"  | 
374 |  | -            transform=""  | 
375 |  | -          />  | 
376 |  | -        </g>  | 
377 |  | -      `);  | 
378 |  | -    });  | 
 | 24 | +    expect(queryByTestId('dots')).toBeInTheDocument();  | 
 | 25 | +    expect(queryByTestId('dots')).toBeVisible();  | 
379 | 26 |   });  | 
380 | 27 | 
 
  | 
381 | 28 |   it('applies correct accessibility values', () => {  | 
 | 
0 commit comments