1
1
import React , { act } from 'react' ;
2
- import { fireEvent , render , screen } from '@testing-library/react' ;
2
+ import { fireEvent , render , screen , waitFor } from '@testing-library/react' ;
3
3
import { MockedProvider } from '@apollo/react-testing' ;
4
4
import { I18nextProvider } from 'react-i18next' ;
5
5
@@ -19,35 +19,51 @@ import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
19
19
import { ThemeProvider } from 'react-bootstrap' ;
20
20
import { createTheme } from '@mui/material' ;
21
21
import useLocalStorage from 'utils/useLocalstorage' ;
22
+ import { vi } from 'vitest' ;
22
23
23
- const { setItem, getItem } = useLocalStorage ( ) ;
24
+ /**
25
+ * Unit tests for the Events component.
26
+ *
27
+ * This file contains tests to verify the functionality and behavior of the Events component
28
+ * under various scenarios, including successful event creation, date/time picker handling,
29
+ * calendar view toggling, and error handling. Mocked dependencies are used to ensure isolated testing.
30
+ */
24
31
25
- jest . mock ( 'react-toastify' , ( ) => ( {
32
+ const { setItem } = useLocalStorage ( ) ;
33
+
34
+ vi . mock ( 'react-toastify' , ( ) => ( {
26
35
toast : {
27
- error : jest . fn ( ) ,
28
- info : jest . fn ( ) ,
29
- success : jest . fn ( ) ,
36
+ error : vi . fn ( ) ,
37
+ info : vi . fn ( ) ,
38
+ success : vi . fn ( ) ,
30
39
} ,
31
40
} ) ) ;
32
41
33
- jest . mock ( '@mui/x-date-pickers/DatePicker' , ( ) => {
42
+ vi . mock ( '@mui/x-date-pickers/DatePicker' , async ( ) => {
43
+ const desktopDatePickerModule = await vi . importActual (
44
+ '@mui/x-date-pickers/DesktopDatePicker' ,
45
+ ) ;
34
46
return {
35
- DatePicker : jest . requireActual ( '@mui/x-date-pickers/DesktopDatePicker' )
36
- . DesktopDatePicker ,
47
+ DatePicker : desktopDatePickerModule . DesktopDatePicker ,
37
48
} ;
38
49
} ) ;
39
50
40
- jest . mock ( '@mui/x-date-pickers/TimePicker' , ( ) => {
51
+ vi . mock ( '@mui/x-date-pickers/TimePicker' , async ( ) => {
52
+ const timePickerModule = await vi . importActual (
53
+ '@mui/x-date-pickers/DesktopTimePicker' ,
54
+ ) ;
41
55
return {
42
- TimePicker : jest . requireActual ( '@mui/x-date-pickers/DesktopTimePicker' )
43
- . DesktopTimePicker ,
56
+ TimePicker : timePickerModule . DesktopTimePicker ,
44
57
} ;
45
58
} ) ;
46
59
47
- jest . mock ( 'react-router-dom' , ( ) => ( {
48
- ...jest . requireActual ( 'react-router-dom' ) ,
49
- useParams : ( ) => ( { orgId : '' } ) ,
50
- } ) ) ;
60
+ vi . mock ( 'react-router-dom' , async ( ) => {
61
+ const actual = await vi . importActual ( 'react-router-dom' ) ;
62
+ return {
63
+ ...actual ,
64
+ useParams : ( ) => ( { orgId : '' } ) ,
65
+ } ;
66
+ } ) ;
51
67
52
68
const theme = createTheme ( {
53
69
palette : {
@@ -252,19 +268,19 @@ async function wait(ms = 100): Promise<void> {
252
268
describe ( 'Testing Events Screen [User Portal]' , ( ) => {
253
269
Object . defineProperty ( window , 'matchMedia' , {
254
270
writable : true ,
255
- value : jest . fn ( ) . mockImplementation ( ( query ) => ( {
271
+ value : vi . fn ( ) . mockImplementation ( ( query ) => ( {
256
272
matches : false ,
257
273
media : query ,
258
274
onchange : null ,
259
- addListener : jest . fn ( ) , // Deprecated
260
- removeListener : jest . fn ( ) , // Deprecated
261
- addEventListener : jest . fn ( ) ,
262
- removeEventListener : jest . fn ( ) ,
263
- dispatchEvent : jest . fn ( ) ,
275
+ addListener : vi . fn ( ) , // Deprecated
276
+ removeListener : vi . fn ( ) , // Deprecated
277
+ addEventListener : vi . fn ( ) ,
278
+ removeEventListener : vi . fn ( ) ,
279
+ dispatchEvent : vi . fn ( ) ,
264
280
} ) ) ,
265
281
} ) ;
266
282
267
- test ( 'Screen should be rendered properly' , async ( ) => {
283
+ it ( 'Screen should be rendered properly' , async ( ) => {
268
284
render (
269
285
< MockedProvider addTypename = { false } link = { link } >
270
286
< BrowserRouter >
@@ -283,7 +299,7 @@ describe('Testing Events Screen [User Portal]', () => {
283
299
await wait ( ) ;
284
300
} ) ;
285
301
286
- test ( 'Create event works as expected when event is not an all day event.' , async ( ) => {
302
+ it ( 'Create event works as expected when event is not an all day event.' , async ( ) => {
287
303
render (
288
304
< MockedProvider addTypename = { false } link = { link } >
289
305
< BrowserRouter >
@@ -341,7 +357,7 @@ describe('Testing Events Screen [User Portal]', () => {
341
357
) ;
342
358
} ) ;
343
359
344
- test ( 'Create event works as expected when event is an all day event.' , async ( ) => {
360
+ it ( 'Create event works as expected when event is an all day event.' , async ( ) => {
345
361
render (
346
362
< MockedProvider addTypename = { false } link = { link } >
347
363
< BrowserRouter >
@@ -384,7 +400,7 @@ describe('Testing Events Screen [User Portal]', () => {
384
400
) ;
385
401
} ) ;
386
402
387
- test ( 'Switch to calendar view works as expected.' , async ( ) => {
403
+ it ( 'Switch to calendar view works as expected.' , async ( ) => {
388
404
render (
389
405
< MockedProvider addTypename = { false } link = { link } >
390
406
< BrowserRouter >
@@ -413,7 +429,7 @@ describe('Testing Events Screen [User Portal]', () => {
413
429
expect ( screen . getByText ( 'Sun' ) ) . toBeInTheDocument ( ) ;
414
430
} ) ;
415
431
416
- test ( 'Testing DatePicker and TimePicker' , async ( ) => {
432
+ it ( 'Testing DatePicker and TimePicker' , async ( ) => {
417
433
render (
418
434
< MockedProvider addTypename = { false } link = { link } >
419
435
< BrowserRouter >
@@ -430,31 +446,39 @@ describe('Testing Events Screen [User Portal]', () => {
430
446
</ MockedProvider > ,
431
447
) ;
432
448
433
- await wait ( ) ;
434
-
435
- const startDate = '03/23/2024' ;
436
- const endDate = '04/23/2024' ;
437
- const startTime = '02:00 PM' ;
438
- const endTime = '06:00 PM' ;
439
-
440
449
userEvent . click ( screen . getByTestId ( 'createEventModalBtn' ) ) ;
450
+ // MM/DD/YYYY
451
+ const startDate = new Date ( ) ;
452
+ const endDate = new Date ( ) ;
453
+ const startTime = '08:00 AM' ;
454
+ const endTime = '10:00 AM' ;
455
+
456
+ await waitFor ( ( ) => {
457
+ expect ( screen . getByLabelText ( 'Start Date' ) ) . toBeInTheDocument ( ) ;
458
+ expect ( screen . getByLabelText ( 'End Date' ) ) . toBeInTheDocument ( ) ;
459
+ } ) ;
441
460
442
461
expect ( endDate ) . not . toBeNull ( ) ;
443
462
const endDateDatePicker = screen . getByLabelText ( 'End Date' ) ;
444
463
expect ( startDate ) . not . toBeNull ( ) ;
445
464
const startDateDatePicker = screen . getByLabelText ( 'Start Date' ) ;
446
465
466
+ const startDateDayjs = dayjs ( startDate ) ;
467
+ const endDateDayjs = dayjs ( endDate ) ;
468
+
447
469
fireEvent . change ( startDateDatePicker , {
448
- target : { value : startDate } ,
470
+ target : { value : startDateDayjs . format ( 'MM/DD/YYYY' ) } ,
449
471
} ) ;
450
472
fireEvent . change ( endDateDatePicker , {
451
- target : { value : endDate } ,
473
+ target : { value : endDateDayjs . format ( 'MM/DD/YYYY' ) } ,
452
474
} ) ;
453
475
454
- await wait ( ) ;
455
-
456
- expect ( endDateDatePicker ) . toHaveValue ( endDate ) ;
457
- expect ( startDateDatePicker ) . toHaveValue ( startDate ) ;
476
+ await waitFor ( ( ) => {
477
+ expect ( startDateDatePicker ) . toHaveValue (
478
+ startDateDayjs . format ( 'MM/DD/YYYY' ) ,
479
+ ) ;
480
+ expect ( endDateDatePicker ) . toHaveValue ( endDateDayjs . format ( 'MM/DD/YYYY' ) ) ;
481
+ } ) ;
458
482
459
483
userEvent . click ( screen . getByTestId ( 'allDayEventCheck' ) ) ;
460
484
@@ -475,7 +499,7 @@ describe('Testing Events Screen [User Portal]', () => {
475
499
expect ( startTimePicker ) . toHaveValue ( startTime ) ;
476
500
} ) ;
477
501
478
- test ( 'EndDate null' , async ( ) => {
502
+ it ( 'EndDate null' , async ( ) => {
479
503
render (
480
504
< MockedProvider addTypename = { false } link = { link } >
481
505
< BrowserRouter >
0 commit comments