Spaces:
Runtime error
Runtime error
| import 'web-audio-test-api'; | |
| import React from 'react'; | |
| import configureStore from 'redux-mock-store'; | |
| import {mountWithIntl} from '../../helpers/intl-helpers.jsx'; | |
| import VM from 'scratch-vm'; | |
| import {LoadingState} from '../../../src/reducers/project-state'; | |
| import CloudProvider from '../../../src/lib/cloud-provider'; | |
| const mockCloudProviderInstance = { | |
| connection: true, | |
| requestCloseConnection: jest.fn() | |
| }; | |
| jest.mock('../../../src/lib/cloud-provider', () => | |
| jest.fn().mockImplementation(() => mockCloudProviderInstance) | |
| ); | |
| import cloudManagerHOC from '../../../src/lib/cloud-manager-hoc.jsx'; | |
| describe.skip('CloudManagerHOC', () => { | |
| const mockStore = configureStore(); | |
| let store; | |
| let vm; | |
| let stillLoadingStore; | |
| beforeEach(() => { | |
| store = mockStore({ | |
| scratchGui: { | |
| projectState: { | |
| projectId: '1234', | |
| loadingState: LoadingState.SHOWING_WITH_ID | |
| }, | |
| mode: { | |
| hasEverEnteredEditor: false | |
| }, | |
| tw: {} | |
| } | |
| }); | |
| stillLoadingStore = mockStore({ | |
| scratchGui: { | |
| projectState: { | |
| projectId: '1234', | |
| loadingState: LoadingState.LOADING_WITH_ID | |
| }, | |
| mode: { | |
| hasEverEnteredEditor: false | |
| } | |
| } | |
| }); | |
| vm = new VM(); | |
| vm.setCloudProvider = jest.fn(); | |
| vm.runtime = { | |
| hasCloudData: jest.fn(() => true) | |
| }; | |
| CloudProvider.mockClear(); | |
| mockCloudProviderInstance.requestCloseConnection.mockClear(); | |
| }); | |
| test('when it mounts, the cloud provider is set on the vm', () => { | |
| const Component = () => (<div />); | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| const onShowCloudInfo = jest.fn(); | |
| mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| onShowCloudInfo={onShowCloudInfo} | |
| /> | |
| ); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(1); | |
| expect(CloudProvider).toHaveBeenCalledTimes(1); | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(mockCloudProviderInstance); | |
| expect(onShowCloudInfo).not.toHaveBeenCalled(); | |
| }); | |
| test('when cloudHost is missing, the cloud provider is not set on the vm', () => { | |
| const Component = () => (<div />); | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(0); | |
| expect(CloudProvider).not.toHaveBeenCalled(); | |
| }); | |
| test('when projectID is missing, the cloud provider is not set on the vm', () => { | |
| const Component = () => (<div />); | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| vm={vm} | |
| /> | |
| ); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(0); | |
| expect(CloudProvider).not.toHaveBeenCalled(); | |
| }); | |
| test('when project is not showingWithId, the cloud provider is not set on the vm', () => { | |
| const Component = () => (<div />); | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={stillLoadingStore} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(0); | |
| expect(CloudProvider).not.toHaveBeenCalled(); | |
| }); | |
| test('when hasCloudPermission is false, the cloud provider is not set on the vm', () => { | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| mountWithIntl( | |
| <WrappedComponent | |
| cloudHost="nonEmpty" | |
| hasCloudPermission={false} | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(0); | |
| expect(CloudProvider).not.toHaveBeenCalled(); | |
| }); | |
| test('if the isShowingWithId prop becomes true, it sets the cloud provider on the vm', () => { | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| const onShowCloudInfo = jest.fn(); | |
| vm.runtime.hasCloudData = jest.fn(() => false); | |
| const mounted = mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={stillLoadingStore} | |
| username="user" | |
| vm={vm} | |
| onShowCloudInfo={onShowCloudInfo} | |
| /> | |
| ); | |
| expect(onShowCloudInfo).not.toHaveBeenCalled(); | |
| vm.runtime.hasCloudData = jest.fn(() => true); | |
| vm.emit('HAS_CLOUD_DATA_UPDATE', true); | |
| mounted.setProps({ | |
| isShowingWithId: true, | |
| loadingState: LoadingState.SHOWING_WITH_ID | |
| }); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(1); | |
| expect(CloudProvider).toHaveBeenCalledTimes(1); | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(mockCloudProviderInstance); | |
| expect(onShowCloudInfo).not.toHaveBeenCalled(); | |
| }); | |
| test('projectId change should not trigger cloudProvider connection unless isShowingWithId becomes true', () => { | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| const mounted = mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={stillLoadingStore} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| mounted.setProps({ | |
| projectId: 'a different id' | |
| }); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(0); | |
| expect(CloudProvider).not.toHaveBeenCalled(); | |
| mounted.setProps({ | |
| isShowingWithId: true, | |
| loadingState: LoadingState.SHOWING_WITH_ID | |
| }); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(1); | |
| expect(CloudProvider).toHaveBeenCalledTimes(1); | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(mockCloudProviderInstance); | |
| }); | |
| test('when it unmounts, the cloud provider is reset to null on the vm', () => { | |
| const Component = () => (<div />); | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| const mounted = mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(CloudProvider).toHaveBeenCalled(); | |
| const requestCloseConnection = mockCloudProviderInstance.requestCloseConnection; | |
| mounted.unmount(); | |
| // vm.setCloudProvider is called twice, | |
| // once during mount and once during unmount | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(2); | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(null); | |
| expect(requestCloseConnection).toHaveBeenCalledTimes(1); | |
| }); | |
| test('projectId changing should trigger cloudProvider disconnection', () => { | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| const mounted = mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(CloudProvider).toHaveBeenCalled(); | |
| const requestCloseConnection = mockCloudProviderInstance.requestCloseConnection; | |
| mounted.setProps({ | |
| projectId: 'a different id' | |
| }); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(2); | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(null); | |
| expect(requestCloseConnection).toHaveBeenCalledTimes(1); | |
| }); | |
| test('username changing should trigger cloudProvider disconnection', () => { | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| const mounted = mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(CloudProvider).toHaveBeenCalled(); | |
| const requestCloseConnection = mockCloudProviderInstance.requestCloseConnection; | |
| mounted.setProps({ | |
| username: 'a different user' | |
| }); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(3); // tw: the test is wrong. | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(null); | |
| expect(requestCloseConnection).toHaveBeenCalledTimes(1); | |
| }); | |
| test('project without cloud data should not trigger cloud connection', () => { | |
| // Mock the vm runtime function so that has cloud data is not | |
| // initially true | |
| vm.runtime.hasCloudData = jest.fn(() => false); | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(0); | |
| expect(CloudProvider).not.toHaveBeenCalled(); | |
| }); | |
| test('projectHasCloudData becoming true should trigger a cloud connection', () => { | |
| // Mock the vm runtime function so that has cloud data is not | |
| // initially true | |
| vm.runtime.hasCloudData = jest.fn(() => false); | |
| const onShowCloudInfo = jest.fn(); | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| onShowCloudInfo={onShowCloudInfo} | |
| /> | |
| ); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(0); | |
| expect(CloudProvider).not.toHaveBeenCalled(); | |
| expect(onShowCloudInfo).not.toHaveBeenCalled(); | |
| // Mock VM hasCloudData becoming true and emitting an update | |
| vm.runtime.hasCloudData = jest.fn(() => true); | |
| vm.emit('HAS_CLOUD_DATA_UPDATE', true); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(1); | |
| expect(CloudProvider).toHaveBeenCalledTimes(1); | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(mockCloudProviderInstance); | |
| expect(onShowCloudInfo).toHaveBeenCalled(); | |
| }); | |
| test('projectHasCloudDataUpdate becoming false should trigger cloudProvider disconnection', () => { | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(CloudProvider).toHaveBeenCalled(); | |
| const requestCloseConnection = mockCloudProviderInstance.requestCloseConnection; | |
| vm.runtime.hasCloudData = jest.fn(() => false); | |
| vm.emit('HAS_CLOUD_DATA_UPDATE', false); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(2); | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(null); | |
| expect(requestCloseConnection).toHaveBeenCalledTimes(1); | |
| }); | |
| // Editor Mode Connection/Disconnection Tests | |
| test('Entering editor mode and can\'t save project should disconnect cloud provider', () => { | |
| const Component = () => <div />; | |
| const WrappedComponent = cloudManagerHOC(Component); | |
| const mounted = mountWithIntl( | |
| <WrappedComponent | |
| hasCloudPermission | |
| cloudHost="nonEmpty" | |
| store={store} | |
| username="user" | |
| vm={vm} | |
| /> | |
| ); | |
| expect(CloudProvider).toHaveBeenCalled(); | |
| const requestCloseConnection = mockCloudProviderInstance.requestCloseConnection; | |
| mounted.setProps({ | |
| canModifyCloudData: false | |
| }); | |
| expect(vm.setCloudProvider.mock.calls.length).toBe(2); | |
| expect(vm.setCloudProvider).toHaveBeenCalledWith(null); | |
| expect(requestCloseConnection).toHaveBeenCalledTimes(1); | |
| }); | |
| }); | |