blob: e88da54d6d758f9dfcd6869ec66f22dc875516e5 [file] [log] [blame]
import './index';
import { expect } from 'chai';
import fetchMock from 'fetch-mock';
import { $, $$ } from '../../../infra-sk/modules/dom';
import { SelectSk } from '../../../elements-sk/modules/select-sk/select-sk';
import { pageSets } from './test_data';
import { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';
import { PagesetSelectorSk } from './pageset-selector-sk';
describe('pageset-selector-sk', () => {
const factory = setUpElementUnderTest<PagesetSelectorSk>(
'pageset-selector-sk'
);
// Returns a new element with the pagesets fetch complete.
const newInstance = async (init?: (instance: PagesetSelectorSk) => void) => {
const ele = factory(init);
await new Promise((resolve) => setTimeout(resolve, 0));
return ele;
};
let selector: PagesetSelectorSk; // Set at start of each test.
beforeEach(() => {
fetchMock.postOnce('begin:/_/page_sets/', pageSets);
});
afterEach(() => {
// Check all mock fetches called at least once and reset.
expect(fetchMock.done()).to.be.true;
fetchMock.reset();
});
const simulateUserToggle = () => {
($$('expandable-textarea-sk > button', selector) as HTMLElement).click();
};
// Simulates a user typing 'value' into the input element by setting its
// value and triggering the built-in 'input' event.
const simulateUserEnteringCustomPages = (value: string) => {
const ele = $$('textarea', selector) as HTMLInputElement;
ele.focus();
ele.value = value;
ele.dispatchEvent(
new Event('input', {
bubbles: true,
cancelable: true,
})
);
};
it('loads selections', async () => {
selector = await newInstance(undefined);
expect($('select-sk div')).to.have.length(8);
expect($$('.pageset-list', selector)).to.have.property('hidden', false);
expect(selector).to.have.property('selected', '10k');
});
it('reflects changes to selected', async () => {
selector = await newInstance(undefined);
expect(selector).to.have.property('selected', '10k');
($$('select-sk', selector) as SelectSk).selection = 3;
expect(selector).to.have.property('selected', 'Mobile10k');
selector.selected = 'Dummy1k';
expect(selector).to.have.property('selected', 'Dummy1k');
// Invalid keys aren't honored.
selector.selected = 'bogus key';
expect(selector).to.have.property('selected', '');
});
it('filters out hideKeys options', async () => {
selector = await newInstance((ele) => {
ele.hideKeys = ['Mobile100k', '100k', 'Dummy1k', 'non-existant'];
});
expect($('select-sk div', selector)).to.have.length(5);
// Check that options can be recovered.
selector.hideKeys = [];
expect($('select-sk div', selector)).to.have.length(8);
});
it('hides selector when custom page form expanded', async () => {
selector = await newInstance(undefined);
simulateUserToggle();
expect($$('.pageset-list', selector)).to.have.property('hidden', true);
});
it('clears custom pages when custom page form collapsed ', async () => {
selector = await newInstance(undefined);
simulateUserToggle();
simulateUserEnteringCustomPages('example.com');
expect(selector).to.have.property('customPages', 'example.com');
expect($$('.pageset-list', selector)).to.have.property('hidden', true);
simulateUserToggle();
expect($$('.pageset-list', selector)).to.have.property('hidden', false);
expect(selector).to.have.property('customPages', '');
});
it('disables custom page form on disable-custom-webpages', async () => {
selector = await newInstance((ele) => {
ele.setAttribute('disable-custom-webpages', '');
});
expect(selector.querySelectorAll('expandable-textarea-sk').length).to.equal(
0
);
expect(selector.querySelectorAll('select-sk').length).to.equal(1);
});
});