import React from 'react';
import { shallow } from 'enzyme';
import { thunkActions, selectors } from '../../data/redux';
import { RequestKeys } from '../../data/constants/requests';
import { ProblemEditor, mapStateToProps, mapDispatchToProps } from '.';
jest.mock('./components/EditProblemView', () => 'EditProblemView');
jest.mock('./components/SelectTypeModal', () => 'SelectTypeModal');
jest.mock('react', () => {
const updateState = jest.fn();
return {
...jest.requireActual('react'),
updateState,
useState: jest.fn(val => ([{ state: val }, jest.fn().mockName('setState')])),
};
});
jest.mock('../../data/redux', () => ({
thunkActions: {
problem: {
initializeProblemEditor: jest.fn().mockName('thunkActions.problem.initializeProblem'),
},
},
selectors: {
app: {
blockValue: jest.fn(state => ({ blockValue: state })),
},
problem: {
problemType: jest.fn(state => ({ problemType: state })),
},
requests: {
isFinished: jest.fn((state, params) => ({ isFinished: { state, params } })),
isFailed: jest.fn((state, params) => ({ isFailed: { state, params } })),
},
},
}));
describe('ProblemEditor', () => {
const props = {
onClose: jest.fn().mockName('props.onClose'),
// redux
problemType: null,
blockValue: { data: { data: 'eDiTablE Text' } },
blockFinished: false,
blockFailed: false,
studioViewFinished: false,
initializeProblemEditor: jest.fn().mockName('args.intializeProblemEditor'),
assetsFinished: false,
};
describe('snapshots', () => {
test('renders as expected with default behavior', () => {
expect(shallow()).toMatchSnapshot();
});
test('block loaded, studio view and assets not yet loaded, Spinner appears', () => {
expect(shallow()).toMatchSnapshot();
});
test('studio view loaded, block and assets not yet loaded, Spinner appears', () => {
expect(shallow()).toMatchSnapshot();
});
test('assets loaded, block and studio view not yet loaded, Spinner appears', () => {
expect(shallow()).toMatchSnapshot();
});
test('block failed, message appears', () => {
expect(shallow()).toMatchSnapshot();
});
test('renders SelectTypeModal', () => {
expect(shallow()).toMatchSnapshot();
});
test('renders EditProblemView', () => {
expect(shallow()).toMatchSnapshot();
});
});
describe('mapStateToProps', () => {
const testState = { A: 'pple', B: 'anana', C: 'ucumber' };
test('blockValue from app.blockValue', () => {
expect(
mapStateToProps(testState).blockValue,
).toEqual(selectors.app.blockValue(testState));
});
test('problemType from problem.problemType', () => {
expect(
mapStateToProps(testState).problemType,
).toEqual(selectors.problem.problemType(testState));
});
test('blockFinished from requests.isFinished', () => {
expect(
mapStateToProps(testState).blockFinished,
).toEqual(selectors.requests.isFinished(testState, { requestKey: RequestKeys.fetchBlock }));
});
test('studioViewFinished from requests.isFinished', () => {
expect(
mapStateToProps(testState).studioViewFinished,
).toEqual(selectors.requests.isFinished(testState, { requestKey: RequestKeys.fetchStudioView }));
});
test('assetsFinished from requests.isFinished', () => {
expect(
mapStateToProps(testState).assetsFinished,
).toEqual(selectors.requests.isFinished(testState, { requestKey: RequestKeys.fetchAssets }));
});
});
describe('mapDispatchToProps', () => {
test('initializeProblemEditor from thunkActions.problem.initializeProblem', () => {
expect(mapDispatchToProps.initializeProblemEditor).toEqual(thunkActions.problem.initializeProblem);
});
});
});