wix-style-react
Version:
405 lines (368 loc) • 11.7 kB
JavaScript
import React from 'react';
import { storiesOf } from '@storybook/react';
import { uniTestkitFactoryCreator } from 'wix-ui-test-utils/vanilla';
import Sidebar from '..';
import Box from '../../Box';
import { Layout } from '../../Layout';
import { sidebarSkins } from '../constants';
import WixStyleReactProvider from '../../WixStyleReactProvider';
import SidebarSectionItem from '../../SidebarSectionItem';
import SidebarBackButton from '../../SidebarBackButton';
import sidebarSectionItemDriver from '../../SidebarSectionItem/SidebarSectionItem.uni.driver';
import { sidebarBackButtonDriverFactory } from '../../SidebarBackButton/SidebarBackButton.uni.driver';
const sidebarSectionItemTestkitFactory = uniTestkitFactoryCreator(
sidebarSectionItemDriver,
);
const sidebarBackButtonTestkitFactory = uniTestkitFactoryCreator(
sidebarBackButtonDriverFactory,
);
const createItemDriver = dataHook =>
sidebarSectionItemTestkitFactory({
wrapper: document.body,
dataHook,
});
const createBackButtonDriver = dataHook =>
sidebarBackButtonTestkitFactory({
wrapper: document.body,
dataHook,
});
const navigateClickInnerItemSideEffect = async () => {
const appsDriver = createItemDriver('apps');
await appsDriver.click();
const appsMarketDriver = createItemDriver('app-market');
await appsMarketDriver.click();
};
const navigateClickOpenParentSideEffect = async () => {
const appsDriver = createItemDriver('apps');
await appsDriver.click();
await appsDriver.click();
};
const navigateClickOther1stLevelItemSideEffect = async () => {
const appsDriver = createItemDriver('apps');
const settingsDriver = createItemDriver('settings');
await appsDriver.click();
await settingsDriver.click();
};
const navigateClickBackSideEffect = async () => {
const appsDriver = createItemDriver('apps');
await appsDriver.click();
const backButtonDriver = createBackButtonDriver('back');
await backButtonDriver.click();
};
const testsWithWsrProvider = [
{
describe: 'sidebarExperimentCollapsible',
its: [
{
it: 'should render sidebar',
sideefect: () => {},
},
{
it: 'should navigate',
sideEffect: navigateClickInnerItemSideEffect,
},
{
it: 'should collapse parent on second click',
sideEffect: navigateClickOpenParentSideEffect,
},
{
it: 'should collapse open menu when clicking other first level item',
sideEffect: navigateClickOther1stLevelItemSideEffect,
},
],
},
];
const SidebarNavigation = ({ executeSideEffect }) => {
React.useEffect(() => {
async function sideEffect() {
if (executeSideEffect) {
await executeSideEffect();
}
return;
}
sideEffect();
}, [executeSideEffect]);
return (
<Sidebar selectedKey={'settings'}>
<Sidebar.Item itemKey={'settings'} key={'settings'}>
<SidebarSectionItem dataHook="settings">Settings</SidebarSectionItem>
</Sidebar.Item>
<Sidebar.Item
itemKey={'apps'}
innerMenu={[
<Sidebar.BackButton key={'back'}>
<SidebarBackButton dataHook="back">Main Menu</SidebarBackButton>
</Sidebar.BackButton>,
<Sidebar.Item itemKey={'app-market'} key={'app-market'}>
<SidebarSectionItem dataHook="app-market">
App Market
</SidebarSectionItem>
</Sidebar.Item>,
<SidebarSectionItem key={'manage-apps'}>
Manage Apps
</SidebarSectionItem>,
]}
>
<SidebarSectionItem dataHook="apps" drillable>
Apps
</SidebarSectionItem>
</Sidebar.Item>
</Sidebar>
);
};
const SidebarWithDisabledInnerItems = () => {
return (
<Sidebar selectedKey={'app-market'}>
<Sidebar.Item itemKey={'settings'} key={'settings'}>
<SidebarSectionItem dataHook="settings">Settings</SidebarSectionItem>
</Sidebar.Item>
<Sidebar.Item
itemKey={'apps'}
innerMenu={[
<Sidebar.BackButton key={'back'}>
<SidebarBackButton dataHook="back">Main Menu</SidebarBackButton>
</Sidebar.BackButton>,
<Sidebar.Item itemKey={'app-market'} key={'app-market'}>
<SidebarSectionItem dataHook="app-market">
App Market
</SidebarSectionItem>
</Sidebar.Item>,
<SidebarSectionItem
disabled
itemKey={'manage-apps'}
key={'manage-apps'}
>
Manage Apps
</SidebarSectionItem>,
]}
>
<SidebarSectionItem dataHook="apps" drillable>
Apps
</SidebarSectionItem>
</Sidebar.Item>
</Sidebar>
);
};
export const runTests = (
{ themeName, testWithTheme } = { testWithTheme: i => i },
) => {
const storiesTitle = `${themeName ? `${themeName}|` : ''}Sidebar`;
testsWithWsrProvider.forEach(({ describe, its }) =>
its.map(({ it, sideEffect }) =>
storiesOf(`${storiesTitle}/${describe}`, module).add(it, () =>
testWithTheme(
<div style={{ height: '500px', color: 'white' }}>
<WixStyleReactProvider
features={{
sidebarExperimentCollapsible: true,
}}
>
<SidebarNavigation executeSideEffect={sideEffect} />
</WixStyleReactProvider>
</div>,
),
),
),
);
storiesOf(storiesTitle, module).add('Sanity', () =>
testWithTheme(
<div style={{ height: '500px', color: 'white' }}>
<Sidebar selectedKey={'item1'}>
<Sidebar.PersistentHeader>
<div
style={{
textAlign: 'center',
fontSize: '20px',
margin: '10px',
}}
>
Simple Sidebar
</div>
</Sidebar.PersistentHeader>
<Sidebar.Item
itemKey={'item1'}
innerMenu={[
<Sidebar.BackButton>
<div>Back</div>
</Sidebar.BackButton>,
<Sidebar.Item itemKey={'item4'}>
<div>Inner Item 1</div>
</Sidebar.Item>,
<Sidebar.Item itemKey={'item5'}>
<div>Inner Item 2</div>
</Sidebar.Item>,
]}
>
<div>Item with internal navigation</div>
</Sidebar.Item>
<Sidebar.Item itemKey={'item2'} disable="true">
<div disable="true">Disabled item</div>
</Sidebar.Item>
<Sidebar.Item itemKey={'item3'}>
<div>A simple clickable item</div>
</Sidebar.Item>
<Sidebar.PersistentFooter>
<div
style={{
textAlign: 'center',
fontSize: '20px',
margin: '10px',
}}
>
Sidebar Footer
</div>
</Sidebar.PersistentFooter>
</Sidebar>
</div>,
),
);
storiesOf(storiesTitle, module).add('Light', () =>
testWithTheme(
<div style={{ height: '500px', backgroundColor: '#f9f9f9' }}>
<Sidebar selectedKey={'item1'} skin="light">
<Sidebar.PersistentHeader>
<div
style={{ textAlign: 'center', fontSize: '20px', margin: '10px' }}
>
Simple Sidebar
</div>
</Sidebar.PersistentHeader>
<Sidebar.Item
itemKey={'item1'}
innerMenu={[
<Sidebar.BackButton>
<div>Back</div>
</Sidebar.BackButton>,
<Sidebar.Item itemKey={'item4'}>
<div>Inner Item 1</div>
</Sidebar.Item>,
<Sidebar.Item itemKey={'item5'}>
<div>Inner Item 2</div>
</Sidebar.Item>,
]}
>
<div>Item with internal navigation</div>
</Sidebar.Item>
<Sidebar.Item itemKey={'item2'} disable="true">
<div disable="true">Disabled item</div>
</Sidebar.Item>
<Sidebar.Item itemKey={'item3'}>
<div>A simple clickable item</div>
</Sidebar.Item>
<Sidebar.PersistentFooter>
<div
style={{ textAlign: 'center', fontSize: '20px', margin: '10px' }}
>
Sidebar Footer
</div>
</Sidebar.PersistentFooter>
</Sidebar>
</div>,
),
);
storiesOf(storiesTitle, module).add('Hidden', () =>
testWithTheme(
<div style={{ height: '500px', color: 'white' }}>
<Sidebar selectedKey={'item1'} isHidden>
<Sidebar.PersistentHeader>
<div
style={{ textAlign: 'center', fontSize: '20px', margin: '10px' }}
>
Simple Sidebar
</div>
</Sidebar.PersistentHeader>
<Sidebar.Item itemKey={'item1'}>
<div>A simple clickable item</div>
</Sidebar.Item>
<Sidebar.PersistentFooter>
<div
style={{ textAlign: 'center', fontSize: '20px', margin: '10px' }}
>
Sidebar Footer
</div>
</Sidebar.PersistentFooter>
</Sidebar>
</div>,
),
);
storiesOf(storiesTitle, module).add('Scrollbar', () => {
const skins = Object.values(sidebarSkins);
return testWithTheme(
<Layout cols={skins.length}>
{skins.map(sidebarSkin => (
<Box height="500px">
<Sidebar skin={sidebarSkin}>
<Sidebar.PersistentHeader>
<Box
verticalAlign="middle"
align="center"
color="red"
height="100px"
fontSize="20px"
margin="10px"
>
Header
</Box>
</Sidebar.PersistentHeader>
<Sidebar.Item>
<Box
color="red"
height="500px"
align="center"
fontSize="20px"
margin="10px"
>
Sidebar Item
</Box>
</Sidebar.Item>
<Sidebar.PersistentFooter>
<Box
verticalAlign="middle"
align="center"
color="red"
margin="10px"
fontSize="20px"
>
Sidebar Footer
</Box>
</Sidebar.PersistentFooter>
</Sidebar>
</Box>
))}
</Layout>,
);
});
storiesOf(storiesTitle, module).add('Navigation Back', () =>
testWithTheme(
<div style={{ height: '500px', color: 'white' }}>
<SidebarNavigation executeSideEffect={navigateClickBackSideEffect} />
</div>,
),
);
storiesOf(storiesTitle, module).add('Navigation', () =>
testWithTheme(
<div style={{ height: '500px', color: 'white' }}>
<SidebarNavigation
executeSideEffect={navigateClickInnerItemSideEffect}
/>
</div>,
),
);
storiesOf(storiesTitle, module).add('Disabled Inner Item', () =>
testWithTheme(
<Layout cols={2}>
{[true, false].map(sidebarExperimentCollapsible => (
<div style={{ height: '500px', color: 'white' }}>
<WixStyleReactProvider
features={{
sidebarExperimentCollapsible,
}}
>
<SidebarWithDisabledInnerItems />
</WixStyleReactProvider>
</div>
))}
</Layout>,
),
);
};