wix-style-react
Version:
384 lines (328 loc) • 12 kB
JavaScript
import React from 'react';
import { createUniDriverFactory } from 'wix-ui-test-utils/uni-driver-factory';
import Accordion, { accordionItemBuilder } from '../Accordion';
import { accordionPrivateDriverFactory } from '../Accordion.private.uni.driver';
import { buttonTypes, skins, horizontalPaddings } from '../constants';
import { createRendererWithUniDriver } from '../../../test/utils/react';
import { eventually } from '../../../test/utils/unit';
describe('Accordion', () => {
const FakeIcon = () => <div>fake icon</div>;
const createDriver = createUniDriverFactory(accordionPrivateDriverFactory);
describe('items', () => {
it('should render a list of items', async () => {
const items = [
{
title: 'first item',
},
];
const driver = createDriver(<Accordion items={items} />);
expect(await driver.getItemTitleAt(0)).toEqual('first item');
});
it('should render a subtitle for the item', async () => {
const subtitle = 'first accordion subtitle';
const items = [{ subtitle }];
const driver = createDriver(<Accordion items={items} />);
expect(await driver.getItemSubtitleAt(0)).toEqual(subtitle);
});
it('should not render any items', async () => {
const driver = createDriver(<Accordion />);
expect(await driver.getAmountOfItems()).toEqual(0);
});
it('should render item with icon', async () => {
const items = [
{
title: 'first item',
icon: <FakeIcon />,
children: 'first item content',
},
];
const driver = createDriver(<Accordion items={items} />);
expect(await driver.isIconExistsAt(0)).toBe(true);
});
it('should render item without an icon', async () => {
const items = [
{
title: 'first item',
children: 'first item content',
},
];
const driver = createDriver(<Accordion items={items} />);
expect(await driver.isIconExistsAt(0)).toBe(false);
});
});
describe('expand and collapse behavior', () => {
const collapsedSingleItem = [
{
title: 'first item',
icon: <FakeIcon />,
children: 'first item content',
expandLabel: 'see more',
collapseLabel: 'see less',
buttonType: buttonTypes.button,
onMouseEnter: jest.fn(),
},
];
const collapsedDisabledSingleItem = [
{
title: 'first item',
icon: <FakeIcon />,
children: 'first item content',
expandLabel: 'see more',
collapseLabel: 'see less',
buttonType: buttonTypes.button,
disabled: true,
onMouseEnter: jest.fn(),
},
];
const expandedSingleItemProps = {
title: 'First Row',
children: 'first row',
open: true,
};
const initiallyExpandedSingleItemProps = {
title: 'First Row',
children: 'first row',
initiallyOpen: true,
};
const singleItemWithTextButton = [
{
title: 'first item',
icon: <FakeIcon />,
children: 'first item content',
expandLabel: 'see more',
collapseLabel: 'see less',
buttonType: buttonTypes.textButton,
},
];
const multipleItems = [
{
title: 'first item',
icon: <FakeIcon />,
children: 'first item content',
expandLabel: 'see more',
collapseLabel: 'see less',
buttonType: buttonTypes.button,
},
{
title: 'second item',
icon: <FakeIcon />,
children: 'second item content',
expandLabel: 'see more',
collapseLabel: 'see less',
buttonType: buttonTypes.button,
},
];
it('should display a collapsed item by default', async () => {
const driver = createDriver(<Accordion items={collapsedSingleItem} />);
expect(await driver.isItemExpandedAt(0)).toBe(false);
});
it('should display an expanded item when open prop is true', async () => {
const driver = createDriver(
<Accordion items={[expandedSingleItemProps]} />,
);
expect(await driver.isItemExpandedAt(0)).toBe(true);
});
it('should expand an item on click', async () => {
const driver = createDriver(<Accordion items={collapsedSingleItem} />);
await driver.clickItemAt(0);
expect(await driver.isItemExpandedAt(0)).toBe(true);
});
it('should collapse an expanded item on click', async () => {
const driver = createDriver(<Accordion items={collapsedSingleItem} />);
await driver.clickItemAt(0);
expect(await driver.isItemExpandedAt(0)).toBe(true);
await driver.clickItemAt(0);
expect(await driver.isItemExpandedAt(0)).toBe(false);
});
it('should collapse an initially expanded item on click', async () => {
const driver = createDriver(
<Accordion items={[initiallyExpandedSingleItemProps]} />,
);
expect(await driver.isItemExpandedAt(0)).toBe(true);
await driver.clickItemAt(0);
expect(await driver.isItemExpandedAt(0)).toBe(false);
});
it('should accept an expand and collapse button labels', async () => {
const driver = createDriver(<Accordion items={collapsedSingleItem} />);
await driver.hoverOnItem(0);
expect(await driver.getToggleButtonLabelAt(0)).toEqual('see more');
await driver.clickToggleButtonAt(0);
expect(await driver.getToggleButtonLabelAt(0)).toEqual('see less');
});
it('should accept an expand and collapse button labels when using textButton', async () => {
const driver = createDriver(
<Accordion items={singleItemWithTextButton} />,
);
await driver.hoverOnItem(0);
expect(await driver.getToggleButtonLabelAt(0)).toEqual('see more');
await driver.clickToggleButtonAt(0);
expect(await driver.getToggleButtonLabelAt(0)).toEqual('see less');
});
it('should notify when hovering an item', async () => {
const driver = createDriver(<Accordion items={collapsedSingleItem} />);
await driver.hoverOnItem(0);
expect(collapsedSingleItem[0].onMouseEnter).toHaveBeenCalled();
});
it('should not notify hovering an item when item is disabled', async () => {
const driver = createDriver(
<Accordion items={collapsedDisabledSingleItem} />,
);
await driver.hoverOnItem(0);
expect(
collapsedDisabledSingleItem[0].onMouseEnter,
).not.toHaveBeenCalled();
});
it('should allow only a single item to be expanded by default', async () => {
const driver = createDriver(<Accordion items={multipleItems} />);
await driver.clickToggleButtonAt(0);
await driver.clickToggleButtonAt(1);
expect(await driver.isItemExpandedAt(0)).toBe(false);
expect(await driver.isItemExpandedAt(1)).toBe(true);
});
it('should update AccordionItems open prop dynamically', async () => {
const render = createRendererWithUniDriver(accordionPrivateDriverFactory);
const { driver, rerender } = render(
<Accordion
items={[
{
...expandedSingleItemProps,
open: false,
},
]}
/>,
);
expect(await driver.isItemExpandedAt(0)).toBe(false);
rerender(<Accordion items={[expandedSingleItemProps]} />);
expect(await driver.isItemExpandedAt(0)).toBe(true);
rerender(
<Accordion
items={[
{
...expandedSingleItemProps,
open: false,
},
]}
/>,
);
await eventually(async () => {
expect(await driver.isItemExpandedAt(0)).toBe(false);
});
});
});
// TODO - remove other tests once the old API is obsolete
describe('builders', () => {
it('should get title at first item', async () => {
const title = 'hello!';
const driver = createDriver(
<Accordion items={[accordionItemBuilder({ title })]} />,
);
expect(await driver.getItemTitleAt(0)).toBe(title);
expect(await driver.isIconExistsAt(0)).toBe(false);
expect(await driver.isItemExpandedAt(0)).toBe(false);
});
it('should render an icon', async () => {
const driver = createDriver(
<Accordion items={[accordionItemBuilder({ icon: <FakeIcon /> })]} />,
);
expect(await driver.isIconExistsAt(0)).toBe(true);
});
it('should expand first item (uncontrolled)', async () => {
const driver = createDriver(
<Accordion
items={[
accordionItemBuilder({
initiallyOpen: true,
}),
]}
/>,
);
expect(await driver.isItemExpandedAt(0)).toBe(true);
});
it('should expand first item (controlled)', async () => {
const driver = createDriver(
<Accordion
items={[
accordionItemBuilder({
open: true,
}),
]}
/>,
);
expect(await driver.isItemExpandedAt(0)).toBe(true);
});
it('should toggle first item (click button)', async () => {
const driver = createDriver(
<Accordion
items={[accordionItemBuilder({}), accordionItemBuilder({})]}
/>,
);
expect(await driver.isItemExpandedAt(0)).toBe(false);
expect(await driver.isItemExpandedAt(1)).toBe(false);
await driver.clickToggleButtonAt(0);
expect(await driver.isItemExpandedAt(0)).toBe(true);
expect(await driver.isItemExpandedAt(1)).toBe(false);
await driver.clickToggleButtonAt(1);
expect(await driver.isItemExpandedAt(0)).toBe(false);
expect(await driver.isItemExpandedAt(1)).toBe(true);
});
it('should toggle first item (click body)', async () => {
const driver = createDriver(
<Accordion
items={[accordionItemBuilder({}), accordionItemBuilder({})]}
/>,
);
expect(await driver.isItemExpandedAt(0)).toBe(false);
expect(await driver.isItemExpandedAt(1)).toBe(false);
await driver.clickItemAt(0);
expect(await driver.isItemExpandedAt(0)).toBe(true);
expect(await driver.isItemExpandedAt(1)).toBe(false);
await driver.clickItemAt(1);
expect(await driver.isItemExpandedAt(0)).toBe(false);
expect(await driver.isItemExpandedAt(1)).toBe(true);
});
it('should animate with transition speed', async () => {
const driver = createDriver(
<Accordion
transitionSpeed="fast"
items={[accordionItemBuilder({}), accordionItemBuilder({})]}
/>,
);
expect(await driver.getTransitionSpeed()).toBe('fast');
});
describe('skin', () => {
it("default skin should be 'standard'", async () => {
const driver = createDriver(
<Accordion items={[accordionItemBuilder({})]} />,
);
expect(await driver.getSkin()).toBe(skins.standard);
});
it("should set 'neutral' skin", async () => {
const driver = createDriver(
<Accordion skin={skins.neutral} items={[accordionItemBuilder({})]} />,
);
expect(await driver.getSkin()).toBe(skins.neutral);
});
});
describe('horizontalPadding', () => {
it("default horizontalPadding should be 'large'", async () => {
const driver = createDriver(
<Accordion items={[accordionItemBuilder({})]} />,
);
expect(await driver.getHorizontalPadding()).toBe(
horizontalPaddings.large,
);
});
it("should set 'tiny' horizontalPadding", async () => {
const driver = createDriver(
<Accordion
horizontalPadding={horizontalPaddings.tiny}
items={[accordionItemBuilder({})]}
/>,
);
expect(await driver.getHorizontalPadding()).toBe(
horizontalPaddings.tiny,
);
});
});
});
});