@@ -2,14 +2,19 @@ import { CssBaseline } from '@mui/material';
22import { createTheme , ThemeProvider } from '@mui/material/styles' ;
33import { screen , within , waitFor , render } from '@testing-library/react' ;
44import { userEvent } from '@testing-library/user-event' ;
5+ import { http , HttpResponse } from 'msw' ;
56import { SnackbarProvider } from 'notistack' ;
67import { ReactElement } from 'react' ;
78
9+ import { handlers } from '../../../__mocks__/handlers' ;
810import {
911 setupMockHandlerCreation ,
1012 setupMockHandlerUpdating ,
1113} from '../../../__mocks__/handlersUtils' ;
14+ import { setupMockHandlerDeletion } from '../../../__mocks__/handlersUtils' ;
1215import App from '../../../App' ;
16+ import { server } from '../../../setupTests' ;
17+ import { makeEvent } from '../../utils' ;
1318
1419const theme = createTheme ( ) ;
1520
@@ -99,4 +104,57 @@ describe('반복 UI 및 표시', () => {
99104 expect ( weekView . queryByLabelText ( '반복 일정 아이콘' ) ) . not . toBeInTheDocument ( ) ;
100105 } ) ;
101106 } ) ;
107+
108+ it ( '반복일정을 단일 삭제하면 해당 날짜 셀에서만 사라진다' , async ( ) => {
109+ // 현재 주간 뷰 범위에 10/16, 10/17이 포함되도록 고정
110+ vi . setSystemTime ( new Date ( '2025-10-16' ) ) ;
111+
112+ // 반복: daily 10/15 시작 ~ 10/22 종료, 서버에는 베이스 이벤트 1건만 존재
113+ const series = makeEvent ( {
114+ id : 'r1' ,
115+ title : '반복 삭제 테스트' ,
116+ date : '2025-10-15' ,
117+ startTime : '09:00' ,
118+ endTime : '10:00' ,
119+ category : '업무' ,
120+ repeat : { type : 'daily' , interval : 1 , endDate : '2025-10-22' } ,
121+ } ) ;
122+
123+ setupMockHandlerCreation ( [ series ] ) ;
124+
125+ const { user } = setup ( < App /> ) ;
126+
127+ await user . click ( within ( screen . getByLabelText ( '뷰 타입 선택' ) ) . getByRole ( 'combobox' ) ) ;
128+ await user . click ( screen . getByRole ( 'option' , { name : 'month-option' } ) ) ;
129+ const monthView = within ( screen . getByTestId ( 'month-view' ) ) ;
130+
131+ const day16Cell = within ( monthView . getByText ( '16' ) . closest ( 'td' ) ! ) ;
132+ await waitFor ( ( ) => expect ( day16Cell . getByText ( '반복 삭제 테스트' ) ) . toBeInTheDocument ( ) ) ;
133+
134+ const day17Cell = within ( monthView . getByText ( '17' ) . closest ( 'td' ) ! ) ;
135+ await waitFor ( ( ) => expect ( day17Cell . getByText ( '반복 삭제 테스트' ) ) . toBeInTheDocument ( ) ) ;
136+
137+ let mockEvents = [ series ] ;
138+
139+ server . use (
140+ http . get ( '/api/events' , ( ) => {
141+ return HttpResponse . json ( { events : mockEvents } ) ;
142+ } ) ,
143+ http . delete ( '/api/events/:id' , ( { params } ) => {
144+ const { id } = params ;
145+ mockEvents = mockEvents . filter ( ( event ) => event . id !== id ) ;
146+ return new HttpResponse ( null , { status : 204 } ) ;
147+ } )
148+ ) ;
149+
150+ const deleteBtn = screen . getByRole ( 'button' , {
151+ name : 'Delete event 2025-10-16' ,
152+ } ) ;
153+ await user . click ( deleteBtn ) ;
154+
155+ await waitFor ( ( ) => {
156+ expect ( day16Cell . queryByText ( '반복 삭제 테스트' ) ) . not . toBeInTheDocument ( ) ;
157+ expect ( day17Cell . getByText ( '반복 삭제 테스트' ) ) . toBeInTheDocument ( ) ;
158+ } ) ;
159+ } ) ;
102160} ) ;
0 commit comments