import { shallow } from 'enzyme';
import * as React from 'react';
import { Settings } from '../../../src/renderer/components/settings';
jest.mock('../../../src/renderer/components/settings-general', () => ({
GeneralSettings: 'settings-general',
}));
jest.mock('../../../src/renderer/components/settings-electron', () => ({
ElectronSettings: 'settings-electron',
}));
jest.mock('../../../src/renderer/components/settings-credits', () => ({
CreditsSettings: 'settings-credits',
}));
describe('Settings component', () => {
let store: any;
beforeEach(() => {
store = {
isSettingsShowing: true,
};
});
it('renders null if settings not showing', () => {
store.isSettingsShowing = false;
const wrapper = shallow();
expect(wrapper.html()).toBe(null);
});
it('renders only the menu if page unknown', () => {
const wrapper = shallow();
wrapper.setState({ section: 'blub' });
expect(wrapper).toMatchSnapshot();
});
it('renders the Electron page by default', () => {
const wrapper = shallow();
expect(wrapper).toMatchSnapshot();
});
it('renders the General page after a click', () => {
const wrapper = shallow();
wrapper.find('#settings-link-General').simulate('click');
expect(wrapper).toMatchSnapshot();
});
it('renders the Electron page after a click', () => {
const wrapper = shallow();
wrapper.find('#settings-link-Electron').simulate('click');
expect(wrapper).toMatchSnapshot();
});
it('renders the Execution page after a click', () => {
const wrapper = shallow();
wrapper.find('#settings-link-Execution').simulate('click');
expect(wrapper).toMatchSnapshot();
});
it('renders the Credits page after a click', () => {
const wrapper = shallow();
wrapper.find('#settings-link-Credits').simulate('click');
expect(wrapper).toMatchSnapshot();
});
it('closes upon pressing Escape key', () => {
expect(store.isSettingsShowing).toBe(true);
// mock event listener API
const map: any = {};
window.addEventListener = jest.fn().mockImplementation((event, cb) => {
map[event] = cb;
});
window.removeEventListener = jest.fn().mockImplementation((event) => {
delete map[event];
});
const wrapper = shallow();
// trigger mock 'keyup' event
map.keyup({ code: 'Escape' });
expect(Object.keys(map)).toHaveLength(1);
expect(store.isSettingsShowing).toBe(false);
// check if event listener is removed upon unmount
wrapper.unmount();
expect(Object.keys(map)).toHaveLength(0);
});
it('does not close when Escape key is pressed when theme selector is open', () => {
expect(store.isSettingsShowing).toBe(true);
// mock event listener API
const map: any = {};
window.addEventListener = jest.fn().mockImplementation((event, cb) => {
map[event] = cb;
});
window.removeEventListener = jest.fn().mockImplementation((event) => {
delete map[event];
});
// Set the theme selector showing to true
const wrapper = shallow();
const instance = wrapper.instance() as Settings;
// Toggle the state of the variable
instance.toggleHasPopoverOpen();
// trigger mock 'keyup' event
map.keyup({ code: 'Escape' });
expect(Object.keys(map)).toHaveLength(1);
expect(store.isSettingsShowing).toBe(true);
// Toggle the setting again as if it was closed
instance.toggleHasPopoverOpen();
// trigger mock 'keyup' event
map.keyup({ code: 'Escape' });
expect(Object.keys(map)).toHaveLength(1);
expect(store.isSettingsShowing).toBe(false);
// check if event listener is removed upon unmount
wrapper.unmount();
expect(Object.keys(map)).toHaveLength(0);
});
});