test: Adopt jest testing in `ui-composer` (#35932)

pull/35942/head
Douglas Fabris 1 year ago committed by GitHub
parent f080aa788c
commit 6145b89cfe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 7
      packages/ui-composer/.storybook/main.ts
  2. 11
      packages/ui-composer/jest.config.ts
  3. 6
      packages/ui-composer/package.json
  4. 19
      packages/ui-composer/src/MessageComposer/MessageComposer.spec.tsx
  5. 41
      packages/ui-composer/src/MessageComposer/MessageComposer.stories.tsx
  6. 19
      packages/ui-composer/src/MessageComposer/MessageComposerHint.spec.tsx
  7. 2
      packages/ui-composer/src/MessageComposer/MessageComposerHint.stories.tsx
  8. 850
      packages/ui-composer/src/MessageComposer/__snapshots__/MessageComposer.spec.tsx.snap
  9. 85
      packages/ui-composer/src/MessageComposer/__snapshots__/MessageComposerHint.spec.tsx.snap
  10. 19
      packages/ui-composer/src/MessageFooterCallout/MessageFooterCallout.spec.tsx
  11. 2
      packages/ui-composer/src/MessageFooterCallout/MessageFooterCallout.stories.tsx
  12. 108
      packages/ui-composer/src/MessageFooterCallout/__snapshots__/MessageFooterCallout.spec.tsx.snap
  13. 2
      packages/ui-composer/tsconfig.build.json
  14. 4
      yarn.lock

@ -4,7 +4,12 @@ import type { StorybookConfig } from '@storybook/react-webpack5';
const config: StorybookConfig = {
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'],
addons: [getAbsolutePath('@storybook/addon-essentials'), './webpackAddon', getAbsolutePath('@storybook/addon-styling-webpack')],
addons: [
getAbsolutePath('@storybook/addon-a11y'),
getAbsolutePath('@storybook/addon-essentials'),
'./webpackAddon',
getAbsolutePath('@storybook/addon-styling-webpack'),
],
framework: {
name: getAbsolutePath('@storybook/react-webpack5'),

@ -0,0 +1,11 @@
import client from '@rocket.chat/jest-presets/client';
import type { Config } from 'jest';
export default {
preset: client.preset,
setupFilesAfterEnv: [...client.setupFilesAfterEnv],
moduleNameMapper: {
'^react($|/.+)': '<rootDir>/../../node_modules/react$1',
'^react-dom($|/.+)': '<rootDir>/../../node_modules/react-dom$1',
},
} satisfies Config;

@ -15,6 +15,8 @@
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix",
"storybook": "storybook dev -p 6006",
"test": "jest",
"testunit": "jest",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
@ -23,6 +25,8 @@
"@rocket.chat/eslint-config": "workspace:^",
"@rocket.chat/fuselage": "~0.62.0",
"@rocket.chat/icons": "^0.42.0",
"@rocket.chat/jest-presets": "workspace:~",
"@storybook/addon-a11y": "^8.6.4",
"@storybook/addon-actions": "^8.6.4",
"@storybook/addon-docs": "^8.6.4",
"@storybook/addon-essentials": "^8.6.4",
@ -30,12 +34,14 @@
"@storybook/addon-webpack5-compiler-babel": "^3.0.5",
"@storybook/react": "^8.6.4",
"@storybook/react-webpack5": "^8.6.4",
"@types/jest": "~29.5.14",
"@types/react": "~18.3.17",
"@types/react-dom": "~18.3.5",
"eslint": "~8.45.0",
"eslint-plugin-react": "~7.37.2",
"eslint-plugin-react-hooks": "~5.0.0",
"eslint-plugin-storybook": "^0.11.4",
"jest": "~29.7.0",
"react": "~18.3.1",
"react-dom": "~18.3.1",
"storybook": "^8.6.4",

@ -0,0 +1,19 @@
import { composeStories } from '@storybook/react';
import { render } from '@testing-library/react';
import { axe } from 'jest-axe';
import * as stories from './MessageComposer.stories';
const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]);
test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => {
const tree = render(<Story />);
expect(tree.baseElement).toMatchSnapshot();
});
test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => {
const { container } = render(<Story />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});

