import 'web-audio-test-api'; import React from 'react'; import configureStore from 'redux-mock-store'; import {mount} from 'enzyme'; import {LoadingState} from '../../../src/reducers/project-state'; import VM from 'scratch-vm'; import projectSaverHOC from '../../../src/lib/project-saver-hoc.jsx'; describe('projectSaverHOC', () => { const mockStore = configureStore(); let store; let vm; beforeEach(() => { store = mockStore({ scratchGui: { projectState: {} } }); vm = new VM(); }); test('if canSave becomes true when showing a project with an id, project will be saved', () => { const mockedUpdateProject = jest.fn(); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent isShowingWithId canSave={false} isCreatingNew={false} isShowingWithoutId={false} isUpdating={false} loadingState={LoadingState.SHOWING_WITH_ID} store={store} vm={vm} onUpdateProject={mockedUpdateProject} /> ); mounted.setProps({ canSave: true }); expect(mockedUpdateProject).toHaveBeenCalled(); }); test('if canSave is alreatdy true and we show a project with an id, project will NOT be saved', () => { const mockedSaveProject = jest.fn(); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent canSave isCreatingNew={false} isShowingWithId={false} isShowingWithoutId={false} isUpdating={false} loadingState={LoadingState.LOADING_VM_WITH_ID} store={store} vm={vm} onUpdateProject={mockedSaveProject} /> ); mounted.setProps({ canSave: true, isShowingWithId: true, loadingState: LoadingState.SHOWING_WITH_ID }); expect(mockedSaveProject).not.toHaveBeenCalled(); }); test('if canSave is false when showing a project without an id, project will NOT be created', () => { const mockedCreateProject = jest.fn(); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent isShowingWithoutId canSave={false} isCreatingNew={false} isShowingWithId={false} isUpdating={false} loadingState={LoadingState.LOADING_VM_NEW_DEFAULT} store={store} vm={vm} onCreateProject={mockedCreateProject} /> ); mounted.setProps({ isShowingWithoutId: true, loadingState: LoadingState.SHOWING_WITHOUT_ID }); expect(mockedCreateProject).not.toHaveBeenCalled(); }); test('if canCreateNew becomes true when showing a project without an id, project will be created', () => { const mockedCreateProject = jest.fn(); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent isShowingWithoutId canCreateNew={false} isCreatingNew={false} isShowingWithId={false} isUpdating={false} loadingState={LoadingState.SHOWING_WITHOUT_ID} store={store} vm={vm} onCreateProject={mockedCreateProject} /> ); mounted.setProps({ canCreateNew: true }); expect(mockedCreateProject).toHaveBeenCalled(); }); test('if canCreateNew is true and we transition to showing new project, project will be created', () => { const mockedCreateProject = jest.fn(); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent canCreateNew isCreatingNew={false} isShowingWithId={false} isShowingWithoutId={false} isUpdating={false} loadingState={LoadingState.LOADING_VM_NEW_DEFAULT} store={store} vm={vm} onCreateProject={mockedCreateProject} /> ); mounted.setProps({ isShowingWithoutId: true, loadingState: LoadingState.SHOWING_WITHOUT_ID }); expect(mockedCreateProject).toHaveBeenCalled(); }); test('if we enter creating new state, vm project should be requested', () => { vm.saveProjectSb3 = jest.fn(() => Promise.resolve()); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent canSave isCreatingCopy={false} isCreatingNew={false} isRemixing={false} isShowingWithId={false} isShowingWithoutId={false} isUpdating={false} loadingState={LoadingState.LOADING_VM_NEW_DEFAULT} reduxProjectId={'100'} store={store} vm={vm} /> ); mounted.setProps({ isCreatingNew: true, loadingState: LoadingState.CREATING_NEW }); expect(vm.saveProjectSb3).toHaveBeenCalled(); }); test('if we enter remixing state, vm project should be requested', () => { vm.saveProjectSb3 = jest.fn(() => Promise.resolve()); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent canSave isCreatingCopy={false} isCreatingNew={false} isRemixing={false} isShowingWithId={false} isShowingWithoutId={false} isUpdating={false} loadingState={LoadingState.SHOWING_WITH_ID} reduxProjectId={'100'} store={store} vm={vm} /> ); mounted.setProps({ isRemixing: true, loadingState: LoadingState.REMIXING }); expect(vm.saveProjectSb3).toHaveBeenCalled(); }); test('if we enter creating copy state, vm project should be requested', () => { vm.saveProjectSb3 = jest.fn(() => Promise.resolve()); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent canSave isCreatingCopy={false} isCreatingNew={false} isRemixing={false} isShowingWithId={false} isShowingWithoutId={false} isUpdating={false} loadingState={LoadingState.SHOWING_WITH_ID} reduxProjectId={'100'} store={store} vm={vm} /> ); mounted.setProps({ isCreatingCopy: true, loadingState: LoadingState.CREATING_COPY }); expect(vm.saveProjectSb3).toHaveBeenCalled(); }); test('if we enter updating/saving state, vm project shold be requested', () => { vm.saveProjectSb3 = jest.fn(() => Promise.resolve()); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent canSave isCreatingNew={false} isShowingWithId={false} isShowingWithoutId={false} isUpdating={false} loadingState={LoadingState.LOADING_VM_WITH_ID} reduxProjectId={'100'} store={store} vm={vm} /> ); mounted.setProps({ isUpdating: true, loadingState: LoadingState.UPDATING }); expect(vm.saveProjectSb3).toHaveBeenCalled(); }); test('if we are already in updating/saving state, vm project shold be NOT requested', () => { vm.saveProjectSb3 = jest.fn(() => Promise.resolve()); const Component = () => <div />; const WrappedComponent = projectSaverHOC(Component); const mounted = mount( <WrappedComponent canSave isUpdating isCreatingNew={false} isShowingWithId={false} isShowingWithoutId={false} loadingState={LoadingState.UPDATING} reduxProjectId={'100'} store={store} vm={vm} /> ); mounted.setProps({ isUpdating: true, loadingState: LoadingState.UPDATING, reduxProjectId: '99' // random change to force a re-render and componentDidUpdate }); expect(vm.saveProjectSb3).not.toHaveBeenCalled(); }); });