Skip to content

Commit 8dec5e7

Browse files
committed
fix: Handle missing message parts
1 parent d650058 commit 8dec5e7

2 files changed

Lines changed: 56 additions & 1 deletion

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* @vitest-environment jsdom
3+
*/
4+
import { TestProvider } from '@/lib/test/TestProvider';
5+
import { cleanup, render } from '@testing-library/react';
6+
import type { UIMessage } from 'ai';
7+
import { act } from 'react';
8+
import { afterEach, describe, expect, it } from 'vitest';
9+
import { MessageBubble } from './MessageBubble';
10+
11+
afterEach(() => cleanup);
12+
13+
describe('MessageBubble', () => {
14+
it('should render without crashing when parts is undefined', async () => {
15+
const mockMessage = {
16+
id: '1',
17+
role: 'assistant',
18+
content: '',
19+
// parts is missing/undefined
20+
} as unknown as UIMessage;
21+
22+
const { container } = render(
23+
<TestProvider>
24+
<MessageBubble message={mockMessage} />
25+
</TestProvider>,
26+
);
27+
28+
await act(() => null);
29+
30+
const contentDiv = container.querySelector('.content');
31+
expect(contentDiv).toBeTruthy();
32+
expect(contentDiv?.childNodes.length).toBe(0);
33+
});
34+
35+
it('should render message parts when they exist', async () => {
36+
const mockMessage = {
37+
id: '2',
38+
role: 'user',
39+
content: 'Hello',
40+
parts: [
41+
{ type: 'text', text: 'Hello' },
42+
],
43+
} as unknown as UIMessage;
44+
45+
const { getByText } = render(
46+
<TestProvider>
47+
<MessageBubble message={mockMessage} />
48+
</TestProvider>,
49+
);
50+
51+
await act(() => null);
52+
53+
expect(getByText('Hello')).toBeTruthy();
54+
});
55+
});

src/features/instance/applications/components/Chat/components/MessageBubble.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export function MessageBubble(
2525
{m.role === 'user' ? <User size={18} /> : <Bot size={18} />}
2626
</div>
2727
<div className="content">
28-
{m.parts.map((part, i) => {
28+
{m.parts?.map((part, i) => {
2929
if (isTextUIPart(part)) {
3030
return <div key={i} className="text-block">{part.text}</div>;
3131
}

0 commit comments

Comments
 (0)