@ -21,28 +21,25 @@ export default {
const MessageToolbarActions = () => (
<MessageComposerToolbarActions>
<MessageComposerAction icon='emoji' />
<MessageComposerAction title='emoji' icon='emoji' />
<MessageComposerActionsDivider />
<MessageComposerAction icon='bold' />
<MessageComposerAction icon='italic' />
<MessageComposerAction icon='underline' />
<MessageComposerAction icon='strike' />
<MessageComposerAction icon='code' />
<MessageComposerAction icon='multiline' />
<MessageComposerAction icon='link' />
<MessageComposerAction icon='katex' />
<MessageComposerAction icon='arrow-return' />
<MessageComposerAction title='bold' icon='bold' />
<MessageComposerAction title='italic' icon='italic' />
<MessageComposerAction title='underline' icon='underline' />
<MessageComposerAction title='strike' icon='strike' />
<MessageComposerAction title='code' icon='code' />
<MessageComposerAction title='multiline' icon='multiline' />
<MessageComposerAction title='link' icon='link' />
<MessageComposerAction title='katex' icon='katex' />
<MessageComposerActionsDivider />
<MessageComposerAction icon='mic' />
<MessageComposerAction icon='video' />
<MessageComposerAction icon='clip' />
<MessageComposerAction icon='plus' />
<MessageComposerAction title='mic' icon='mic' />
<MessageComposerAction title='video' icon='video' />
<MessageComposerAction title='attachment' icon='clip' />
<MessageComposerAction title='more' icon='plus' />
</MessageComposerToolbarActions>
);
export const MessageToolberActions: StoryFn<typeof MessageComposerToolbarActions> = () => <MessageToolbarActions />;
export const _MessageComposer: StoryFn<typeof MessageComposer> = () => (
export const Default: StoryFn<typeof MessageComposer> = () => (
<MessageComposer>
<MessageComposerInput placeholder='Text' />
<MessageComposerToolbar>
@ -51,7 +48,9 @@ export const _MessageComposer: StoryFn<typeof MessageComposer> = () => (
</MessageComposer>
);
export const MessageComposerWithHints: StoryFn<typeof MessageComposer> = () => (
export const ToolbarActions: StoryFn<typeof MessageComposerToolbarActions> = () => <MessageToolbarActions />;
export const WithHints: StoryFn<typeof MessageComposer> = () => (
<>
<MessageComposerHint
icon='pencil'
@ -64,7 +63,7 @@ export const MessageComposerWithHints: StoryFn<typeof MessageComposer> = () => (
Editing message
</MessageComposerHint>
<MessageComposer>
<MessageComposerInput placeholder='Text' value='Lorem ipsum dolor' />
<MessageComposerInput placeholder='Text' />
<MessageComposerToolbar>
<MessageToolbarActions />
<MessageComposerToolbarSubmit>
@ -75,7 +74,7 @@ export const MessageComposerWithHints: StoryFn<typeof MessageComposer> = () => (
</>
);
export const MessageComposerWithSubmitActions: StoryFn<typeof MessageComposer> = () => (
export const WithSubmit: StoryFn<typeof MessageComposer> = () => (
<MessageComposer>
<MessageComposerInput placeholder='Text' />
<MessageComposerToolbar>
@ -90,4 +89,4 @@ export const MessageComposerWithSubmitActions: StoryFn<typeof MessageComposer> =
</MessageComposer>
);
export const MessageComposerLoading: StoryFn<typeof MessageComposer> = () => <MessageComposerSkeleton />;
export const Loading: StoryFn<typeof MessageComposer> = () => <MessageComposerSkeleton />;

@ -0,0 +1,19 @@
import { composeStories } from '@storybook/react';
import { render } from '@testing-library/react';
import { axe } from 'jest-axe';
import * as stories from './MessageComposerHint.stories';
const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]);
test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => {
const tree = render(<Story />);
expect(tree.baseElement).toMatchSnapshot();
});
test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => {
const { container } = render(<Story />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});

@ -4,7 +4,7 @@ import { MessageComposerHint } from '.';
import '@rocket.chat/icons/dist/rocketchat.css';
export default {
title: 'Components/MessageComposer/Hint',
title: 'Components/MessageComposerHint',
component: MessageComposerHint,
} as Meta<typeof MessageComposerHint>;

@ -0,0 +1,850 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`renders Default without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-input-box__wrapper rcx-css-1t5etly"
role="group"
>
<div
class="rcx-box rcx-box--full rcx-css-1drwzbn"
>
<textarea
class="rcx-box rcx-box--full rcx-css-1fg3rdf rc-message-box__textarea js-input-message rcx-css-1hzjarz"
placeholder="Text"
rows="1"
/>
</div>
<div
class="rcx-box rcx-box--full rcx-css-jyts6z"
>
<div
aria-orientation="horizontal"
class="rcx-button-group rcx-button-group--align-start rcx-button-group--small"
role="toolbar"
>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="emoji"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-emoji rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<hr
class="rcx-box rcx-box--full rcx-divider--vertical rcx-divider rcx-button-group__item rcx-css-e8uboy"
/>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="bold"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-bold rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="italic"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-italic rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="underline"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-underline rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="strike"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-strike rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="code"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-code rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="multiline"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-multiline rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="link"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-link rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="katex"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-katex rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<hr
class="rcx-box rcx-box--full rcx-divider--vertical rcx-divider rcx-button-group__item rcx-css-e8uboy"
/>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="mic"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-mic rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="video"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-video rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="attachment"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-clip rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="more"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-plus rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
</div>
</div>
</div>
</div>
</body>
`;
exports[`renders Loading without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-input-box__wrapper rcx-css-1t5etly"
role="group"
>
<div
class="rcx-box rcx-box--full rcx-css-1attbr1"
>
<span
class="rcx-skeleton rcx-skeleton--text rcx-css-17gdwyr"
/>
</div>
<div
class="rcx-box rcx-box--full rcx-css-1ifbqvi"
/>
</div>
</div>
</body>
`;
exports[`renders ToolbarActions without crashing 1`] = `
<body>
<div>
<div
aria-orientation="horizontal"
class="rcx-button-group rcx-button-group--align-start rcx-button-group--small"
role="toolbar"
>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="emoji"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-emoji rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<hr
class="rcx-box rcx-box--full rcx-divider--vertical rcx-divider rcx-button-group__item rcx-css-e8uboy"
/>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="bold"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-bold rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="italic"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-italic rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="underline"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-underline rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="strike"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-strike rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="code"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-code rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="multiline"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-multiline rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="link"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-link rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="katex"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-katex rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<hr
class="rcx-box rcx-box--full rcx-divider--vertical rcx-divider rcx-button-group__item rcx-css-e8uboy"
/>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="mic"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-mic rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="video"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-video rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="attachment"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-clip rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="more"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-plus rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
</div>
</div>
</body>
`;
exports[`renders WithHints without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-css-r3aouy"
>
<span
class="rcx-box rcx-box--full rcx-tag "
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-pencil rcx-icon rcx-css-nbjs1j"
>
</i>
<span
class="rcx-tag__inner"
>
Editing message
</span>
</span>
<div
class="rcx-box rcx-box--full rcx-css-1c8uhnw"
>
<strong>
esc
</strong>
to cancel ·
<strong>
enter
</strong>
to save
</div>
</div>
<div
class="rcx-box rcx-box--full rcx-input-box__wrapper rcx-css-1t5etly"
role="group"
>
<div
class="rcx-box rcx-box--full rcx-css-1drwzbn"
>
<textarea
class="rcx-box rcx-box--full rcx-css-1fg3rdf rc-message-box__textarea js-input-message rcx-css-1hzjarz"
placeholder="Text"
rows="1"
/>
</div>
<div
class="rcx-box rcx-box--full rcx-css-jyts6z"
>
<div
aria-orientation="horizontal"
class="rcx-button-group rcx-button-group--align-start rcx-button-group--small"
role="toolbar"
>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="emoji"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-emoji rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<hr
class="rcx-box rcx-box--full rcx-divider--vertical rcx-divider rcx-button-group__item rcx-css-e8uboy"
/>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="bold"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-bold rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="italic"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-italic rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="underline"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-underline rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="strike"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-strike rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="code"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-code rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="multiline"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-multiline rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="link"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-link rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="katex"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-katex rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<hr
class="rcx-box rcx-box--full rcx-divider--vertical rcx-divider rcx-button-group__item rcx-css-e8uboy"
/>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="mic"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-mic rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="video"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-video rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="attachment"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-clip rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="more"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-plus rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
</div>
<div
class="rcx-button-group rcx-button-group--align-start rcx-button-group--small"
role="group"
>
<button
aria-label="Send"
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--icon-secondary-info rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-send rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
</div>
</div>
</div>
</div>
</body>
`;
exports[`renders WithSubmit without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-input-box__wrapper rcx-css-1t5etly"
role="group"
>
<div
class="rcx-box rcx-box--full rcx-css-1drwzbn"
>
<textarea
class="rcx-box rcx-box--full rcx-css-1fg3rdf rc-message-box__textarea js-input-message rcx-css-1hzjarz"
placeholder="Text"
rows="1"
/>
</div>
<div
class="rcx-box rcx-box--full rcx-css-jyts6z"
>
<div
aria-orientation="horizontal"
class="rcx-button-group rcx-button-group--align-start rcx-button-group--small"
role="toolbar"
>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="emoji"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-emoji rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<hr
class="rcx-box rcx-box--full rcx-divider--vertical rcx-divider rcx-button-group__item rcx-css-e8uboy"
/>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="bold"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-bold rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="italic"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-italic rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="underline"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-underline rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="strike"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-strike rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="code"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-code rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="multiline"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-multiline rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="link"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-link rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="katex"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-katex rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<hr
class="rcx-box rcx-box--full rcx-divider--vertical rcx-divider rcx-button-group__item rcx-css-e8uboy"
/>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="mic"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-mic rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="video"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-video rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="attachment"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-clip rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small-square rcx-button--square rcx-button--icon rcx-button rcx-button-group__item"
title="more"
type="button"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-plus rcx-icon rcx-css-4pvxx3"
>
</i>
</button>
</div>
<div
class="rcx-button-group rcx-button-group--align-start rcx-button-group--small"
role="group"
>
<button
class="rcx-box rcx-box--full rcx-button--small rcx-button rcx-button-group__item"
type="button"
>
<span
class="rcx-button--content"
>
Preview
</span>
</button>
<button
class="rcx-box rcx-box--full rcx-button--small rcx-button--primary rcx-button rcx-button-group__item"
type="button"
>
<span
class="rcx-button--content"
>
Send
</span>
</button>
</div>
</div>
</div>
</div>
</body>
`;

@ -0,0 +1,85 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`renders HintWithIcon without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-css-r3aouy"
>
<span
class="rcx-box rcx-box--full rcx-tag "
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-eye rcx-icon rcx-css-nbjs1j"
>
</i>
<span
class="rcx-tag__inner"
>
This room is read only
</span>
</span>
</div>
</div>
</body>
`;
exports[`renders HintWithIconAndHelperText without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-css-r3aouy"
>
<span
class="rcx-box rcx-box--full rcx-tag "
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-pencil rcx-icon rcx-css-nbjs1j"
>
</i>
<span
class="rcx-tag__inner"
>
Editing message
</span>
</span>
<div
class="rcx-box rcx-box--full rcx-css-1c8uhnw"
>
<strong>
esc
</strong>
to cancel ·
<strong>
enter
</strong>
to save
</div>
</div>
</div>
</body>
`;
exports[`renders HintWithText without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-css-r3aouy"
>
<span
class="rcx-box rcx-box--full rcx-tag "
>
<span
class="rcx-tag__inner"
>
You're sending an unencrypted message
</span>
</span>
</div>
</div>
</body>
`;

@ -0,0 +1,19 @@
import { composeStories } from '@storybook/react';
import { render } from '@testing-library/react';
import { axe } from 'jest-axe';
import * as stories from './MessageFooterCallout.stories';
const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]);
test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => {
const tree = render(<Story />);
expect(tree.baseElement).toMatchSnapshot();
});
test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => {
const { container } = render(<Story />);
const results = await axe(container);
expect(results).toHaveNoViolations();
});

@ -9,7 +9,7 @@ import MessageComposerIcon from '../MessageComposer/MessageComposerIcon';
import '@rocket.chat/icons/dist/rocketchat.css';
export default {
title: 'Components/MessageComposer/Locked',
title: 'Components/MessageComposerCallout',
component: MessageComposer,
} satisfies Meta<typeof MessageComposer>;

@ -0,0 +1,108 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`renders _MessageFooterCalloutAction without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-css-1rv8koo"
>
Feedback text
<hr
class="rcx-box rcx-box--full rcx-css-vi5s2c"
/>
<button
class="rcx-box rcx-box--full rcx-button--small rcx-button--primary rcx-button rcx-css-1dy74d9"
type="button"
>
<span
class="rcx-button--content"
>
Button
</span>
</button>
</div>
</div>
</body>
`;
exports[`renders MessageComposerBlocked without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-css-1rv8koo"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-burger rcx-icon rcx-css-1c32rho"
>
</i>
Feedback text
</div>
</div>
</body>
`;
exports[`renders MessageComposerBlockedLargeText without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-css-1rv8koo"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-burger rcx-icon rcx-css-1c32rho"
>
</i>
<div
class="rcx-box rcx-box--full rcx-css-lp8q3w"
>
Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text text Feedback text Feedback text Feedback text Feedback text Feedback text text Feedback text Feedback text Feedback text Feedback text Feedback text text Feedback text Feedback text Feedback text Feedback text Feedback text
</div>
<button
class="rcx-box rcx-box--full rcx-button--small rcx-button--primary rcx-button rcx-css-1dy74d9"
type="button"
>
<span
class="rcx-button--content"
>
Button
</span>
</button>
</div>
</div>
</body>
`;
exports[`renders MessageComposerBlockedLargeTextDashed without crashing 1`] = `
<body>
<div>
<div
class="rcx-box rcx-box--full rcx-css-111uahs"
>
<i
aria-hidden="true"
class="rcx-box rcx-box--full rcx-icon--name-burger rcx-icon rcx-css-1c32rho"
>
</i>
<div
class="rcx-box rcx-box--full rcx-css-lp8q3w"
>
Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text Feedback text text Feedback text Feedback text Feedback text Feedback text Feedback text text Feedback text Feedback text Feedback text Feedback text Feedback text text Feedback text Feedback text Feedback text Feedback text Feedback text
</div>
<button
class="rcx-box rcx-box--full rcx-button--small rcx-button--primary rcx-button rcx-css-1dy74d9"
type="button"
>
<span
class="rcx-button--content"
>
Button
</span>
</button>
</div>
</div>
</body>
`;

@ -1,4 +1,4 @@
{
"extends": "./tsconfig.json",
"exclude": ["./src/**/*.stories.tsx", "./.storybook/**/*", "./jest.config.ts"]
"exclude": ["**/*.stories.tsx", "./src/**/*.spec.ts", "./src/**/*.spec.tsx", "./.storybook/**/*", "./jest.config.ts"]
}

@ -9654,6 +9654,8 @@ __metadata:
"@rocket.chat/eslint-config": "workspace:^"
"@rocket.chat/fuselage": "npm:~0.62.0"
"@rocket.chat/icons": "npm:^0.42.0"
"@rocket.chat/jest-presets": "workspace:~"
"@storybook/addon-a11y": "npm:^8.6.4"
"@storybook/addon-actions": "npm:^8.6.4"
"@storybook/addon-docs": "npm:^8.6.4"
"@storybook/addon-essentials": "npm:^8.6.4"
@ -9661,12 +9663,14 @@ __metadata:
"@storybook/addon-webpack5-compiler-babel": "npm:^3.0.5"
"@storybook/react": "npm:^8.6.4"
"@storybook/react-webpack5": "npm:^8.6.4"
"@types/jest": "npm:~29.5.14"
"@types/react": "npm:~18.3.17"
"@types/react-dom": "npm:~18.3.5"
eslint: "npm:~8.45.0"
eslint-plugin-react: "npm:~7.37.2"
eslint-plugin-react-hooks: "npm:~5.0.0"
eslint-plugin-storybook: "npm:^0.11.4"
jest: "npm:~29.7.0"
react: "npm:~18.3.1"
react-dom: "npm:~18.3.1"
storybook: "npm:^8.6.4"

Loading…
Cancel
Save