Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(vr-tests-react-components): migrate to new StoryWright api to define Steps to resolve VR snapshoting issues #33860

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
fix(vr-tests-react-components): migrate to new StoryWright api to def…
…ine Steps to resolve VR snapshoting issues
  • Loading branch information
Hotell committed Feb 27, 2025
commit aca35434cfe4710969cdd2c28a927e65a2d29f0f
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@ import { mergeClasses } from '@griffel/react';
import { propValues, useStyles } from './utils';
import type { Meta } from '@storybook/react';
import { getStoryVariant, DARK_MODE, HIGH_CONTRAST } from '../../utilities';
import { Steps, type StoryParameters } from 'storywright';

const BadgeAppearanceTemplate: React.FC<{ appearance: Required<BadgeProps>['appearance'] }> = ({ appearance }) => {
const styles = useStyles();
@@ -77,6 +78,7 @@ const BadgeAppearanceTemplate: React.FC<{ appearance: Required<BadgeProps>['appe

export default {
title: 'Badge Converged',
parameters: { storyWright: { steps: new Steps().snapshot('normal').end() } } satisfies StoryParameters,
} satisfies Meta<typeof Badge>;

export const Filled = () => <BadgeAppearanceTemplate appearance={'filled'} />;
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import { CircleRegular } from '@fluentui/react-icons';
import { propValues, useStyles } from './utils';
import type { Meta } from '@storybook/react';
import { getStoryVariant, RTL } from '../../utilities';
import { Steps, type StoryParameters } from 'storywright';

const BadgeSampleRow: React.FC<BadgeProps> = props => {
const styles = useStyles();
@@ -35,6 +36,7 @@ const BadgeSampleRow: React.FC<BadgeProps> = props => {

export default {
title: 'Badge Converged',
parameters: { storyWright: { steps: new Steps().snapshot('normal').end() } } satisfies StoryParameters,
} satisfies Meta<typeof Badge>;

export const SizeTiny = () => {
Original file line number Diff line number Diff line change
@@ -2,15 +2,16 @@ import * as React from 'react';
import { Button } from '@fluentui/react-button';
import { bundleIcon, CalendarMonthFilled, CalendarMonthRegular } from '@fluentui/react-icons';
import type { Meta } from '@storybook/react';
import { getStoryVariant, withStoryWrightSteps, DARK_MODE, HIGH_CONTRAST, RTL } from '../../utilities';
import { getStoryVariant, DARK_MODE, HIGH_CONTRAST, RTL } from '../../utilities';
import { buttonId, steps, useStyles } from './utils';
import type { StoryParameters } from 'storywright';

const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular);

export default {
title: 'Button Converged',
component: Button,
decorators: [story => withStoryWrightSteps({ story, steps })],
parameters: { storyWright: { steps } } satisfies StoryParameters,
} satisfies Meta<typeof Button>;

export const Default = () => <Button id={buttonId}>Hello, world</Button>;
Original file line number Diff line number Diff line change
@@ -2,15 +2,16 @@ import * as React from 'react';
import { CompoundButton } from '@fluentui/react-button';
import { bundleIcon, CalendarMonthFilled, CalendarMonthRegular } from '@fluentui/react-icons';
import type { Meta } from '@storybook/react';
import { getStoryVariant, withStoryWrightSteps, RTL } from '../../utilities';
import { getStoryVariant, RTL } from '../../utilities';
import { buttonId, steps, useStyles } from './utils';
import type { StoryParameters } from 'storywright';

const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular);

export default {
title: 'CompoundButton Converged',
component: CompoundButton,
decorators: [story => withStoryWrightSteps({ story, steps })],
parameters: { storyWright: { steps } } satisfies StoryParameters,
} satisfies Meta<typeof CompoundButton>;

export const Outline = () => (
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import * as React from 'react';
import { Steps } from 'storywright';
import { Steps, type StoryParameters } from 'storywright';
import { CompoundButton } from '@fluentui/react-button';
import { bundleIcon, CalendarMonthFilled, CalendarMonthRegular } from '@fluentui/react-icons';
import type { Meta } from '@storybook/react';
import { getStoryVariant, withStoryWrightSteps, RTL } from '../../utilities';
import { getStoryVariant, RTL } from '../../utilities';
import { buttonId } from './utils';

const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular);
@@ -20,7 +20,7 @@ const steps = new Steps()
export default {
title: 'CompoundButton Converged',
component: CompoundButton,
decorators: [story => withStoryWrightSteps({ story, steps })],
parameters: { storyWright: { steps } } satisfies StoryParameters,
} satisfies Meta<typeof CompoundButton>;

export const Default = () => (
Original file line number Diff line number Diff line change
@@ -2,15 +2,16 @@ import * as React from 'react';
import { MenuButton } from '@fluentui/react-button';
import { bundleIcon, CalendarMonthFilled, CalendarMonthRegular } from '@fluentui/react-icons';
import type { Meta } from '@storybook/react';
import { getStoryVariant, withStoryWrightSteps, RTL } from '../../utilities';
import { getStoryVariant, RTL } from '../../utilities';
import { buttonId, steps, useStyles } from './utils';
import type { StoryParameters } from 'storywright';

const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular);

export default {
title: 'MenuButton Converged',
component: MenuButton,
decorators: [story => withStoryWrightSteps({ story, steps })],
parameters: { storyWright: { steps } } satisfies StoryParameters,
} satisfies Meta<typeof MenuButton>;

export const Default = () => <MenuButton id={buttonId}>Hello, world</MenuButton>;
Original file line number Diff line number Diff line change
@@ -2,15 +2,16 @@ import * as React from 'react';
import { SplitButton } from '@fluentui/react-button';
import { bundleIcon, CalendarMonthFilled, CalendarMonthRegular } from '@fluentui/react-icons';
import type { Meta } from '@storybook/react';
import { getStoryVariant, withStoryWrightSteps, DARK_MODE, HIGH_CONTRAST, RTL } from '../../utilities';
import { getStoryVariant, DARK_MODE, HIGH_CONTRAST, RTL } from '../../utilities';
import { buttonId, steps, useStyles } from './utils';
import type { StoryParameters } from 'storywright';

const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular);

export default {
title: 'SplitButton Converged',
component: SplitButton,
decorators: [story => withStoryWrightSteps({ story, steps })],
parameters: { storyWright: { steps } } satisfies StoryParameters,
} satisfies Meta<typeof SplitButton>;

export const Default = () => <SplitButton id={buttonId}>Hello, world</SplitButton>;
Original file line number Diff line number Diff line change
@@ -2,15 +2,16 @@ import * as React from 'react';
import { ToggleButton } from '@fluentui/react-button';
import { bundleIcon, CalendarMonthFilled, CalendarMonthRegular } from '@fluentui/react-icons';
import type { Meta } from '@storybook/react';
import { getStoryVariant, withStoryWrightSteps, DARK_MODE, HIGH_CONTRAST, RTL } from '../../utilities';
import { getStoryVariant, DARK_MODE, HIGH_CONTRAST, RTL } from '../../utilities';
import { buttonId, steps, useStyles } from './utils';
import type { StoryParameters } from 'storywright';

const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular);

export default {
title: 'ToggleButton Converged',
component: ToggleButton,
decorators: [story => withStoryWrightSteps({ story, steps })],
parameters: { storyWright: { steps } } satisfies StoryParameters,
} satisfies Meta<typeof ToggleButton>;

export const Default = () => <ToggleButton id={buttonId}>Hello, world</ToggleButton>;
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import { Steps, StoryWright } from 'storywright';
import { Steps, type StoryParameters } from 'storywright';
import { Card, CardHeader, CardPreview } from '@fluentui/react-card';
import { MoreHorizontal24Filled, MoreHorizontal20Filled } from '@fluentui/react-icons';
import { Body1, Caption1, Text } from '@fluentui/react-text';
@@ -15,13 +15,14 @@ export default {

decorators: [
story => (
<StoryWright steps={new Steps().snapshot('normal', { cropTo: '.testWrapper' }).end()}>
<div className="testWrapper" style={{ width: '600px' }}>
{story()}
</div>
</StoryWright>
<div className="testWrapper" style={{ width: '600px' }}>
{story()}
</div>
),
],
parameters: {
storyWright: { steps: new Steps().snapshot('normal', { cropTo: '.testWrapper' }).end() },
} satisfies StoryParameters,
} satisfies Meta<typeof Card>;

export const CardTemplates = () => (
Original file line number Diff line number Diff line change
@@ -4,6 +4,8 @@ import { DARK_MODE, getStoryVariant, RTL, TestWrapperDecorator } from '../../uti
import { Steps, StoryWright } from 'storywright';
import { Legend, Legends } from '@fluentui/react-charts-preview';

const overflowText = 'Overflow Items';

export default {
title: 'Charts/Legend',

@@ -13,7 +15,16 @@ export default {
const steps = context.name.includes('Overflow')
? new Steps()
.snapshot('default', { cropTo: '.testWrapper' })
.executeScript(`document.querySelectorAll('div[class^="overflowIndicationTextStyle"]')[0].click()`)
.executeScript(
`document.evaluate(
"//button[contains(text(), 'Overflow Items')]",
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue
.click()`,
)
.snapshot('expanded', { cropTo: '.testWrapper' })
.end()
: new Steps().snapshot('default', { cropTo: '.testWrapper' }).end();
@@ -278,7 +289,7 @@ export const Overflow = () => {
<div style={{ width: 400, height: 600, padding: 10, display: 'flex' }}>
<Legends
legends={legends}
overflowText={'Overflow Items'}
overflowText={overflowText}
allowFocusOnLegends={true}
canSelectMultipleLegends={false}
/>
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@ export default {
<StoryWright
steps={new Steps()
.snapshot('default', { cropTo: '.testWrapper' })
.hover('[role=option]')
.hover('input')
.snapshot('hover', { cropTo: '.testWrapper' })
.keys('input', 'ArrowDown')
.snapshot('active option', { cropTo: '.testWrapper' })
Original file line number Diff line number Diff line change
@@ -10,10 +10,14 @@ import type {
} from '@fluentui/react-button';
import { FluentProvider, FluentProviderCustomStyleHooks } from '@fluentui/react-provider';
import { makeStyles, mergeClasses, shorthands } from '@griffel/react';
import { type StoryParameters, Steps } from 'storywright';

export default {
title: 'FluentProvider CustomStyleHooks',
component: FluentProvider,
parameters: {
storyWright: { steps: new Steps().snapshot('normal').end() },
} satisfies StoryParameters,
} satisfies Meta<typeof FluentProvider>;

export const Default = () => <FluentProvider>Hello, world</FluentProvider>;
Original file line number Diff line number Diff line change
@@ -13,9 +13,9 @@ export default {
<StoryWright
steps={new Steps()
.snapshot('default', { cropTo: '.testWrapper' })
.hover('input')
.hover('[role=combobox]')
.snapshot('hover', { cropTo: '.testWrapper' })
.focus('input')
.focus('[role=combobox]')
.wait(250) // let focus border animation finish
.snapshot('focused', { cropTo: '.testWrapper' })
.end()}
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@ export default {
<StoryWright
steps={new Steps()
.snapshot('default', { cropTo: '.testWrapper' })
.hover('[role=option]')
.hover('[role=combobox]')
.snapshot('hover', { cropTo: '.testWrapper' })
.keys('input', 'ArrowDown')
.snapshot('active option', { cropTo: '.testWrapper' })
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import * as React from 'react';
import type { Meta } from '@storybook/react';
import { StoryWright } from 'storywright';
import {
Menu,
MenuTrigger,
@@ -17,8 +16,6 @@ import { DARK_MODE, getStoryVariant, HIGH_CONTRAST, RTL } from '../../utilities'

export default {
title: 'Menu Converged - groups',

decorators: [story => <StoryWright>{story()}</StoryWright>],
} satisfies Meta<typeof Menu>;

export const Default = () => (
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import * as React from 'react';
import type { Meta } from '@storybook/react';
import { Menu, MenuTrigger, MenuPopover, MenuList, MenuItemCheckbox, MenuItem } from '@fluentui/react-menu';
import { StoryWright } from 'storywright';
import { CutRegular, CutFilled, bundleIcon } from '@fluentui/react-icons';

const CutIcon = bundleIcon(CutFilled, CutRegular);

export default {
title: 'Menu Converged - selection',
decorators: [story => <StoryWright>{story()}</StoryWright>],
} satisfies Meta<typeof Menu>;

export const SelectableWithLongText = () => (
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import * as React from 'react';
import type { Meta } from '@storybook/react';
import { StoryWright } from 'storywright';
import { Menu, MenuTrigger, MenuPopover, MenuList, MenuItem, MenuDivider } from '@fluentui/react-menu';
import { CutRegular, ClipboardPasteRegular } from '@fluentui/react-icons';

import { getStoryVariant, RTL } from '../../utilities';

export default {
title: 'Menu Converged - long content',

decorators: [story => <StoryWright>{story()}</StoryWright>],
} satisfies Meta<typeof Menu>;

export const Default = () => (
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
import * as React from 'react';
import type { Meta } from '@storybook/react';
import { ProgressBar } from '@fluentui/react-progress';
import { Steps } from 'storywright';
import { Steps, type StoryParameters } from 'storywright';
import { makeStyles } from '@griffel/react';

import {
getStoryVariant,
withStoryWrightSteps,
TestWrapperDecoratorFixedWidth,
DARK_MODE,
HIGH_CONTRAST,
RTL,
} from '../utilities';
import { getStoryVariant, TestWrapperDecoratorFixedWidth, DARK_MODE, HIGH_CONTRAST, RTL } from '../utilities';

const useStyles = makeStyles({
paused: {
@@ -25,10 +18,10 @@ const useStyles = makeStyles({
export default {
title: 'ProgressBar converged',

decorators: [
TestWrapperDecoratorFixedWidth,
story => withStoryWrightSteps({ story, steps: new Steps().snapshot('default', { cropTo: '.testWrapper' }).end() }),
],
decorators: [TestWrapperDecoratorFixedWidth],
parameters: {
storyWright: { steps: new Steps().snapshot('default', { cropTo: '.testWrapper' }).end() },
} satisfies StoryParameters,
} satisfies Meta<typeof ProgressBar>;

export const IndeterminateThickness = () => (
19 changes: 6 additions & 13 deletions apps/vr-tests-react-components/src/stories/Skeleton.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
import * as React from 'react';
import type { Meta } from '@storybook/react';
import { Skeleton, SkeletonItem } from '@fluentui/react-skeleton';
import { Steps } from 'storywright';
import { Steps, type StoryParameters } from 'storywright';
import { makeStyles } from '@griffel/react';

import {
getStoryVariant,
withStoryWrightSteps,
TestWrapperDecoratorFixedWidth,
HIGH_CONTRAST,
DARK_MODE,
RTL,
} from '../utilities';
import { getStoryVariant, TestWrapperDecoratorFixedWidth, HIGH_CONTRAST, DARK_MODE, RTL } from '../utilities';

const useStyles = makeStyles({
paused: {
@@ -25,10 +18,10 @@ const useStyles = makeStyles({
export default {
title: 'Skeleton converged',

decorators: [
TestWrapperDecoratorFixedWidth,
story => withStoryWrightSteps({ story, steps: new Steps().snapshot('default', { cropTo: '.testWrapper' }).end() }),
],
decorators: [TestWrapperDecoratorFixedWidth],
parameters: {
storyWright: { steps: new Steps().snapshot('default', { cropTo: '.testWrapper' }).end() },
} satisfies StoryParameters,
} satisfies Meta<typeof Skeleton>;

export const OpaqueSkeletonWithRectangle = () => (
Loading
Oops, something went wrong.