diff --git a/front/.storybook/preview.ts b/front/.storybook/preview.ts index 0a39fad8a..b40df9268 100644 --- a/front/.storybook/preview.ts +++ b/front/.storybook/preview.ts @@ -1,8 +1,9 @@ import { initialize, mswDecorator } from 'msw-storybook-addon'; import { Preview } from '@storybook/react'; import { ThemeProvider } from '@emotion/react'; -import { withThemeFromJSXProvider } from "@storybook/addon-styling"; +import { withThemeFromJSXProvider } from '@storybook/addon-styling'; import { lightTheme, darkTheme } from '../src/modules/ui/themes/themes'; +import { RootDecorator } from '../src/testing/decorators'; initialize(); @@ -10,13 +11,14 @@ const preview: Preview = { decorators: [ mswDecorator, withThemeFromJSXProvider({ - themes: { - light: lightTheme, - dark: darkTheme, - }, - defaultTheme: "light", - Provider: ThemeProvider, - }) + themes: { + light: lightTheme, + dark: darkTheme, + }, + defaultTheme: 'light', + Provider: ThemeProvider, + }), + RootDecorator, ], parameters: { actions: { argTypesRegex: '^on[A-Z].*' }, @@ -29,4 +31,4 @@ const preview: Preview = { }, }; -export default preview; \ No newline at end of file +export default preview; diff --git a/front/src/__stories__/shared.tsx b/front/src/__stories__/shared.tsx index 9b3093ec9..b00a83017 100644 --- a/front/src/__stories__/shared.tsx +++ b/front/src/__stories__/shared.tsx @@ -1,7 +1,6 @@ import { MemoryRouter } from 'react-router-dom'; -import { ApolloProvider } from '@apollo/client'; import { ThemeProvider } from '@emotion/react'; -import { RecoilRoot, useRecoilState } from 'recoil'; +import { useRecoilState } from 'recoil'; import { currentUserState } from '@/auth/states/currentUserState'; import { isAuthenticatingState } from '@/auth/states/isAuthenticatingState'; @@ -9,7 +8,6 @@ import { darkTheme } from '@/ui/themes/themes'; import { App } from '~/App'; import { FullHeightStorybookLayout } from '~/testing/FullHeightStorybookLayout'; import { mockedUsersData } from '~/testing/mock-data/users'; -import { mockedClient } from '~/testing/mockedClient'; export const render = () => renderWithDarkMode(false); @@ -33,16 +31,12 @@ export const renderWithDarkMode = (forceDarkMode?: boolean) => { ); return ( - - - - {forceDarkMode ? ( - {AppInStoryBook} - ) : ( - AppInStoryBook - )} - - - + + {forceDarkMode ? ( + {AppInStoryBook} + ) : ( + AppInStoryBook + )} + ); }; diff --git a/front/src/modules/ui/components/editable-cell/__stories__/EditableCellText.stories.tsx b/front/src/modules/ui/components/editable-cell/__stories__/EditableCellText.stories.tsx new file mode 100644 index 000000000..716418b9d --- /dev/null +++ b/front/src/modules/ui/components/editable-cell/__stories__/EditableCellText.stories.tsx @@ -0,0 +1,46 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { userEvent, within } from '@storybook/testing-library'; + +import { + CellPositionDecorator, + ComponentDecorator, +} from '~/testing/decorators'; + +import { EditableCellText } from '../types/EditableCellText'; + +const meta: Meta = { + title: 'UI/EditableCell/EditableCellText', + component: EditableCellText, + decorators: [ComponentDecorator, CellPositionDecorator], + args: { + value: 'Content', + }, +}; + +export default meta; +type Story = StoryObj; + +export const DisplayMode: Story = { + render: EditableCellText, +}; + +export const SoftFocusMode: Story = { + ...DisplayMode, + play: async ({ canvasElement, step }) => { + const canvas = within(canvasElement); + await step('Click once', () => + userEvent.click(canvas.getByText('Content')), + ); + }, +}; + +export const EditMode: Story = { + ...DisplayMode, + play: async ({ canvasElement, step }) => { + const canvas = within(canvasElement); + const click = async () => userEvent.click(canvas.getByText('Content')); + + await step('Click once', click); + await step('Click twice', click); + }, +}; diff --git a/front/src/modules/ui/components/table/table-header/__stories__/TableHeader.stories.tsx b/front/src/modules/ui/components/table/table-header/__stories__/TableHeader.stories.tsx index 2cca7e5ec..f26c6012f 100644 --- a/front/src/modules/ui/components/table/table-header/__stories__/TableHeader.stories.tsx +++ b/front/src/modules/ui/components/table/table-header/__stories__/TableHeader.stories.tsx @@ -2,9 +2,9 @@ import type { Meta, StoryObj } from '@storybook/react'; import { userEvent, within } from '@storybook/testing-library'; import { IconList } from '@/ui/icons/index'; +import { availableSorts } from '~/pages/companies/companies-sorts'; import { getRenderWrapperForEntityTableComponent } from '~/testing/renderWrappers'; -import { availableSorts } from '../../../../../../pages/companies/companies-sorts'; import { TableHeader } from '../TableHeader'; const meta: Meta = { diff --git a/front/src/testing/decorators.tsx b/front/src/testing/decorators.tsx new file mode 100644 index 000000000..d8788f2c6 --- /dev/null +++ b/front/src/testing/decorators.tsx @@ -0,0 +1,32 @@ +import { ApolloProvider } from '@apollo/client'; +import { Decorator } from '@storybook/react'; +import { RecoilRoot } from 'recoil'; + +import { RecoilScope } from '../modules/recoil-scope/components/RecoilScope'; +import { CellContext } from '../modules/ui/tables/states/CellContext'; +import { RowContext } from '../modules/ui/tables/states/RowContext'; + +import { ComponentStorybookLayout } from './ComponentStorybookLayout'; +import { mockedClient } from './mockedClient'; + +export const RootDecorator: Decorator = (Story) => ( + + + + + +); + +export const ComponentDecorator: Decorator = (Story) => ( + + + +); + +export const CellPositionDecorator: Decorator = (Story) => ( + + + + + +); diff --git a/front/src/testing/renderWrappers.tsx b/front/src/testing/renderWrappers.tsx index eb06be001..37e45b16c 100644 --- a/front/src/testing/renderWrappers.tsx +++ b/front/src/testing/renderWrappers.tsx @@ -1,8 +1,6 @@ import React from 'react'; import { HotkeysProvider } from 'react-hotkeys-hook'; import { MemoryRouter } from 'react-router-dom'; -import { ApolloProvider } from '@apollo/client'; -import { RecoilRoot } from 'recoil'; import { INITIAL_HOTKEYS_SCOPES } from '@/hotkeys/constants'; import { RecoilScope } from '@/recoil-scope/components/RecoilScope'; @@ -15,7 +13,6 @@ import { UserProvider } from '~/providers/user/UserProvider'; import { ComponentStorybookLayout } from './ComponentStorybookLayout'; import { FullHeightStorybookLayout } from './FullHeightStorybookLayout'; -import { mockedClient } from './mockedClient'; export function getRenderWrapperForPage( children: React.ReactElement, @@ -23,34 +20,24 @@ export function getRenderWrapperForPage( ) { return function render() { return ( - - - - - - - - {children} - - - - - - - + + + + + + {children} + + + + + ); }; } export function getRenderWrapperForComponent(children: React.ReactElement) { return function render() { - return ( - - - {children} - - - ); + return {children}; }; } @@ -59,17 +46,16 @@ export function getRenderWrapperForEntityTableComponent( ) { return function Render() { return ( - - - - - {children} - - - + + {/* + TODO: add company mocked loader + + {children} + ); }; }