diff --git a/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.spec.tsx b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.spec.tsx new file mode 100644 index 0000000000000..87fd37fa2865c --- /dev/null +++ b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.spec.tsx @@ -0,0 +1,177 @@ +import type { IMessage, IThreadMainMessage, IThreadMessage } from '@rocket.chat/core-typings'; +import { mockAppRoot } from '@rocket.chat/mock-providers'; +import { fireEvent, render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { HTMLAttributes, ReactNode } from 'react'; +import { forwardRef } from 'react'; + +import ThreadMessageList from './ThreadMessageList'; +import { createFakeMessage, createFakeRoom } from '../../../../../../tests/mocks/data'; +import { useThreadMessagesQuery } from '../hooks/useThreadMessagesQuery'; + +const room = createFakeRoom({ _id: 'room-id', t: 'c' }); +const mockVirtualizerHandle = { + scrollToIndex: jest.fn(), + findItemIndex: jest.fn(() => 0), + scrollOffset: 100, + scrollSize: 1000, + viewportSize: 300, +}; + +jest.mock('virtua', () => { + const { forwardRef, useImperativeHandle } = jest.requireActual('react'); + + return { + VList: forwardRef( + ( + { + children, + onScroll, + shift: _shift, + keepMounted: _keepMounted, + ...props + }: { + children: ReactNode; + onScroll?: (offset: number) => void; + shift?: boolean; + keepMounted?: number[]; + }, + ref: any, + ) => { + useImperativeHandle(ref, () => mockVirtualizerHandle); + return ( + + ); + }, + ), + }; +}); + +jest.mock('@rocket.chat/fuselage-hooks', () => ({ + ...jest.requireActual('@rocket.chat/fuselage-hooks'), + useDebouncedCallback: (callback: (...args: any[]) => void) => callback, +})); + +jest.mock('@rocket.chat/ui-client', () => ({ + clientCallbacks: { + add: jest.fn(), + remove: jest.fn(), + priority: { MEDIUM: 0 }, + }, + CustomVirtuaScrollbars: forwardRef>(function CustomVirtuaScrollbars( + { children, ...props }, + ref, + ) { + return ( +
+
{children}
+
+
+ ); + }), +})); + +jest.mock('../hooks/useThreadMessagesQuery', () => ({ + useThreadMessagesQuery: jest.fn(), +})); + +jest.mock('../../../hooks/useDateScroll', () => ({ + useDateScroll: () => ({ + bubbleRef: { current: null }, + handleDateScroll: jest.fn(), + }), +})); + +jest.mock('../../../contexts/RoomContext', () => ({ + useRoom: () => room, +})); + +jest.mock('../../../MessageList/hooks/useKeepAtBottom', () => ({ + useKeepAtBottom: () => ({ keepAtBottomRef: jest.fn(), setKeepAtBottom: jest.fn() }), +})); + +jest.mock('../../../hooks/useFirstUnreadMessageId', () => ({ + useFirstUnreadMessageId: () => undefined, +})); + +jest.mock('../../../hooks/useMessageListNavigation', () => ({ + useMessageListNavigation: () => ({ messageListRef: { current: null } }), +})); + +jest.mock('../../../MessageList/providers/MessageListProvider', () => ({ children }: { children: ReactNode }) => <>{children}); + +jest.mock('../../../../../lib/utils/setMessageJumpQueryStringParameter', () => ({ + setMessageJumpQueryStringParameter: jest.fn(), +})); + +jest.mock('./ThreadMessageItem', () => ({ + ThreadMessageItem: ({ message }: { message: IMessage }) =>
  • {message._id}
  • , +})); + +jest.mock('../../../BubbleDate', () => ({ + BubbleDate: forwardRef(function BubbleDate(_, ref) { + return