import { shallow } from 'enzyme';
import * as React from 'react';
import { IpcEvents } from '../../../src/ipc-events';
import { getIsDownloaded } from '../../../src/renderer/binary';
import { AddVersionDialog } from '../../../src/renderer/components/dialog-add-version';
import { ipcRendererManager } from '../../../src/renderer/ipc';
import { overridePlatform, resetPlatform } from '../../utils';
import { StateMock } from '../../mocks/mocks';
jest.mock('../../../src/renderer/ipc');
jest.mock('../../../src/renderer/binary');
describe('AddVersionDialog component', () => {
let store: StateMock;
const mockFile = '/test/file';
beforeAll(() => {
// We render the buttons different depending on the
// platform, so let' have a uniform platform for unit tests
overridePlatform('darwin');
});
afterAll(() => {
resetPlatform();
});
beforeEach(() => {
({ state: store } = (window as any).ElectronFiddle.app);
});
it('renders', () => {
const wrapper = shallow();
wrapper.setState({
isValidVersion: true,
isValidElectron: true,
folderPath: mockFile,
});
expect(wrapper).toMatchSnapshot();
wrapper.setState({
isValidVersion: false,
isValidElectron: true,
folderPath: mockFile,
});
expect(wrapper).toMatchSnapshot();
wrapper.setState({
isValidVersion: true,
isValidElectron: true,
existingLocalVersion: {
version: '2.2.2',
localPath: mockFile,
},
folderPath: mockFile,
});
expect(wrapper).toMatchSnapshot();
});
it('overrides default input with Electron dialog', () => {
const preventDefault = jest.fn();
const wrapper = shallow();
const inp = wrapper.find('#custom-electron-version');
inp.dive().find('input[type="file"]').simulate('click', { preventDefault });
expect(ipcRendererManager.send as jest.Mock).toHaveBeenCalledWith(
IpcEvents.SHOW_LOCAL_VERSION_FOLDER_DIALOG,
);
expect(preventDefault).toHaveBeenCalled();
});
describe('setFolderPath()', () => {
it('does something', async () => {
(getIsDownloaded as jest.Mock).mockReturnValue(true);
const wrapper = shallow();
await (wrapper.instance() as any).setFolderPath('/test/');
expect(wrapper.state('isValidElectron')).toBe(true);
expect(wrapper.state('folderPath')).toBe('/test/');
});
});
describe('onChangeVersion()', () => {
it('handles valid input', () => {
const wrapper = shallow();
(wrapper.instance() as any).onChangeVersion({
target: { value: '3.3.3' },
});
expect(wrapper.state('isValidVersion')).toBe(true);
expect(wrapper.state('version')).toBe('3.3.3');
});
it('handles invalid input', () => {
const wrapper = shallow();
(wrapper.instance() as any).onChangeVersion({ target: { value: 'foo' } });
expect(wrapper.state('isValidVersion')).toBe(false);
expect(wrapper.state('version')).toBe('foo');
(wrapper.instance() as any).onChangeVersion({ target: {} });
expect(wrapper.state('isValidVersion')).toBe(false);
expect(wrapper.state('version')).toBe('');
});
});
describe('onSubmit', () => {
it('does not do anything without a file', async () => {
const wrapper = shallow();
await (wrapper.instance() as any).onSubmit();
expect(store.addLocalVersion).toHaveBeenCalledTimes(0);
});
it('adds a local version using the given data', async () => {
const wrapper = shallow();
wrapper.setState({
version: '3.3.3',
folderPath: '/test/path',
});
await (wrapper.instance() as any).onSubmit();
expect(store.addLocalVersion).toHaveBeenCalledTimes(1);
const result = store.addLocalVersion.mock.calls[0][0];
expect(result.localPath).toBe('/test/path');
expect(result.version).toBe('3.3.3');
});
it('shows dialog warning when adding duplicate local versions', async () => {
const wrapper = shallow();
wrapper.setState({
isValidElectron: true,
folderPath: '/test/path',
version: '3.3.3',
existingLocalVersion: {
version: '2.2.2',
localPath: '/test/path',
},
});
expect(wrapper).toMatchSnapshot();
});
});
});