@instructure/ui-date-input 8.55.0 → 8.55.1-snapshot-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,69 +21,826 @@
21
21
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
22
  * SOFTWARE.
23
23
  */
24
- // import React from 'react'
25
- // import { render, screen, act } from '@testing-library/react'
26
-
24
+ import React from 'react'
25
+ import { fireEvent, render, screen, waitFor } from '@testing-library/react'
26
+ import userEvent from '@testing-library/user-event'
27
27
  import '@testing-library/jest-dom'
28
- // import DateInput from '../index'
28
+
29
+ // eslint-disable-next-line no-restricted-imports
30
+ import { generateA11yTests } from '@instructure/ui-scripts/lib/test/generateA11yTests'
31
+ import { runAxeCheck } from '@instructure/ui-axe-check'
32
+ import { Calendar } from '@instructure/ui-calendar'
33
+
34
+ import Examples from '../__examples__/DateInput.examples'
35
+ import { DateInput } from '../index'
29
36
 
30
37
  describe('<DateInput />', () => {
38
+ const weekdayLabels = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
39
+
40
+ const generateDays = (count = Calendar.DAY_COUNT) => {
41
+ const days = []
42
+ const date = new Date('2019-07-28')
43
+
44
+ while (days.length < count) {
45
+ days.push(
46
+ <Calendar.Day
47
+ key={date.toISOString()}
48
+ date={date.toISOString()}
49
+ label={date.toISOString()}
50
+ >
51
+ {date.getDate()}
52
+ </Calendar.Day>
53
+ )
54
+ date.setDate(date.getDate() + 1)
55
+ }
56
+
57
+ return days
58
+ }
59
+
60
+ it('should render an input and a calendar', async () => {
61
+ const { container, findByRole } = render(
62
+ <DateInput
63
+ renderLabel="date-input"
64
+ renderWeekdayLabels={weekdayLabels}
65
+ isShowingCalendar
66
+ >
67
+ {generateDays()}
68
+ </DateInput>
69
+ )
70
+ const dateInput = container.querySelector('input')
71
+
72
+ expect(dateInput).toBeInTheDocument()
73
+ expect(dateInput).toHaveAttribute('type', 'text')
74
+
75
+ await userEvent.click(dateInput!)
76
+ const calendarTable = await findByRole('listbox')
77
+ const calendarWrapper = await document.querySelector(
78
+ '[id^="Selectable_"][id$="-list"]'
79
+ )
80
+
81
+ await waitFor(() => {
82
+ expect(calendarWrapper).toBeInTheDocument()
83
+ expect(calendarTable).toBeInTheDocument()
84
+ })
85
+ })
86
+
87
+ describe('input', () => {
88
+ it('should render a label', () => {
89
+ const labelText = 'label text'
90
+
91
+ render(
92
+ <DateInput renderLabel={labelText} renderWeekdayLabels={weekdayLabels}>
93
+ {generateDays()}
94
+ </DateInput>
95
+ )
96
+ const dateInput = screen.getByLabelText('label text')
97
+
98
+ expect(dateInput).toBeInTheDocument()
99
+ })
100
+
101
+ it('should set value', () => {
102
+ const value = 'January 5'
103
+
104
+ render(
105
+ <DateInput
106
+ renderLabel="Choose date"
107
+ value={value}
108
+ onChange={jest.fn()}
109
+ renderWeekdayLabels={weekdayLabels}
110
+ >
111
+ {generateDays()}
112
+ </DateInput>
113
+ )
114
+ const dateInput = screen.getByLabelText('Choose date')
115
+
116
+ expect(dateInput).toHaveValue(value)
117
+ })
118
+
119
+ it('should call onChange with the updated value', async () => {
120
+ const onChange = jest.fn()
121
+ const value = 'May 18, 2022'
122
+
123
+ render(
124
+ <DateInput
125
+ renderLabel="Choose date"
126
+ renderWeekdayLabels={weekdayLabels}
127
+ onChange={onChange}
128
+ >
129
+ {generateDays()}
130
+ </DateInput>
131
+ )
132
+ const dateInput = screen.getByLabelText('Choose date')
133
+
134
+ fireEvent.change(dateInput, { target: { value: value } })
135
+ fireEvent.keyDown(dateInput, { key: 'Enter', code: 'Enter' })
136
+ fireEvent.blur(dateInput)
137
+
138
+ await waitFor(() => {
139
+ expect(onChange).toHaveBeenCalledTimes(1)
140
+ expect(onChange.mock.calls[0][1].value).toEqual(
141
+ expect.stringContaining(value)
142
+ )
143
+ })
144
+ })
145
+
146
+ it('should call onBlur', () => {
147
+ const onBlur = jest.fn()
148
+
149
+ render(
150
+ <DateInput
151
+ renderLabel="Choose date"
152
+ renderWeekdayLabels={weekdayLabels}
153
+ onBlur={onBlur}
154
+ >
155
+ {generateDays()}
156
+ </DateInput>
157
+ )
158
+ const dateInput = screen.getByLabelText('Choose date')
159
+
160
+ fireEvent.blur(dateInput)
161
+
162
+ expect(onBlur).toHaveBeenCalledTimes(1)
163
+ })
164
+
165
+ it('should correctly set interaction type', async () => {
166
+ const { rerender } = render(
167
+ <DateInput
168
+ renderLabel="Choose date"
169
+ renderWeekdayLabels={weekdayLabels}
170
+ interaction="disabled"
171
+ >
172
+ {generateDays()}
173
+ </DateInput>
174
+ )
175
+ const dateInput = screen.getByLabelText('Choose date')
176
+ expect(dateInput).toHaveAttribute('disabled')
177
+
178
+ rerender(
179
+ <DateInput
180
+ renderLabel="Choose date"
181
+ renderWeekdayLabels={weekdayLabels}
182
+ interaction="readonly"
183
+ >
184
+ {generateDays()}
185
+ </DateInput>
186
+ )
187
+
188
+ const dateInputAfterUpdate = screen.getByLabelText('Choose date')
189
+
190
+ await waitFor(() => {
191
+ expect(dateInputAfterUpdate).toHaveAttribute('readonly')
192
+ })
193
+ })
194
+
195
+ it('should correctly set disabled', () => {
196
+ render(
197
+ <DateInput
198
+ renderLabel="Choose date"
199
+ renderWeekdayLabels={weekdayLabels}
200
+ disabled
201
+ >
202
+ {generateDays()}
203
+ </DateInput>
204
+ )
205
+
206
+ const dateInput = screen.getByLabelText('Choose date')
207
+
208
+ expect(dateInput).toHaveAttribute('disabled')
209
+ })
210
+
211
+ it('should correctly set readOnly', () => {
212
+ render(
213
+ <DateInput
214
+ renderLabel="Choose date"
215
+ renderWeekdayLabels={weekdayLabels}
216
+ readOnly
217
+ >
218
+ {generateDays()}
219
+ </DateInput>
220
+ )
221
+
222
+ const dateInput = screen.getByLabelText('Choose date')
223
+
224
+ expect(dateInput).toHaveAttribute('readOnly')
225
+ })
226
+
227
+ it('should set placeholder', () => {
228
+ const placeholder = 'Start typing to choose a date'
229
+
230
+ render(
231
+ <DateInput
232
+ renderLabel="Choose date"
233
+ renderWeekdayLabels={weekdayLabels}
234
+ placeholder={placeholder}
235
+ >
236
+ {generateDays()}
237
+ </DateInput>
238
+ )
239
+ const dateInput = screen.getByLabelText('Choose date')
240
+
241
+ expect(dateInput).toHaveAttribute('placeholder', placeholder)
242
+ })
243
+
244
+ it('should be requireable', () => {
245
+ render(
246
+ <DateInput
247
+ renderLabel="Choose date"
248
+ renderWeekdayLabels={weekdayLabels}
249
+ isRequired
250
+ >
251
+ {generateDays()}
252
+ </DateInput>
253
+ )
254
+ const dateInput = screen.getByLabelText('Choose date')
255
+
256
+ expect(dateInput).toHaveAttribute('required')
257
+ })
258
+
259
+ it('should provide inputRef', () => {
260
+ const inputRef = jest.fn()
261
+
262
+ render(
263
+ <DateInput
264
+ renderLabel="Choose date"
265
+ renderWeekdayLabels={weekdayLabels}
266
+ inputRef={inputRef}
267
+ >
268
+ {generateDays()}
269
+ </DateInput>
270
+ )
271
+ const dateInput = screen.getByLabelText('Choose date')
272
+
273
+ expect(inputRef).toHaveBeenCalledWith(dateInput)
274
+ })
275
+
276
+ it('should render messages', () => {
277
+ const text = 'The selected date is invalid'
278
+
279
+ const { container } = render(
280
+ <DateInput
281
+ renderLabel="Choose date"
282
+ renderWeekdayLabels={weekdayLabels}
283
+ messages={[{ type: 'error', text }]}
284
+ >
285
+ {generateDays()}
286
+ </DateInput>
287
+ )
288
+
289
+ expect(container).toHaveTextContent(text)
290
+ })
291
+
292
+ it('should allow custom props to pass through', () => {
293
+ render(
294
+ <DateInput
295
+ renderLabel="Choose date"
296
+ renderWeekdayLabels={weekdayLabels}
297
+ data-custom-attr="custom value"
298
+ name="my name"
299
+ >
300
+ {generateDays()}
301
+ </DateInput>
302
+ )
303
+ const dateInput = screen.getByLabelText('Choose date')
304
+
305
+ expect(dateInput).toHaveAttribute('data-custom-attr', 'custom value')
306
+ expect(dateInput).toHaveAttribute('name', 'my name')
307
+ })
308
+ })
309
+
310
+ describe('Calendar', () => {
311
+ it('should show calendar when `isShowingCalendar` is set', async () => {
312
+ const { rerender, queryByRole } = render(
313
+ <DateInput
314
+ renderLabel="Choose date"
315
+ renderWeekdayLabels={weekdayLabels}
316
+ >
317
+ {generateDays()}
318
+ </DateInput>
319
+ )
320
+ const dateInput = screen.getByLabelText('Choose date')
321
+ const calendarTable = await queryByRole('listbox')
322
+ const calendarWrapper = await document.querySelector(
323
+ '[id^="Selectable_"][id$="-list"]'
324
+ )
325
+
326
+ expect(dateInput).toBeInTheDocument()
327
+ expect(calendarTable).not.toBeInTheDocument()
328
+ expect(calendarWrapper).not.toBeInTheDocument()
329
+
330
+ rerender(
331
+ <DateInput
332
+ renderLabel="Choose date"
333
+ renderWeekdayLabels={weekdayLabels}
334
+ isShowingCalendar
335
+ >
336
+ {generateDays()}
337
+ </DateInput>
338
+ )
339
+ const dateInputAfterUpdate = screen.getByLabelText('Choose date')
340
+ const calendarTableAfterUpdate = await queryByRole('listbox')
341
+ const calendarWrapperAfterUpdate = await document.querySelector(
342
+ '[id^="Selectable_"][id$="-list"]'
343
+ )
344
+
345
+ await waitFor(() => {
346
+ expect(dateInputAfterUpdate).toBeInTheDocument()
347
+ expect(calendarTableAfterUpdate).toBeInTheDocument()
348
+ expect(calendarWrapperAfterUpdate).toBeInTheDocument()
349
+ })
350
+ })
351
+
352
+ describe('onRequestShowCalendar', () => {
353
+ it('should call onRequestShowCalendar when label is clicked', async () => {
354
+ const onRequestShowCalendar = jest.fn()
355
+
356
+ const { container } = render(
357
+ <DateInput
358
+ renderLabel="Choose date"
359
+ renderWeekdayLabels={weekdayLabels}
360
+ onRequestShowCalendar={onRequestShowCalendar}
361
+ >
362
+ {generateDays()}
363
+ </DateInput>
364
+ )
365
+ const dateInput = container.querySelector("[class$='-formFieldLabel']")
366
+
367
+ expect(dateInput).toHaveTextContent('Choose date')
368
+
369
+ await userEvent.click(dateInput!)
370
+
371
+ await waitFor(() => {
372
+ expect(onRequestShowCalendar).toHaveBeenCalled()
373
+ })
374
+ })
375
+
376
+ it('should call onRequestShowCalendar when input is clicked', async () => {
377
+ const onRequestShowCalendar = jest.fn()
378
+
379
+ const { container } = render(
380
+ <DateInput
381
+ renderLabel="Choose date"
382
+ renderWeekdayLabels={weekdayLabels}
383
+ onRequestShowCalendar={onRequestShowCalendar}
384
+ >
385
+ {generateDays()}
386
+ </DateInput>
387
+ )
388
+ const dateInput = container.querySelector('input')
389
+
390
+ await userEvent.click(dateInput!)
391
+
392
+ await waitFor(() => {
393
+ expect(onRequestShowCalendar).toHaveBeenCalledTimes(1)
394
+ })
395
+ })
396
+
397
+ it('should call onRequestShowCalendar when input receives space event', async () => {
398
+ const onRequestShowCalendar = jest.fn()
399
+
400
+ render(
401
+ <DateInput
402
+ renderLabel="Choose date"
403
+ renderWeekdayLabels={weekdayLabels}
404
+ onRequestShowCalendar={onRequestShowCalendar}
405
+ >
406
+ {generateDays()}
407
+ </DateInput>
408
+ )
409
+ const dateInput = screen.getByLabelText('Choose date')
410
+
411
+ await userEvent.type(dateInput, '{space}')
412
+
413
+ await waitFor(() => {
414
+ expect(onRequestShowCalendar).toHaveBeenCalledTimes(1)
415
+ })
416
+ })
417
+
418
+ it('should not call onRequestShowCalendar when input receives space event if calendar is already showing', async () => {
419
+ const onRequestShowCalendar = jest.fn()
420
+
421
+ render(
422
+ <DateInput
423
+ renderLabel="Choose date"
424
+ renderWeekdayLabels={weekdayLabels}
425
+ onRequestShowCalendar={onRequestShowCalendar}
426
+ isShowingCalendar
427
+ >
428
+ {generateDays()}
429
+ </DateInput>
430
+ )
431
+ const dateInput = screen.getByLabelText('Choose date')
432
+
433
+ await userEvent.type(dateInput, '{space}')
434
+
435
+ await waitFor(() => {
436
+ expect(onRequestShowCalendar).not.toHaveBeenCalled()
437
+ })
438
+ })
439
+
440
+ it('should call onRequestShowCalendar when input receives down arrow event', async () => {
441
+ const onRequestShowCalendar = jest.fn()
442
+
443
+ render(
444
+ <DateInput
445
+ renderLabel="Choose date"
446
+ renderWeekdayLabels={weekdayLabels}
447
+ onRequestShowCalendar={onRequestShowCalendar}
448
+ >
449
+ {generateDays()}
450
+ </DateInput>
451
+ )
452
+ const dateInput = screen.getByLabelText('Choose date')
453
+
454
+ await userEvent.type(dateInput, '{arrowdown}')
455
+
456
+ await waitFor(() => {
457
+ expect(onRequestShowCalendar).toHaveBeenCalledTimes(1)
458
+ })
459
+ })
460
+
461
+ it('should not call onRequestShowCalendar when input receives down arrow event if calendar is already showing', async () => {
462
+ const onRequestShowCalendar = jest.fn()
463
+
464
+ render(
465
+ <DateInput
466
+ renderLabel="Choose date"
467
+ renderWeekdayLabels={weekdayLabels}
468
+ onRequestShowCalendar={onRequestShowCalendar}
469
+ isShowingCalendar
470
+ >
471
+ {generateDays()}
472
+ </DateInput>
473
+ )
474
+ const dateInput = screen.getByLabelText('Choose date')
475
+
476
+ await userEvent.type(dateInput, '{arrowdown}')
477
+
478
+ await waitFor(() => {
479
+ expect(onRequestShowCalendar).not.toHaveBeenCalled()
480
+ })
481
+ })
482
+
483
+ it('should call onRequestShowCalendar when input receives up arrow event', async () => {
484
+ const onRequestShowCalendar = jest.fn()
485
+
486
+ render(
487
+ <DateInput
488
+ renderLabel="Choose date"
489
+ renderWeekdayLabels={weekdayLabels}
490
+ onRequestShowCalendar={onRequestShowCalendar}
491
+ >
492
+ {generateDays()}
493
+ </DateInput>
494
+ )
495
+ const dateInput = screen.getByLabelText('Choose date')
496
+
497
+ await userEvent.type(dateInput, '{arrowup}')
498
+
499
+ await waitFor(() => {
500
+ expect(onRequestShowCalendar).toHaveBeenCalledTimes(1)
501
+ })
502
+ })
503
+
504
+ it('should not call onRequestShowCalendar when input receives up arrow event if calendar is already showing', async () => {
505
+ const onRequestShowCalendar = jest.fn()
506
+
507
+ render(
508
+ <DateInput
509
+ renderLabel="Choose date"
510
+ renderWeekdayLabels={weekdayLabels}
511
+ onRequestShowCalendar={onRequestShowCalendar}
512
+ isShowingCalendar
513
+ >
514
+ {generateDays()}
515
+ </DateInput>
516
+ )
517
+ const dateInput = screen.getByLabelText('Choose date')
518
+
519
+ await userEvent.type(dateInput, '{arrowup}')
520
+
521
+ await waitFor(() => {
522
+ expect(onRequestShowCalendar).not.toHaveBeenCalled()
523
+ })
524
+ })
525
+
526
+ it('should call onRequestShowCalendar when input receives onChange event', async () => {
527
+ const onRequestShowCalendar = jest.fn()
528
+
529
+ render(
530
+ <DateInput
531
+ renderLabel="Choose date"
532
+ renderWeekdayLabels={weekdayLabels}
533
+ onRequestShowCalendar={onRequestShowCalendar}
534
+ >
535
+ {generateDays()}
536
+ </DateInput>
537
+ )
538
+ const dateInput = screen.getByLabelText('Choose date')
539
+
540
+ fireEvent.change(dateInput, { target: { value: 'January 5' } })
541
+
542
+ await waitFor(() => {
543
+ expect(onRequestShowCalendar).toHaveBeenCalledTimes(1)
544
+ })
545
+ })
546
+
547
+ it('should not call onRequestShowCalendar when disabled', async () => {
548
+ const onRequestShowCalendar = jest.fn()
549
+
550
+ render(
551
+ <DateInput
552
+ renderLabel="Choose date"
553
+ renderWeekdayLabels={weekdayLabels}
554
+ onRequestShowCalendar={onRequestShowCalendar}
555
+ interaction="disabled"
556
+ >
557
+ {generateDays()}
558
+ </DateInput>
559
+ )
560
+ const dateInput = screen.getByLabelText('Choose date')
561
+
562
+ fireEvent.click(dateInput)
563
+
564
+ await userEvent.type(
565
+ dateInput,
566
+ '{arrowup}{arrowdown}{space}January 5',
567
+ { skipClick: true }
568
+ )
569
+
570
+ await waitFor(() => {
571
+ expect(onRequestShowCalendar).not.toHaveBeenCalled()
572
+ })
573
+ })
574
+ })
575
+
576
+ describe('onRequestHideCalendar and onRequestValidateDate', () => {
577
+ it('should call onRequestHideCalendar and onRequestValidateDate input receives onBlur event', async () => {
578
+ const onRequestHideCalendar = jest.fn()
579
+ const onRequestValidateDate = jest.fn()
580
+
581
+ render(
582
+ <DateInput
583
+ renderLabel="Choose date"
584
+ renderWeekdayLabels={weekdayLabels}
585
+ onRequestHideCalendar={onRequestHideCalendar}
586
+ onRequestValidateDate={onRequestValidateDate}
587
+ isShowingCalendar
588
+ >
589
+ {generateDays()}
590
+ </DateInput>
591
+ )
592
+ const dateInput = screen.getByLabelText('Choose date')
593
+
594
+ fireEvent.blur(dateInput)
595
+
596
+ await waitFor(() => {
597
+ expect(onRequestHideCalendar).toHaveBeenCalledTimes(1)
598
+ expect(onRequestValidateDate).toHaveBeenCalledTimes(1)
599
+ })
600
+ })
601
+
602
+ it('should call onRequestHideCalendar and onRequestValidateDate when input receives esc event', async () => {
603
+ const onRequestHideCalendar = jest.fn()
604
+ const onRequestValidateDate = jest.fn()
605
+
606
+ render(
607
+ <DateInput
608
+ renderLabel="Choose date"
609
+ renderWeekdayLabels={weekdayLabels}
610
+ onRequestHideCalendar={onRequestHideCalendar}
611
+ onRequestValidateDate={onRequestValidateDate}
612
+ isShowingCalendar
613
+ >
614
+ {generateDays()}
615
+ </DateInput>
616
+ )
617
+ const dateInput = screen.getByLabelText('Choose date')
618
+
619
+ await userEvent.type(dateInput, '{esc}')
620
+
621
+ await waitFor(() => {
622
+ expect(onRequestHideCalendar).toHaveBeenCalledTimes(1)
623
+ expect(onRequestValidateDate).toHaveBeenCalledTimes(1)
624
+ })
625
+ })
626
+
627
+ it('should call onRequestHideCalendar and onRequestValidateDate when input receives enter event', async () => {
628
+ const onRequestHideCalendar = jest.fn()
629
+ const onRequestValidateDate = jest.fn()
630
+
631
+ const days = generateDays()
632
+ days[4] = (
633
+ <Calendar.Day key="4" label="4" date="2019-09-28" isSelected>
634
+ {4}
635
+ </Calendar.Day>
636
+ )
637
+
638
+ render(
639
+ <DateInput
640
+ renderLabel="Choose date"
641
+ renderWeekdayLabels={weekdayLabels}
642
+ onRequestHideCalendar={onRequestHideCalendar}
643
+ onRequestValidateDate={onRequestValidateDate}
644
+ isShowingCalendar
645
+ >
646
+ {days}
647
+ </DateInput>
648
+ )
649
+ const dateInput = screen.getByLabelText('Choose date')
650
+
651
+ await userEvent.type(dateInput, '{enter}')
652
+
653
+ await waitFor(() => {
654
+ expect(onRequestHideCalendar).toHaveBeenCalledTimes(1)
655
+ expect(onRequestValidateDate).toHaveBeenCalledTimes(1)
656
+ })
657
+ })
658
+ })
659
+
660
+ it('should render calendar navigation label', () => {
661
+ const label = 'January 2019'
662
+
663
+ render(
664
+ <DateInput
665
+ renderLabel="Choose date"
666
+ renderWeekdayLabels={weekdayLabels}
667
+ renderNavigationLabel={<div data-testId="label-id">{label}</div>}
668
+ isShowingCalendar
669
+ >
670
+ {generateDays()}
671
+ </DateInput>
672
+ )
673
+ const navigationLabel = screen.getByTestId('label-id')
674
+
675
+ expect(navigationLabel).toBeInTheDocument()
676
+ expect(navigationLabel).toHaveTextContent(label)
677
+ })
678
+
679
+ it('should render calendar weekday labels', async () => {
680
+ render(
681
+ <DateInput
682
+ renderLabel="Choose date"
683
+ renderWeekdayLabels={weekdayLabels}
684
+ isShowingCalendar
685
+ >
686
+ {generateDays()}
687
+ </DateInput>
688
+ )
689
+ const calendar = await screen.findByRole('listbox')
690
+ const headers = calendar.querySelectorAll('th')
691
+
692
+ expect(headers.length).toEqual(7)
693
+
694
+ weekdayLabels.forEach((label) => {
695
+ expect(calendar).toHaveTextContent(label)
696
+ })
697
+ })
698
+
699
+ it('should render all focusable elements in calendar with tabIndex="-1"', async () => {
700
+ render(
701
+ <DateInput
702
+ renderLabel="Choose date"
703
+ renderWeekdayLabels={weekdayLabels}
704
+ renderNextMonthButton={
705
+ <button data-testId="button-next">next</button>
706
+ }
707
+ renderPrevMonthButton={
708
+ <button data-testId="button-prev">prev</button>
709
+ }
710
+ isShowingCalendar
711
+ >
712
+ {generateDays()}
713
+ </DateInput>
714
+ )
715
+ const calendar = await screen.findByRole('listbox')
716
+ const calendarDays = calendar.querySelectorAll('button')
717
+ const nextMonthButton = screen.getByTestId('button-next')
718
+ const prevMonthButton = screen.getByTestId('button-prev')
719
+
720
+ expect(nextMonthButton).toHaveAttribute('tabIndex', '-1')
721
+ expect(prevMonthButton).toHaveAttribute('tabIndex', '-1')
722
+ expect(calendarDays).toHaveLength(42)
723
+
724
+ calendarDays.forEach((day) => {
725
+ expect(day).toHaveAttribute('tabIndex', '-1')
726
+ })
727
+ })
728
+
729
+ it('should render days with the correct role', async () => {
730
+ const days = generateDays()
731
+ days[5] = (
732
+ <Calendar.Day key="5" label="5" date="2019-09-28" id="5" isOutsideMonth>
733
+ outside
734
+ </Calendar.Day>
735
+ )
736
+
737
+ render(
738
+ <DateInput
739
+ renderLabel="Choose date"
740
+ renderWeekdayLabels={weekdayLabels}
741
+ isShowingCalendar
742
+ >
743
+ {days}
744
+ </DateInput>
745
+ )
746
+ const calendar = await screen.findByRole('listbox')
747
+ const calendarDays = calendar.querySelectorAll('button')
748
+
749
+ calendarDays.forEach((day) => {
750
+ if (day.textContent!.includes('outside')) {
751
+ expect(day).toHaveAttribute('role', 'presentation')
752
+ } else {
753
+ expect(day).toHaveAttribute('role', 'option')
754
+ }
755
+ })
756
+ })
757
+
758
+ it('should assign aria-selected to the selected date and link it to the input', async () => {
759
+ const days = generateDays()
760
+ days[7] = (
761
+ <Calendar.Day
762
+ key="7"
763
+ label="7"
764
+ date="2019-09-28"
765
+ id="selected-day-id"
766
+ isSelected
767
+ >
768
+ selected
769
+ </Calendar.Day>
770
+ )
771
+
772
+ render(
773
+ <DateInput
774
+ renderLabel="Choose date"
775
+ renderWeekdayLabels={weekdayLabels}
776
+ isShowingCalendar
777
+ >
778
+ {days}
779
+ </DateInput>
780
+ )
781
+ const calendar = await screen.findByRole('listbox')
782
+ const calendarDays = calendar.querySelectorAll('button')
783
+ let selectedDayID = ''
784
+
785
+ calendarDays.forEach((day) => {
786
+ if (day.textContent!.includes('selected')) {
787
+ selectedDayID = day.id
788
+ expect(day).toHaveAttribute('aria-selected', 'true')
789
+ } else {
790
+ expect(day).toHaveAttribute('aria-selected', 'false')
791
+ }
792
+ })
793
+
794
+ const dateInput = screen.getByLabelText('Choose date')
795
+ expect(dateInput).toHaveAttribute('aria-activedescendant', selectedDayID)
796
+ })
797
+ })
798
+
799
+ describe('with generated examples', () => {
800
+ const generatedComponents = generateA11yTests(DateInput, Examples)
801
+
802
+ it.each(generatedComponents)(
803
+ 'should be accessible with example: $description',
804
+ async ({ content }) => {
805
+ const { container } = render(content)
806
+ const axeCheck = await runAxeCheck(container)
807
+ expect(axeCheck).toBe(true)
808
+ }
809
+ )
810
+ })
811
+
31
812
  describe('with minimal config', () => {
32
- it('should be a placeholer', () => {
33
- expect(1 + 1).toEqual(2)
34
- })
35
- // TODO find out why timeouts
36
- // it('should render 44 buttons (a calendar) when clicked', async () => {
37
- // const onChange = jest.fn()
38
- // render(
39
- // <DateInput
40
- // renderLabel="Choose a date"
41
- // assistiveText="Type a date or use arrow keys to navigate date picker."
42
- // width="20rem"
43
- // isInline
44
- // value={'2023-11-23'}
45
- // onChange={onChange}
46
- // currentDate="2023-12-23"
47
- // disabledDates={['2023-12-22', '2023-12-12', '2023-12-11']}
48
- // disabledDateErrorMessage="disabled date"
49
- // invalidDateErrorMessage="invalid date"
50
- // ></DateInput>
51
- // )
52
- // const inputField = screen.queryByRole('combobox')
53
- // await act(async () => {
54
- // await inputField?.click()
55
- // })
56
- // const buttons = document.getElementsByTagName('button')
57
- // expect(buttons.length).toEqual(44)
58
- // })
59
- // it('should select the correct day on Calendar when value is set', async () => {
60
- // const onChange = jest.fn()
61
- // render(
62
- // <DateInput
63
- // renderLabel="Choose a date"
64
- // assistiveText="Type a date or use arrow keys to navigate date picker."
65
- // width="20rem"
66
- // isInline
67
- // value={'2023-11-23'}
68
- // onChange={onChange}
69
- // currentDate="2023-11-25"
70
- // disabledDates={['2023-12-22', '2023-12-12', '2023-12-11']}
71
- // disabledDateErrorMessage="disabled date"
72
- // invalidDateErrorMessage="invalid date"
73
- // ></DateInput>
74
- // )
75
- // const inputField = screen.queryByRole('combobox')
76
- // await act(async () => {
77
- // await inputField?.click()
78
- // })
79
- // const selectedDay =
80
- // screen.queryByText('23 November 2023')?.parentElement?.parentElement
81
- // expect(selectedDay).toBeDefined()
82
- // if (selectedDay) {
83
- // expect(window.getComputedStyle(selectedDay)?.background).toBe(
84
- // 'rgb(11, 135, 75)'
85
- // )
86
- // }
87
- // })
813
+ it('should render 44 buttons (a calendar) when clicked', async () => {
814
+ const onChange = jest.fn()
815
+ render(
816
+ <DateInput
817
+ renderLabel="Choose date"
818
+ assistiveText="Type a date or use arrow keys to navigate date picker."
819
+ width="20rem"
820
+ isInline
821
+ value={'2023-11-23'}
822
+ onChange={onChange}
823
+ currentDate="2023-12-23"
824
+ disabledDates={['2023-12-22', '2023-12-12', '2023-12-11']}
825
+ disabledDateErrorMessage="disabled date"
826
+ invalidDateErrorMessage="invalid date"
827
+ ></DateInput>
828
+ )
829
+ const dateInput = screen.getByLabelText('Choose date')
830
+
831
+ fireEvent.click(dateInput)
832
+
833
+ const calendarTable = document.querySelector('table')
834
+ const calendarDays = calendarTable!.querySelectorAll('button')
835
+ const calendarWrapper = document.querySelector(
836
+ '[id^="Selectable_"][id$="-list"]'
837
+ )
838
+ const calendarButtons = calendarWrapper!.querySelectorAll('button')
839
+
840
+ await waitFor(() => {
841
+ expect(calendarButtons).toHaveLength(44)
842
+ expect(calendarDays).toHaveLength(42)
843
+ })
844
+ })
88
845
  })
89
846
  })