From 703e9db06d10689866664d97b659629e68ee3f6f Mon Sep 17 00:00:00 2001 From: "guilhem.carron" <gcarron@grandlyon.com> Date: Wed, 21 Jul 2021 15:48:34 +0200 Subject: [PATCH] Update tests --- .../Feedback/FeedbackModal.spec.tsx | 126 +++++++++++++-- src/components/Feedback/FeedbackModal.tsx | 25 ++- .../__snapshots__/FeedbackModal.spec.tsx.snap | 148 ++---------------- 3 files changed, 140 insertions(+), 159 deletions(-) diff --git a/src/components/Feedback/FeedbackModal.spec.tsx b/src/components/Feedback/FeedbackModal.spec.tsx index 7b6c47d27..50a165584 100644 --- a/src/components/Feedback/FeedbackModal.spec.tsx +++ b/src/components/Feedback/FeedbackModal.spec.tsx @@ -1,10 +1,16 @@ import React from 'react' import * as reactRedux from 'react-redux' -import { shallow } from 'enzyme' +import { mount } from 'enzyme' import FeedbackModal from 'components/Feedback/FeedbackModal' import Button from '@material-ui/core/Button' import { userChallengeExplo1OnGoing } from '../../../tests/__mocks__/userChallengeData.mock' +import { Provider } from 'react-redux' +import { + createMockStore, + mockInitialEcolyoState, +} from '../../../tests/__mocks__/store' +import { act } from '@testing-library/react' const mockSendMail = jest.fn() jest.mock('services/mail.service', () => { @@ -31,22 +37,42 @@ const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') describe('FeedbackModal component', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + }) it('should render the component', () => { mockUseDispatch.mockReturnValue(jest.fn()) mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) - const component = shallow( - <FeedbackModal open={true} handleCloseClick={handleFeedbackModalClose} /> + const component = mount( + <Provider store={store}> + <FeedbackModal + open={true} + handleCloseClick={handleFeedbackModalClose} + /> + </Provider> ).getElement() expect(component).toMatchSnapshot() }) }) describe('FeedbackModal functionnalities', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + }) it('should should send an email to the support', () => { mockUseDispatch.mockReturnValue(jest.fn()) mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) - const wrapper = shallow( - <FeedbackModal open={true} handleCloseClick={handleFeedbackModalClose} /> + const wrapper = mount( + <Provider store={store}> + <FeedbackModal + open={true} + handleCloseClick={handleFeedbackModalClose} + /> + </Provider> ) const mockPlatform = 'platform' @@ -58,8 +84,14 @@ describe('FeedbackModal functionnalities', () => { const expectedMailData = { mode: 'from', - to: [{ name: 'Support', email: 'ecolyo@grandlyon.com' }], + to: [ + { + name: 'Support', + email: 'ecolyo@grandlyon.com', + }, + ], subject: '[Ecolyo] - Feedbacks - feedback.type_bug', + attachments: [], parts: [ { type: 'text/plain', @@ -90,9 +122,11 @@ describe('FeedbackModal functionnalities', () => { .find('div.fb-selector-item') .first() .simulate('click') - wrapper - .find('#idFeedbackDescription') - .simulate('change', { target: { value: 'La description' } }) + wrapper.find('#idFeedbackDescription').simulate('change', { + target: { + value: 'La description', + }, + }) wrapper.find(Button).simulate('click') expect(mockSendMail).toHaveBeenCalledWith( @@ -100,19 +134,79 @@ describe('FeedbackModal functionnalities', () => { expectedMailData ) }) - it('should close the modal and reset the inputs', () => { + it('should close the modal and reset the inputs', async () => { mockUseDispatch.mockReturnValue(jest.fn()) mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) - const wrapper = shallow( - <FeedbackModal open={true} handleCloseClick={handleFeedbackModalClose} /> + const wrapper = mount( + <Provider store={store}> + <FeedbackModal + open={true} + handleCloseClick={handleFeedbackModalClose} + /> + </Provider> ) + await act(async () => { + await new Promise(resolve => setTimeout(resolve)) + wrapper.update() + }) + wrapper.find('#idFeedbackDescription').simulate('change', { + target: { + value: 'La description', + }, + }) wrapper - .find('#idFeedbackDescription') - .simulate('change', { target: { value: 'La description' } }) - wrapper.find('.modal-paper-close-button').simulate('click') + .find('.modal-paper-close-button') + .first() + .simulate('click') expect(handleFeedbackModalClose).toHaveBeenCalledTimes(1) setTimeout(() => { - expect(wrapper.find('#idFeedbackDescription').prop('value')).toBeNull() + expect(wrapper.find('#idFeedbackDescription').prop('value')).toBe('') }) }) + // it('should resolve file as data URL', async () => { + // const wrapper = mount( + // <Provider store={store}> + // <FeedbackModal + // open={true} + // handleCloseClick={handleFeedbackModalClose} + // /> + // </Provider> + // ) + // const file = new File([new ArrayBuffer(1)], 'file.jpg') + // const fileReader = new ReadFileAsDataURL.FileReaderMock() + // jest.spyOn(window, 'FileReader').mockImplementation(() => fileReader) + + // fileReader.result = 'file content' + // fileReader.addEventListener.mockImplementation((_, fn) => fn()) + + // const content = await readFileAsDataURL(file) + + // expect(content).toBe('file content') + // expect(fileReader.readAsDataURL).toHaveBeenCalledTimes(1) + // expect(fileReader.readAsDataURL).toHaveBeenCalledWith(file) + // }) + it('should upload the image', async () => { + const wrapper = mount( + <Provider store={store}> + <FeedbackModal + open={true} + handleCloseClick={handleFeedbackModalClose} + /> + </Provider> + ) + await act(async () => { + await new Promise(resolve => setTimeout(resolve)) + wrapper.update() + }) + const file = new File([new ArrayBuffer(1)], 'file.jpg') + const readAsDataURLSpy = jest.spyOn(FileReader.prototype, 'readAsDataURL') + wrapper.find('#folder').simulate('change', { target: { files: [file] } }) + expect(readAsDataURLSpy).toBeCalledWith(file) + expect( + wrapper + .find('.removeUploaded') + .first() + .simulate('click') + ) + }) }) diff --git a/src/components/Feedback/FeedbackModal.tsx b/src/components/Feedback/FeedbackModal.tsx index 23f07d9a5..44d11d0a2 100644 --- a/src/components/Feedback/FeedbackModal.tsx +++ b/src/components/Feedback/FeedbackModal.tsx @@ -168,6 +168,17 @@ const FeedbackModal: React.FC<FeedbackModalProps> = ({ </div> ) } + const readFileAsDataURL = async (file: File): Promise<string> => { + return new Promise(resolve => { + const reader = new FileReader() + reader.onloadend = () => { + if (reader.result) { + resolve(reader.result as string) + } + } + reader.readAsDataURL(file) + }) + } const getDocument = async ( e: ChangeEvent<HTMLInputElement> ): Promise<void> => { @@ -175,13 +186,8 @@ const FeedbackModal: React.FC<FeedbackModalProps> = ({ const file = files ? files[0] : null if (file) { setuploadedFile(file) - const reader: FileReader = new FileReader() - reader.onloadend = () => { - /* eslint-disable @typescript-eslint/no-explicit-any */ - const res: any = reader.result - setTextFile(res.split(',')[1]) - } - reader.readAsDataURL(file) + const base64File: string = await readFileAsDataURL(file) + setTextFile(base64File.split(',')[1]) } } @@ -276,7 +282,10 @@ const FeedbackModal: React.FC<FeedbackModalProps> = ({ </span> <div className="fileName"> <span>{uploadedFile.name}</span> - <IconButton onClick={() => setuploadedFile(null)}> + <IconButton + onClick={() => setuploadedFile(null)} + className="removeUploaded" + > <Icon icon={CloseIcon} size={12} /> </IconButton> </div> diff --git a/src/components/Feedback/__snapshots__/FeedbackModal.spec.tsx.snap b/src/components/Feedback/__snapshots__/FeedbackModal.spec.tsx.snap index e0e94c316..2fd286dd6 100644 --- a/src/components/Feedback/__snapshots__/FeedbackModal.spec.tsx.snap +++ b/src/components/Feedback/__snapshots__/FeedbackModal.spec.tsx.snap @@ -1,143 +1,21 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`FeedbackModal component should render the component 1`] = ` -<ForwardRef(WithStyles) - aria-labelledby="accessibility-title" - classes={ +<Provider + store={ Object { - "paper": "modal-paper yellow-border", - "root": "modal-root", + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], } } - disableBackdropClick={true} - disableEscapeKeyDown={true} - onClose={[Function]} - open={true} > - <div - id="accessibility-title" - > - feedback.accessibility.window_title - </div> - <ForwardRef(WithStyles) - aria-label="feedback.accessibility.button_close" - className="modal-paper-close-button" - onClick={[Function]} - > - <Icon - icon="test-file-stub" - size={16} - spin={false} - /> - </ForwardRef(WithStyles)> - <div - className="fb-root" - > - <React.Fragment> - <div - className="fb-header text-18-bold" - id="title" - > - feedback.title - </div> - <form - className="fb-content" - > - <label - className="fb-label text-16-bold" - htmlFor="feedbackType" - > - feedback.type - </label> - <fieldset - className="fb-selector" - id="feedbackType" - > - <div - className="fb-selector-item" - > - <StyledIconBorderedButton - aria-label="feedback.accessibility.select_type_bug" - autoFocus={true} - icon="test-file-stub" - onClick={[Function]} - selected={true} - size={36} - > - <div - className="fb-selector-item-selectedlabel text-10-bold" - > - feedback.type_bug - </div> - </StyledIconBorderedButton> - </div> - <div - className="fb-selector-item" - > - <StyledIconBorderedButton - aria-label="feedback.accessibility.select_type_idea" - autoFocus={false} - icon="test-file-stub" - onClick={[Function]} - selected={false} - size={36} - > - <div - className="fb-selector-item-label text-10-normal" - > - feedback.type_idea - </div> - </StyledIconBorderedButton> - </div> - <div - className="fb-selector-item" - > - <StyledIconBorderedButton - aria-label="feedback.accessibility.select_type_other" - autoFocus={false} - icon="test-file-stub" - onClick={[Function]} - selected={false} - size={36} - > - <div - className="fb-selector-item-label text-10-normal" - > - feedback.type_other - </div> - </StyledIconBorderedButton> - </div> - </fieldset> - <label - className="fb-label text-16-bold" - htmlFor="idFeedbackDescription" - > - feedback.description - </label> - <textarea - className="fb-form fb-textarea" - id="idFeedbackDescription" - name="description" - onChange={[Function]} - placeholder="feedback.description_placeholder" - value="" - /> - <ForwardRef(WithStyles) - aria-label="feedback.accessibility.button_send" - classes={ - Object { - "label": "text-16-bold", - "root": "btn-highlight", - } - } - disabled={false} - onClick={[Function]} - type="submit" - > - feedback.send - </ForwardRef(WithStyles)> - </form> - </React.Fragment> - </div> -</ForwardRef(WithStyles)> + <FeedbackModal + handleCloseClick={[MockFunction]} + open={true} + /> +</Provider> `; -- GitLab