wix-style-react
Version:
102 lines (88 loc) • 3.81 kB
JavaScript
import React from 'react';
import autoCompleteDriverFactory from '../AutoComplete.driver';
import { autoCompleteUniDriverFactory } from '../AutoComplete.uni.driver';
import AutoComplete from '../AutoComplete';
import {
cleanup,
createRendererWithDriver,
createRendererWithUniDriver,
} from '../../../test/utils/unit';
const asciiA = '97';
describe('Autocomplete', () => {
describe('[sync]', () => {
runTests(createRendererWithDriver(autoCompleteDriverFactory));
});
describe('[async]', () => {
runTests(createRendererWithUniDriver(autoCompleteUniDriverFactory));
});
function runTests(render) {
const createDriver = jsx => render(jsx).driver;
afterEach(() => cleanup());
const options = [
{ id: 0, value: 'aaa' },
{ id: 1, value: 'abb' },
{ id: 2, value: 'bbb', disabled: true },
{ id: 3, value: 'bcc' },
{ id: 'divider1', value: '-' },
{ id: 'element1', value: <span style={{ color: 'brown' }}>ccc</span> },
];
const predicate = option =>
option.value.toString().toLowerCase().indexOf('a') !== -1;
it('should not filter anything without predicate function', async () => {
const { dropdownLayoutDriver } = createDriver(
<AutoComplete options={options} />,
);
expect(await dropdownLayoutDriver.optionsLength()).toBe(options.length);
});
['ArrowUp', 'ArrowDown'].forEach(key => {
it(`should not filter items according to predicate function when pressing ${key}`, async () => {
const { inputDriver, dropdownLayoutDriver } = createDriver(
<AutoComplete options={options} predicate={predicate} />,
);
await inputDriver.trigger('keyDown', { key });
expect(await dropdownLayoutDriver.optionsLength()).toBe(options.length);
});
});
it('should filter items according to predicate function when typing characters', async () => {
const { inputDriver, dropdownLayoutDriver } = createDriver(
<AutoComplete options={options} predicate={predicate} />,
);
await inputDriver.click();
await inputDriver.trigger('keyDown', { key: asciiA });
expect(await dropdownLayoutDriver.optionsLength()).toBe(2);
});
it('should not display dropdown layout in case all options are filtered', async () => {
const { inputDriver, dropdownLayoutDriver } = createDriver(
<AutoComplete options={options} predicate={() => false} />,
);
await inputDriver.click();
await inputDriver.trigger('keyDown', { key: asciiA });
expect(await dropdownLayoutDriver.optionsLength()).toBe(0);
});
it('should display empty state message in case all options are filtered', async () => {
const emptyStateMessage = 'Empty state';
const { inputDriver, dropdownLayoutDriver } = createDriver(
<AutoComplete
options={options}
predicate={() => false}
emptyStateMessage={<div>{emptyStateMessage}</div>}
/>,
);
await inputDriver.click();
await inputDriver.trigger('keyDown', { key: asciiA });
expect(await dropdownLayoutDriver.isShown()).toBe(true);
expect(await dropdownLayoutDriver.optionsLength()).toBe(1);
const option = (await dropdownLayoutDriver.options())[0];
expect(await option.content()).toBe(emptyStateMessage);
expect(await option.isDisabled()).toBe(true);
});
it('should show all items when focusing even if some text exist', async () => {
const { dropdownLayoutDriver, inputDriver } = createDriver(
<AutoComplete options={options} predicate={predicate} />,
);
await inputDriver.enterText('aaa');
await inputDriver.focus();
expect(await dropdownLayoutDriver.optionsLength()).toBe(options.length);
});
}
});