From 3a65f103b05da7ec2bf14a52b34cc50d7901b10f Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 4 Dec 2019 11:36:26 +0100 Subject: [PATCH] Add test for form saving started reducer [MAILPOET-2451] --- assets/js/src/form_editor/store/reducer.jsx | 5 +- .../store/reducers/save_form_started.jsx | 4 +- .../store/reducers/save_form_started.spec.js | 99 +++++++++++++++++++ 3 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 tests/javascript/form_editor/store/reducers/save_form_started.spec.js diff --git a/assets/js/src/form_editor/store/reducer.jsx b/assets/js/src/form_editor/store/reducer.jsx index 3f5cc2ebcd..d8bf0a4f71 100644 --- a/assets/js/src/form_editor/store/reducer.jsx +++ b/assets/js/src/form_editor/store/reducer.jsx @@ -1,15 +1,18 @@ +import MailPoet from 'mailpoet'; import changeFormName from './reducers/change_form_name.jsx'; import changeFormSettings from './reducers/change_form_settings.jsx'; import changeFormStyles from './reducers/change_form_styles.jsx'; import removeNotice from './reducers/remove_notice.jsx'; import saveFormDone from './reducers/save_form_done.jsx'; import saveFormFailed from './reducers/save_form_failed.jsx'; -import saveFormStarted from './reducers/save_form_started.jsx'; +import saveFormStartedFactory from './reducers/save_form_started.jsx'; import switchSidebarTab from './reducers/switch_sidebar_tab.jsx'; import toggleSidebar from './reducers/toggle_sidebar.jsx'; import toggleSidebarPanel from './reducers/toggle_sidebar_panel.jsx'; import changeFormBlocks from './reducers/change_form_blocks.jsx'; +const saveFormStarted = saveFormStartedFactory(MailPoet); + export default (defaultState) => (state = defaultState, action) => { switch (action.type) { case 'CHANGE_FORM_BLOCKS': return changeFormBlocks(state, action); diff --git a/assets/js/src/form_editor/store/reducers/save_form_started.jsx b/assets/js/src/form_editor/store/reducers/save_form_started.jsx index 6923aaeb45..dbf80f43d7 100644 --- a/assets/js/src/form_editor/store/reducers/save_form_started.jsx +++ b/assets/js/src/form_editor/store/reducers/save_form_started.jsx @@ -1,6 +1,4 @@ -import MailPoet from 'mailpoet'; - -export default (state) => { +export default (MailPoet) => (state) => { // remove all form saving related notices const notices = state.notices.filter((notice) => !['save-form', 'missing-lists', 'missing-block'].includes(notice.id)); const hasMissingLists = state.formErrors.includes('missing-lists'); diff --git a/tests/javascript/form_editor/store/reducers/save_form_started.spec.js b/tests/javascript/form_editor/store/reducers/save_form_started.spec.js new file mode 100644 index 0000000000..cbecd0d0d3 --- /dev/null +++ b/tests/javascript/form_editor/store/reducers/save_form_started.spec.js @@ -0,0 +1,99 @@ +import { expect } from 'chai'; +import { identity } from 'lodash'; +import reducerFactory from '../../../../../assets/js/src/form_editor/store/reducers/save_form_started.jsx'; + +const MailPoetStub = { + I18n: { + t: identity, + }, +}; +const reducer = reducerFactory(MailPoetStub); + +describe.only('Save Form Started Reducer', () => { + let initialState = null; + beforeEach(() => { + initialState = { + notices: [], + formErrors: [], + isFormSaving: false, + sidebar: { + activeTab: 'block', + openedPanels: [], + }, + }; + }); + + it('Should set isFormSaving when there are no errors', () => { + const action = { + type: 'SAVE_FORM_STARTED', + }; + const finalState = reducer(initialState, action); + expect(finalState.isFormSaving).to.equal(true); + }); + + it('Should clean all form related notices', () => { + const action = { + type: 'SAVE_FORM_STARTED', + }; + const state = { + ...initialState, + notices: [ + { + id: 'missing-lists', + content: 'message', + status: 'error', + }, + { + id: 'save-form', + content: 'message', + status: 'error', + }, + { + id: 'missing-block', + content: 'message', + status: 'error', + }, + { + id: 'some-notice', + content: 'message', + status: 'error', + }, + ], + }; + const finalState = reducer(state, action); + expect(finalState.notices.length).to.equal(1); + expect(finalState.notices[0].id).to.equal('some-notice'); + }); + + it('Should set proper state for missing-lists error', () => { + const action = { + type: 'SAVE_FORM_STARTED', + }; + const state = { + ...initialState, + formErrors: ['missing-lists'], + }; + const finalState = reducer(state, action); + expect(finalState.sidebar.activeTab).to.equal('form'); + expect(finalState.sidebar.openedPanels).to.contain('basic-settings'); + const listsNotice = finalState.notices.find((notice) => (notice.id === 'missing-lists')); + expect(listsNotice).to.not.equal(null); + expect(listsNotice.status).to.equal('error'); + expect(listsNotice.isDismissible).to.equal(true); + }); + + it('Should set proper state for missing email input error', () => { + const action = { + type: 'SAVE_FORM_STARTED', + }; + const state = { + ...initialState, + formErrors: ['missing-email-input'], + }; + const finalState = reducer(state, action); + const listsNotice = finalState.notices.find((notice) => (notice.id === 'missing-block')); + expect(listsNotice).to.not.equal(null); + expect(listsNotice.status).to.equal('error'); + expect(listsNotice.isDismissible).to.equal(true); + }); +});