11import React from 'react' ;
2- import { render , screen , fireEvent } from '@testing-library/react' ;
2+ import { render , screen , fireEvent , waitFor } from '@testing-library/react' ;
3+ import userEvent from '@testing-library/user-event' ;
34import DailyScheduler from './DailyScheduler' ;
45
56describe ( 'DailyScheduler' , ( ) => {
6- let store = { } ;
7-
8- beforeAll ( ( ) => {
9- Object . defineProperty ( window , 'localStorage' , {
10- value : {
11- getItem : jest . fn ( ( key ) => store [ key ] || null ) ,
12- setItem : jest . fn ( ( key , value ) => {
13- store [ key ] = value . toString ( ) ;
14- } ) ,
15- clear : jest . fn ( ( ) => {
16- store = { } ;
17- } ) ,
18- } ,
19- writable : true ,
20- } ) ;
21- } ) ;
22-
237 beforeEach ( ( ) => {
24- store = { } ;
25- jest . clearAllMocks ( ) ;
8+ localStorage . clear ( ) ;
269 } ) ;
2710
28- test ( 'renders the scheduler with the correct title' , ( ) => {
11+ test ( 'renders the scheduler with a title' , ( ) => {
2912 render ( < DailyScheduler /> ) ;
30- expect ( screen . getByText ( / t o d a y s c h e d u l e / i) ) . toBeInTheDocument ( ) ;
13+ expect ( screen . getByRole ( 'heading' , { name : / s c h e d u l e / i } ) ) . toBeInTheDocument ( ) ;
3114 } ) ;
3215
33- test ( 'renders all time slots' , ( ) => {
16+ test ( 'allows user to add and persist an event' , async ( ) => {
3417 render ( < DailyScheduler /> ) ;
35- const hours = [ '8:00 AM' , '9:00 AM' , '10:00 AM' , '11:00 AM' , '12:00 PM' , '1:00 PM' , '2:00 PM' , '3:00 PM' , '4:00 PM' , '5:00 PM' , '6:00 PM' , '7:00 PM' ] ;
36- hours . forEach ( hour => {
37- expect ( screen . getByText ( hour ) ) . toBeInTheDocument ( ) ;
18+
19+ const timeSlot = screen . getByLabelText ( / E v e n t f o r 9 : 0 0 A M / i) ;
20+
21+ await userEvent . type ( timeSlot , 'Team Standup' ) ;
22+ fireEvent . blur ( timeSlot ) ;
23+
24+ await waitFor ( ( ) => {
25+ expect ( screen . getByText ( 'Team Standup' ) ) . toBeInTheDocument ( ) ;
3826 } ) ;
27+
28+ const savedData = Object . values ( localStorage ) . find ( val =>
29+ val . includes ( 'Team Standup' )
30+ ) ;
31+ expect ( savedData ) . toBeTruthy ( ) ;
3932 } ) ;
4033
41- test ( 'loads events from localStorage on initial render' , ( ) => {
42- const eventKey = 'event_9:00_AM' ;
43- const eventText = 'Morning meeting' ;
34+ test ( 'persisted events survive page refresh' , async ( ) => {
35+ const { unmount } = render ( < DailyScheduler /> ) ;
4436
45- store [ eventKey ] = eventText ;
37+ const timeSlot = screen . getByLabelText ( / E v e n t f o r 9 : 0 0 A M / i ) ;
4638
47- render ( < DailyScheduler /> ) ;
48- expect ( screen . getByText ( eventText ) ) . toBeInTheDocument ( ) ;
49- } ) ;
50-
51- test ( 'saves an event to localStorage when the user types in a time slot' , ( ) => {
52- render ( < DailyScheduler /> ) ;
39+ await userEvent . type ( timeSlot , 'Team Standup' ) ;
40+ fireEvent . blur ( timeSlot ) ;
5341
54- const timeLabel = screen . getByText ( '9:00 AM' ) ;
55- const slotContainer = timeLabel . closest ( 'div' ) ;
56- const inputSlot = slotContainer . querySelector ( '[contenteditable="true"]' ) ;
42+ await waitFor ( ( ) => {
43+ expect ( screen . getByText ( 'Team Standup' ) ) . toBeInTheDocument ( ) ;
44+ } ) ;
5745
58- fireEvent . input ( inputSlot , { target : { textContent : 'Team Standup' } } ) ;
59- fireEvent . blur ( inputSlot ) ;
60-
61- expect ( localStorage . setItem ) . toHaveBeenCalledWith ( 'event_9:00_AM' , 'Team Standup' ) ;
62- expect ( store [ 'event_9:00_AM' ] ) . toBe ( 'Team Standup' ) ;
46+ unmount ( ) ;
47+ render ( < DailyScheduler /> ) ;
48+
49+ expect ( screen . getByText ( 'Team Standup' ) ) . toBeInTheDocument ( ) ;
6350 } ) ;
6451} ) ;
0 commit comments