Skip to content

Commit

Permalink
fix: adjust tests, add generics
Browse files Browse the repository at this point in the history
  • Loading branch information
arnautov-anton committed Sep 4, 2024
1 parent aa0ccb3 commit 18c9b7a
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 41 deletions.
67 changes: 32 additions & 35 deletions src/components/Message/__tests__/MessageOptions.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { MessageSimple } from '../MessageSimple';
import { ACTIONS_NOT_WORKING_IN_THREAD, MESSAGE_ACTIONS } from '../utils';

import { Attachment } from '../../Attachment';
import { MessageActions as MessageActionsMock } from '../../MessageActions';

import { ChannelActionProvider } from '../../../context/ChannelActionContext';
import { ChannelStateProvider } from '../../../context/ChannelStateContext';
Expand All @@ -23,9 +22,7 @@ import {
getTestClientWithUser,
} from '../../../mock-builders';

jest.mock('../../MessageActions', () => ({
MessageActions: jest.fn(() => <div />),
}));
const MESSAGE_ACTIONS_TEST_ID = 'message-actions';

const minimumCapabilitiesToRenderMessageActions = { 'delete-any-message': true };
const alice = generateUser({ name: 'alice' });
Expand Down Expand Up @@ -185,122 +182,122 @@ describe('<MessageOptions />', () => {
});

it('should render message actions', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).toHaveBeenCalled();

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).toBeInTheDocument();
});

it('should not show message actions button if actions are disabled', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: { messageActions: [] },
});
expect(MessageActionsMock).;

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).not.toBeInTheDocument();
});

it('should not show actions box for message in thread if only non-thread actions are available', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: { messageActions: ACTIONS_NOT_WORKING_IN_THREAD, threadList: true },
});
expect(MessageActionsMock).not.toHaveBeenCalled();

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).not.toBeInTheDocument();
});

it('should show actions box for message in thread if not only non-thread actions are available', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: {
messageActions: [...ACTIONS_NOT_WORKING_IN_THREAD, MESSAGE_ACTIONS.delete],
threadList: true,
},
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).toHaveBeenCalled();

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).toBeInTheDocument();
});

it('should show actions box for a message in thread if custom actions provided are non-thread', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: {
customMessageActions: ACTIONS_NOT_WORKING_IN_THREAD,
messageActions: ACTIONS_NOT_WORKING_IN_THREAD,
threadList: true,
},
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).toHaveBeenCalled();
expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).toBeInTheDocument();
});

it('should not show actions box for message outside thread with single action "react"', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: {
messageActions: [MESSAGE_ACTIONS.react],
},
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).not.toHaveBeenCalled();
expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).not.toBeInTheDocument();
});

it('should show actions box for message outside thread with single action "react" if custom actions available', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: {
customMessageActions: [MESSAGE_ACTIONS.react],
messageActions: [MESSAGE_ACTIONS.react],
},
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).toHaveBeenCalled();

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).toBeInTheDocument();
});

it('should not show actions box for message outside thread with single action "reply"', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: {
messageActions: [MESSAGE_ACTIONS.reply],
},
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).not.toHaveBeenCalled();

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).not.toBeInTheDocument();
});

it('should show actions box for message outside thread with single action "reply" if custom actions available', async () => {
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: {
customMessageActions: [MESSAGE_ACTIONS.reply],
messageActions: [MESSAGE_ACTIONS.reply],
},
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).toHaveBeenCalled();

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).toBeInTheDocument();
});

it('should not show actions box for message outside thread with two actions "react" & "reply"', async () => {
const actions = [MESSAGE_ACTIONS.react, MESSAGE_ACTIONS.reply];
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: {
messageActions: actions,
},
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).not.toHaveBeenCalled();

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).not.toBeInTheDocument();
});

it('should show actions box for message outside thread with single actions "react" & "reply" if custom actions available', async () => {
const actions = [MESSAGE_ACTIONS.react, MESSAGE_ACTIONS.reply];
await renderMessageOptions({
const { queryByTestId } = await renderMessageOptions({
channelStateOpts: { channelCapabilities: minimumCapabilitiesToRenderMessageActions },
customMessageProps: {
customMessageActions: actions,
messageActions: actions,
},
});
// eslint-disable-next-line jest/prefer-called-with
expect(MessageActionsMock).toHaveBeenCalled();

expect(queryByTestId(MESSAGE_ACTIONS_TEST_ID)).toBeInTheDocument();
});
});
8 changes: 5 additions & 3 deletions src/components/Message/utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -219,15 +219,17 @@ export const showMessageActionsBox = (
inThread?: boolean | undefined,
) => shouldRenderMessageActions({ inThread, messageActions: actions });

Check warning on line 220 in src/components/Message/utils.tsx

View check run for this annotation

Codecov / codecov/patch

src/components/Message/utils.tsx#L220

Added line #L220 was not covered by tests

export const shouldRenderMessageActions = ({
export const shouldRenderMessageActions = <
SCG extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
>({
customMessageActions,
CustomMessageActionsList,
inThread,
messageActions,
}: {
messageActions: MessageActionsArray;
customMessageActions?: CustomMessageActions;
CustomMessageActionsList?: ComponentContextValue['CustomMessageActionsList'];
customMessageActions?: CustomMessageActions<SCG>;
CustomMessageActionsList?: ComponentContextValue<SCG>['CustomMessageActionsList'];
inThread?: boolean;
}) => {
if (
Expand Down
5 changes: 2 additions & 3 deletions src/components/MessageActions/MessageActions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export const MessageActions = <
threadList,
} = useMessageContext<StreamChatGenerics>('MessageActions');

const { CustomMessageActionsList } = useComponentContext('MessageActions');
const { CustomMessageActionsList } = useComponentContext<StreamChatGenerics>('MessageActions');

const { t } = useTranslationContext('MessageActions');

Expand All @@ -99,8 +99,7 @@ export const MessageActions = <

const messageActions = getMessageActions();

const renderMessageActions = shouldRenderMessageActions({
// @ts-expect-error
const renderMessageActions = shouldRenderMessageActions<StreamChatGenerics>({
customMessageActions,
CustomMessageActionsList,
inThread: threadList,
Expand Down

0 comments on commit 18c9b7a

Please sign in to comment.