wix-style-react
Version:
189 lines (158 loc) • 6.58 kB
JavaScript
import React from 'react';
import {
createRendererWithDriver,
createRendererWithUniDriver,
cleanup,
} from '../../../test/utils/react';
import breadcrumbsDriverFactory from '../Breadcrumbs.driver';
import breadcrumbsPrivateDriverFactory from './Breadcrumbs.private.driver';
import { breadcrumbsUniDriverFactory } from '../Breadcrumbs.uni.driver';
import Breadcrumbs from '../Breadcrumbs';
const items = [
{ id: 0, value: 'Option 1' },
{ id: 1, value: 'Option 2' },
];
let onClick;
describe('Breadcrumbs', () => {
describe('[sync]', () => {
runTests(createRendererWithDriver(breadcrumbsDriverFactory));
});
describe('[async]', () => {
runTests(createRendererWithUniDriver(breadcrumbsUniDriverFactory));
});
function runTests(render) {
beforeEach(() => {
onClick = jest.fn();
});
afterEach(() => cleanup());
it('should have correct text on each breadcrumb', async () => {
const { driver } = render(<Breadcrumbs {...{ onClick, items }} />);
expect(await driver.breadcrumbsLength()).toBe(items.length);
expect(await driver.breadcrumbContentAt(0)).toBe(items[0].value);
expect(await driver.breadcrumbContentAt(1)).toBe(items[1].value);
});
it('should call onClick callback on click with correct item', async () => {
const { driver } = render(<Breadcrumbs {...{ onClick, items }} />);
const itemIndex = 1;
await driver.clickBreadcrumbAt(itemIndex);
expect(onClick).toBeCalledWith({
id: items[itemIndex].id,
value: 'Option 2',
});
});
it('should get correct size from props', async () => {
const size = 'large';
const { driver } = render(<Breadcrumbs {...{ onClick, items, size }} />);
expect(await driver.isLarge()).toBe(true);
});
it('should use medium size as default', async () => {
const { driver } = render(<Breadcrumbs {...{ onClick, items }} />);
expect(await driver.isMedium()).toBe(true);
});
it('should get theme from props', async () => {
const theme = 'onWhiteBackground';
const { driver } = render(<Breadcrumbs {...{ onClick, items, theme }} />);
expect(await driver.isOnWhiteBackground()).toBe(true);
});
it('should use default theme gray background', async () => {
const { driver } = render(<Breadcrumbs {...{ onClick, items }} />);
expect(await driver.isOnGrayBackground()).toBe(true);
});
it('should get active id from props and have correct class', async () => {
const itemIndex = 1;
const { driver } = render(
<Breadcrumbs {...{ onClick, items, activeId: items[itemIndex].id }} />,
);
expect(await driver.getActiveItemId()).toBe(itemIndex);
});
it('should return null if not exists active id', async () => {
const { driver } = render(<Breadcrumbs {...{ onClick, items }} />);
expect(await driver.getActiveItemId()).toBe(null);
});
describe('item with link attribute', () => {
const linkItems = [
{ id: 0, value: 'Option 1', link: '//www.wix.com' },
{ id: 1, value: 'Option 2', link: '//www.facebook.com' },
];
it('should not have links if link attribute is not given', async () => {
const { driver } = render(<Breadcrumbs {...{ items }} />);
expect(await driver.isActiveLinkAt(0)).toBe(false);
expect(await driver.isActiveLinkAt(1)).toBe(false);
});
it('should be a link if no activeId is given', async () => {
const { driver } = render(<Breadcrumbs {...{ items: linkItems }} />);
expect(await driver.isActiveLinkAt(0)).toBe(true);
expect(await driver.isActiveLinkAt(1)).toBe(true);
});
it('should not be a link if it is the item with activeId', async () => {
const { driver } = render(
<Breadcrumbs {...{ items: linkItems, activeId: 0 }} />,
);
expect(await driver.isActiveLinkAt(0)).toBe(false);
expect(await driver.isActiveLinkAt(1)).toBe(true);
});
});
describe('customElement attribute', () => {
const customItems = [
{
id: 0,
value: 'Option 1',
customElement: <a href="//www.wix.com">Option 1</a>,
},
{
id: 1,
value: 'Option 2',
customElement: <a href="//www.facebook.com">Option 2</a>,
},
];
const customItemsWithLinks = [
{
id: 0,
value: 'value',
customElement: <a href="//www.wix.com">Custom value</a>,
link: 'www.bla.com',
},
];
it('should render the customElement when given', async () => {
const { driver } = render(<Breadcrumbs {...{ items: customItems }} />);
expect(await driver.breadcrumbsLength()).toBe(customItems.length);
expect(await driver.breadcrumbContentAt(0)).toBe(customItems[0].value);
expect(await driver.breadcrumbContentAt(1)).toBe(customItems[1].value);
});
it('should render the customElement even if link attribute is given', async () => {
const { driver } = render(
<Breadcrumbs {...{ items: customItemsWithLinks }} />,
);
expect(await driver.breadcrumbsLength()).toBe(
customItemsWithLinks.length,
);
expect(await driver.breadcrumbContentAt(0)).toBe('Custom value');
});
it('should render the value attribute of the item when this is the activeId', async () => {
const { driver } = render(
<Breadcrumbs {...{ items: customItemsWithLinks, activeId: 0 }} />,
);
expect(await driver.breadcrumbContentAt(0)).toBe(
customItemsWithLinks[0].value,
);
});
});
it('should have correct classNames', async () => {
const { driver } = render(<Breadcrumbs {...{ items }} />);
expect(await driver.getLabelClassList(0)).toMatch(/Text/);
});
}
describe('fullwidth', () => {
it('should be true when given only one item', async () => {
const render = createRendererWithDriver(breadcrumbsPrivateDriverFactory);
const items = [{ id: 0, value: 'Option 1' }];
const { driver } = render(<Breadcrumbs {...{ items }} />);
expect(await driver.isItemFullWidth()).toBe(true);
});
it('should be false when given multiple items', async () => {
const render = createRendererWithDriver(breadcrumbsPrivateDriverFactory);
const { driver } = render(<Breadcrumbs {...{ items }} />);
expect(await driver.isItemFullWidth()).toBe(false);
});
});
});