apple2js/test/js/ui/options_modal.spec.ts
Will Scullin 1e79d9d59d
Prettier (#203)
* Enabled prettier

* Update lint, fix issues

* Restore some array formatting
2023-11-24 06:45:55 -08:00

145 lines
4.1 KiB
TypeScript

/** @jest-environment jsdom */
import { screen } from '@testing-library/dom';
import userEvent from '@testing-library/user-event';
import { Options } from 'js/options';
import { BOOLEAN_OPTION, SELECT_OPTION, OptionHandler } from 'js/options';
import { OptionsModal } from 'js/ui/options_modal';
jest.mock('micromodal');
const mockOptionHandler: OptionHandler = {
getOptions() {
return [
{
name: 'Section 1',
options: [
{
name: 'option_1',
label: 'Option 1',
type: BOOLEAN_OPTION,
defaultVal: false,
},
{
name: 'option_2',
label: 'Option 2',
type: SELECT_OPTION,
defaultVal: 'select_1',
values: [
{
name: 'Select 1',
value: 'select_1',
},
{
name: 'Select 2',
value: 'select_2',
},
],
},
],
},
{
name: 'Section 2',
options: [
{
name: 'option_3',
label: 'Option 3',
type: BOOLEAN_OPTION,
defaultVal: true,
},
],
},
];
},
setOption: jest.fn(),
};
describe('OptionsModal', () => {
let options: Options;
let modal: OptionsModal;
beforeEach(() => {
options = new Options();
options.addOptions(mockOptionHandler);
modal = new OptionsModal(options);
});
afterEach(() => {
localStorage.clear();
});
describe('openModal', () => {
let content: HTMLDivElement;
beforeEach(() => {
content = document.createElement('div');
content.id = 'options-modal-content';
document.body.appendChild(content);
});
afterEach(() => {
jest.resetAllMocks();
content.remove();
});
it('renders', () => {
modal.openModal();
expect(content).toMatchSnapshot();
});
it('toggles booleans', () => {
modal.openModal();
const toggle = screen.getByText('Option 3');
userEvent.click(toggle);
expect(mockOptionHandler.setOption).toHaveBeenCalledWith(
'option_3',
false
);
});
it('selects', () => {
modal.openModal();
const combobox = screen.getByRole('combobox');
userEvent.selectOptions(combobox, 'select_2');
expect(mockOptionHandler.setOption).toHaveBeenCalledWith(
'option_2',
'select_2'
);
});
});
describe('getOption', () => {
beforeEach(() => {
options = new Options();
options.addOptions(mockOptionHandler);
modal = new OptionsModal(options);
});
it('gets boolean', () => {
expect(options.getOption('option_1')).toEqual(false);
expect(options.getOption('option_3')).toEqual(true);
});
it('gets selector', () => {
expect(options.getOption('option_2')).toEqual('select_1');
});
});
describe('setOption', () => {
it('sets boolean', () => {
options.setOption('option_1', true);
expect(mockOptionHandler.setOption).toHaveBeenCalledWith(
'option_1',
true
);
});
it('sets selector', () => {
options.setOption('option_2', 'select_2');
expect(mockOptionHandler.setOption).toHaveBeenCalledWith(
'option_2',
'select_2'
);
});
});
});