From 672c9052b4b11217036ffdeb6b52e72a0a3080a9 Mon Sep 17 00:00:00 2001 From: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Date: Mon, 15 Jun 2026 03:45:44 +0800 Subject: [PATCH] fix: render user questions as plain text --- .../chat/chat/__tests__/question.spec.tsx | 21 +++++++++++-------- .../components/base/chat/chat/question.tsx | 3 +-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/web/app/components/base/chat/chat/__tests__/question.spec.tsx b/web/app/components/base/chat/chat/__tests__/question.spec.tsx index 5c18ac96ba3..523eebea53c 100644 --- a/web/app/components/base/chat/chat/__tests__/question.spec.tsx +++ b/web/app/components/base/chat/chat/__tests__/question.spec.tsx @@ -48,9 +48,6 @@ vi.mock('../content-switch', () => ({ }, })) vi.mock('copy-to-clipboard', () => ({ default: vi.fn() })) -vi.mock('@/app/components/base/markdown', () => ({ - Markdown: ({ content }: { content: string }) =>
{content}
, -})) // Mock ResizeObserver and capture lifecycle for targeted coverage const observeMock = vi.fn() @@ -132,13 +129,20 @@ describe('Question component', () => { it('should render the question content container and default avatar when hideAvatar is false', () => { const { container } = renderWithProvider(makeItem()) - const markdown = container.querySelector('.markdown-body') - expect(markdown).toBeInTheDocument() + expect(screen.getByTestId('question-content')).toHaveTextContent('This is the question content') const avatar = container.querySelector('.size-10') || container.querySelector('.size-10.shrink-0') expect(avatar).toBeTruthy() }) + it('should render user-entered HTML as plain text', () => { + renderWithProvider(makeItem({ content: '' })) + + const content = screen.getByTestId('question-content') + expect(content).toHaveTextContent('') + expect(content.querySelector('button.primary-button')).toBeNull() + }) + it('should hide avatar when hideAvatar is true', () => { const { container } = renderWithProvider(makeItem(), vi.fn() as unknown as OnRegenerate, { hideAvatar: true }) const avatar = container.querySelector('.size-10') @@ -223,9 +227,9 @@ describe('Question component', () => { }) }) - it('should cancel editing and revert to original markdown when cancel is clicked', async () => { + it('should cancel editing and revert to original text when cancel is clicked', async () => { const user = userEvent.setup() - const { container } = renderWithProvider(makeItem()) + renderWithProvider(makeItem()) const editBtn = screen.getByRole('button', { name: 'common.operation.edit' }) await user.click(editBtn) @@ -239,8 +243,7 @@ describe('Question component', () => { await waitFor(() => { expect(screen.queryByRole('textbox')).not.toBeInTheDocument() - const md = container.querySelector('.markdown-body') - expect(md).toBeInTheDocument() + expect(screen.getByTestId('question-content')).toHaveTextContent('This is the question content') }) }) diff --git a/web/app/components/base/chat/chat/question.tsx b/web/app/components/base/chat/chat/question.tsx index 4c323dde521..f8772f8d59d 100644 --- a/web/app/components/base/chat/chat/question.tsx +++ b/web/app/components/base/chat/chat/question.tsx @@ -19,7 +19,6 @@ import { useTranslation } from 'react-i18next' import Textarea from 'react-textarea-autosize' import { FileList } from '@/app/components/base/file-uploader' import { User } from '@/app/components/base/icons/src/public/avatar' -import { Markdown } from '@/app/components/base/markdown' import ActionButton from '../../action-button' import { CssTransform } from '../embedded-chatbot/theme/utils' import ContentSwitch from './content-switch' @@ -206,7 +205,7 @@ const Question: FC = ({ ) } {!isEditing - ? + ?
{content}
: (