| 
 | 1 | +import moment from 'moment';  | 
 | 2 | +import { REQUEST_TYPES } from './constants';  | 
 | 3 | +import {  | 
 | 4 | +  createCourseUpdateQuery,  | 
 | 5 | +  editCourseUpdateQuery,  | 
 | 6 | +  editCourseHandoutsQuery,  | 
 | 7 | +} from './data/thunk';  | 
 | 8 | +import { COMMA_SEPARATED_DATE_FORMAT } from '../constants';  | 
 | 9 | + | 
 | 10 | +jest.mock('react-redux', () => ({  | 
 | 11 | +  useDispatch: jest.fn(),  | 
 | 12 | +  useSelector: jest.fn(),  | 
 | 13 | +}));  | 
 | 14 | + | 
 | 15 | +jest.mock('./data/thunk', () => ({  | 
 | 16 | +  createCourseUpdateQuery: jest.fn(),  | 
 | 17 | +  editCourseUpdateQuery: jest.fn(),  | 
 | 18 | +  editCourseHandoutsQuery: jest.fn(),  | 
 | 19 | +}));  | 
 | 20 | + | 
 | 21 | +jest.mock('../constants', () => ({  | 
 | 22 | +  COMMA_SEPARATED_DATE_FORMAT: 'YYYY,MM,DD',  | 
 | 23 | +}));  | 
 | 24 | + | 
 | 25 | +describe('handleUpdatesSubmit', () => {  | 
 | 26 | +  let dispatchMock;  | 
 | 27 | +  let closeUpdateFormMock;  | 
 | 28 | +  let setCurrentUpdateMock;  | 
 | 29 | + | 
 | 30 | +  const courseId = 'course-v1:test+T101+2025_T1';  | 
 | 31 | + | 
 | 32 | +  beforeEach(() => {  | 
 | 33 | +    dispatchMock = jest.fn();  | 
 | 34 | +    closeUpdateFormMock = jest.fn();  | 
 | 35 | +    setCurrentUpdateMock = jest.fn();  | 
 | 36 | + | 
 | 37 | +    jest.requireActual('./hooks');  | 
 | 38 | +  });  | 
 | 39 | + | 
 | 40 | +  const getMockHookContext = (requestType) => {  | 
 | 41 | +    jest.requireActual('../hooks');  | 
 | 42 | + | 
 | 43 | +    return {  | 
 | 44 | +      requestType,  | 
 | 45 | +      courseId,  | 
 | 46 | +      closeUpdateForm: closeUpdateFormMock,  | 
 | 47 | +      setCurrentUpdate: setCurrentUpdateMock,  | 
 | 48 | +      dispatch: dispatchMock,  | 
 | 49 | +      initialUpdate: { id: 0, date: moment().toDate(), content: '' },  | 
 | 50 | +    };  | 
 | 51 | +  };  | 
 | 52 | + | 
 | 53 | +  const testData = {  | 
 | 54 | +    id: 5,  | 
 | 55 | +    content: 'Sample content',  | 
 | 56 | +    date: new Date('2025-08-01T00:00:00Z'),  | 
 | 57 | +  };  | 
 | 58 | + | 
 | 59 | +  it('dispatches createCourseUpdateQuery when requestType is add_new_update', () => {  | 
 | 60 | +    const formattedDate = moment(testData.date).format(COMMA_SEPARATED_DATE_FORMAT);  | 
 | 61 | +    createCourseUpdateQuery.mockReturnValue('mockCreateAction');  | 
 | 62 | + | 
 | 63 | +    const context = getMockHookContext(REQUEST_TYPES.add_new_update);  | 
 | 64 | +    const submitFn = (data) => {  | 
 | 65 | +      const date = moment(data.date).format(COMMA_SEPARATED_DATE_FORMAT);  | 
 | 66 | +      const action = createCourseUpdateQuery(context.courseId, {  | 
 | 67 | +        date,  | 
 | 68 | +        content: data.content,  | 
 | 69 | +      });  | 
 | 70 | +      context.closeUpdateForm();  | 
 | 71 | +      context.setCurrentUpdate(context.initialUpdate);  | 
 | 72 | +      context.dispatch(action);  | 
 | 73 | +    };  | 
 | 74 | + | 
 | 75 | +    submitFn(testData);  | 
 | 76 | + | 
 | 77 | +    expect(createCourseUpdateQuery).toHaveBeenCalledWith(courseId, {  | 
 | 78 | +      date: formattedDate,  | 
 | 79 | +      content: 'Sample content',  | 
 | 80 | +    });  | 
 | 81 | +    expect(dispatchMock).toHaveBeenCalledWith('mockCreateAction');  | 
 | 82 | +    expect(closeUpdateFormMock).toHaveBeenCalled();  | 
 | 83 | +    expect(setCurrentUpdateMock).toHaveBeenCalledWith(expect.objectContaining({ id: 0 }));  | 
 | 84 | +  });  | 
 | 85 | + | 
 | 86 | +  it('dispatches editCourseUpdateQuery when requestType is edit_update', () => {  | 
 | 87 | +    const formattedDate = moment(testData.date).format(COMMA_SEPARATED_DATE_FORMAT);  | 
 | 88 | +    editCourseUpdateQuery.mockReturnValue('mockEditAction');  | 
 | 89 | + | 
 | 90 | +    const context = getMockHookContext(REQUEST_TYPES.edit_update);  | 
 | 91 | +    const submitFn = (data) => {  | 
 | 92 | +      const date = moment(data.date).format(COMMA_SEPARATED_DATE_FORMAT);  | 
 | 93 | +      const action = editCourseUpdateQuery(context.courseId, {  | 
 | 94 | +        id: data.id,  | 
 | 95 | +        date,  | 
 | 96 | +        content: data.content,  | 
 | 97 | +      });  | 
 | 98 | +      context.closeUpdateForm();  | 
 | 99 | +      context.setCurrentUpdate(context.initialUpdate);  | 
 | 100 | +      context.dispatch(action);  | 
 | 101 | +    };  | 
 | 102 | + | 
 | 103 | +    submitFn(testData);  | 
 | 104 | + | 
 | 105 | +    expect(editCourseUpdateQuery).toHaveBeenCalledWith(courseId, {  | 
 | 106 | +      id: 5,  | 
 | 107 | +      date: formattedDate,  | 
 | 108 | +      content: 'Sample content',  | 
 | 109 | +    });  | 
 | 110 | +    expect(dispatchMock).toHaveBeenCalledWith('mockEditAction');  | 
 | 111 | +    expect(closeUpdateFormMock).toHaveBeenCalled();  | 
 | 112 | +    expect(setCurrentUpdateMock).toHaveBeenCalledWith(expect.objectContaining({ id: 0 }));  | 
 | 113 | +  });  | 
 | 114 | + | 
 | 115 | +  it('dispatches editCourseHandoutsQuery when requestType is edit_handouts', () => {  | 
 | 116 | +    editCourseHandoutsQuery.mockReturnValue('mockHandoutAction');  | 
 | 117 | + | 
 | 118 | +    const context = getMockHookContext(REQUEST_TYPES.edit_handouts);  | 
 | 119 | +    const submitFn = (data) => {  | 
 | 120 | +      const formatted = {  | 
 | 121 | +        ...data,  | 
 | 122 | +        date: moment(data.date).format(COMMA_SEPARATED_DATE_FORMAT),  | 
 | 123 | +        data: data.data || '',  | 
 | 124 | +      };  | 
 | 125 | +      const action = editCourseHandoutsQuery(context.courseId, formatted);  | 
 | 126 | +      context.closeUpdateForm();  | 
 | 127 | +      context.setCurrentUpdate(context.initialUpdate);  | 
 | 128 | +      context.dispatch(action);  | 
 | 129 | +    };  | 
 | 130 | + | 
 | 131 | +    submitFn(testData);  | 
 | 132 | + | 
 | 133 | +    expect(editCourseHandoutsQuery).toHaveBeenCalledWith(courseId, expect.objectContaining({  | 
 | 134 | +      date: expect.any(String),  | 
 | 135 | +      content: 'Sample content',  | 
 | 136 | +    }));  | 
 | 137 | +    expect(dispatchMock).toHaveBeenCalledWith('mockHandoutAction');  | 
 | 138 | +    expect(closeUpdateFormMock).toHaveBeenCalled();  | 
 | 139 | +    expect(setCurrentUpdateMock).toHaveBeenCalledWith(expect.objectContaining({ id: 0 }));  | 
 | 140 | +  });  | 
 | 141 | +  it('extracts date without formatting for internal logic', () => {  | 
 | 142 | +    getMockHookContext(REQUEST_TYPES.edit_update);  | 
 | 143 | + | 
 | 144 | +    const submitFn = (data) => {  | 
 | 145 | +      const dateWithoutTimezone = data.date;  | 
 | 146 | +      expect(dateWithoutTimezone).toEqual(new Date('2025-08-01T00:00:00Z'));  | 
 | 147 | +    };  | 
 | 148 | + | 
 | 149 | +    submitFn(testData);  | 
 | 150 | +  });  | 
 | 151 | +});  | 
0 commit comments