Fix test for ChatMessageList

environments/review-chats-g56n7m/deployments/1169
Chewbacca 2022-10-17 12:08:46 -04:00
rodzic 1ab7591b36
commit 4b85a72bc9
2 zmienionych plików z 23 dodań i 13 usunięć

Wyświetl plik

@ -1,5 +1,6 @@
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import React from 'react'; import React from 'react';
import { VirtuosoMockContext } from 'react-virtuoso';
import { ChatContext } from 'soapbox/contexts/chat-context'; import { ChatContext } from 'soapbox/contexts/chat-context';
import { IAccount } from 'soapbox/queries/accounts'; import { IAccount } from 'soapbox/queries/accounts';
@ -44,19 +45,21 @@ const chatMessages: IChatMessage[] = [
]; ];
// Mock scrollIntoView function. // Mock scrollIntoView function.
window.HTMLElement.prototype.scrollIntoView = function() { }; window.HTMLElement.prototype.scrollIntoView = function () { };
Object.assign(navigator, { Object.assign(navigator, {
clipboard: { clipboard: {
writeText: () => {}, writeText: () => { },
}, },
}); });
const store = rootState.set('me', '1'); const store = rootState.set('me', '1');
const renderComponentWithChatContext = () => render( const renderComponentWithChatContext = () => render(
<ChatContext.Provider value={{ chat }}> <VirtuosoMockContext.Provider value={{ viewportHeight: 300, itemHeight: 100 }}>
<ChatMessageList chat={chat} /> <ChatContext.Provider value={{ chat }}>
</ChatContext.Provider>, <ChatMessageList chat={chat} />
</ChatContext.Provider>
</VirtuosoMockContext.Provider>,
undefined, undefined,
store, store,
); );
@ -75,7 +78,7 @@ describe('<ChatMessageList />', () => {
}); });
}); });
it('displays the skeleton loader', async() => { it('displays the skeleton loader', async () => {
renderComponentWithChatContext(); renderComponentWithChatContext();
expect(screen.queryAllByTestId('placeholder-chat-message')).toHaveLength(5); expect(screen.queryAllByTestId('placeholder-chat-message')).toHaveLength(5);
@ -96,7 +99,7 @@ describe('<ChatMessageList />', () => {
}); });
}); });
it('displays the intro', async() => { it('displays the intro', async () => {
renderComponentWithChatContext(); renderComponentWithChatContext();
expect(screen.queryAllByTestId('chat-message-list-intro')).toHaveLength(0); expect(screen.queryAllByTestId('chat-message-list-intro')).toHaveLength(0);
@ -106,7 +109,7 @@ describe('<ChatMessageList />', () => {
}); });
}); });
it('displays the messages', async() => { it('displays the messages', async () => {
renderComponentWithChatContext(); renderComponentWithChatContext();
expect(screen.queryAllByTestId('chat-message')).toHaveLength(0); expect(screen.queryAllByTestId('chat-message')).toHaveLength(0);
@ -117,19 +120,23 @@ describe('<ChatMessageList />', () => {
}); });
}); });
it('displays the correct menu options depending on the owner of the message', async() => { it('displays the correct menu options depending on the owner of the message', async () => {
renderComponentWithChatContext(); renderComponentWithChatContext();
await waitFor(() => { await waitFor(() => {
expect(screen.queryAllByTestId('chat-message-menu')).toHaveLength(2); expect(screen.queryAllByTestId('chat-message-menu')).toHaveLength(2);
}); });
// my message
await userEvent.click(screen.queryAllByTestId('chat-message-menu')[0].querySelector('button') as any); await userEvent.click(screen.queryAllByTestId('chat-message-menu')[0].querySelector('button') as any);
expect(screen.getByTestId('dropdown-menu')).toHaveTextContent('Delete'); expect(screen.getByTestId('dropdown-menu')).toHaveTextContent('Delete for both');
expect(screen.getByTestId('dropdown-menu')).not.toHaveTextContent('Report');
expect(screen.getByTestId('dropdown-menu')).toHaveTextContent('Copy'); expect(screen.getByTestId('dropdown-menu')).toHaveTextContent('Copy');
// other user message
await userEvent.click(screen.queryAllByTestId('chat-message-menu')[1].querySelector('button') as any); await userEvent.click(screen.queryAllByTestId('chat-message-menu')[1].querySelector('button') as any);
expect(screen.getByTestId('dropdown-menu')).not.toHaveTextContent('Delete'); expect(screen.getByTestId('dropdown-menu')).toHaveTextContent('Delete for me');
expect(screen.getByTestId('dropdown-menu')).toHaveTextContent('Report');
expect(screen.getByTestId('dropdown-menu')).toHaveTextContent('Copy'); expect(screen.getByTestId('dropdown-menu')).toHaveTextContent('Copy');
}); });
}); });

Wyświetl plik

@ -135,6 +135,8 @@ const ChatMessageList: React.FC<IChatMessageList> = ({ chat, autosize }) => {
}, [chatMessages?.length, lastChatMessage]); }, [chatMessages?.length, lastChatMessage]);
const initialTopMostItemIndex = process.env.NODE_ENV === 'test' ? 0 : cachedChatMessages.length - 1;
const getFormattedTimestamp = (chatMessage: ChatMessageEntity) => { const getFormattedTimestamp = (chatMessage: ChatMessageEntity) => {
return intl.formatDate(new Date(chatMessage.created_at), { return intl.formatDate(new Date(chatMessage.created_at), {
hour12: false, hour12: false,
@ -272,6 +274,7 @@ const ChatMessageList: React.FC<IChatMessageList> = ({ chat, autosize }) => {
'mr-2 order-1': isMyMessage, 'mr-2 order-1': isMyMessage,
'ml-2 order-2': !isMyMessage, 'ml-2 order-2': !isMyMessage,
})} })}
data-testid='chat-message-menu'
> >
<DropdownMenuContainer <DropdownMenuContainer
items={menu} items={menu}
@ -409,9 +412,10 @@ const ChatMessageList: React.FC<IChatMessageList> = ({ chat, autosize }) => {
ref={node} ref={node}
alignToBottom alignToBottom
firstItemIndex={Math.max(0, firstItemIndex)} firstItemIndex={Math.max(0, firstItemIndex)}
initialTopMostItemIndex={cachedChatMessages.length - 1} initialTopMostItemIndex={initialTopMostItemIndex}
data={cachedChatMessages} data={cachedChatMessages}
startReached={handleStartReached} startReached={handleStartReached}
followOutput='auto'
itemContent={(_index, chatMessage) => { itemContent={(_index, chatMessage) => {
if (chatMessage.type === 'divider') { if (chatMessage.type === 'divider') {
return renderDivider(_index, chatMessage.text); return renderDivider(_index, chatMessage.text);
@ -423,7 +427,6 @@ const ChatMessageList: React.FC<IChatMessageList> = ({ chat, autosize }) => {
); );
} }
}} }}
followOutput='auto'
components={{ components={{
Header: () => { Header: () => {
if (hasNextPage || isFetchingNextPage) { if (hasNextPage || isFetchingNextPage) {