Files
Alfred/tests/web/components/chat/ReasoningPart.test.tsx

78 lines
2.8 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { fireEvent, screen } from "@testing-library/react";
import { createElement } from "react";
import { ReasoningPart } from "../../../../src/web/features/chat/parts/ReasoningPart";
import { renderWithProviders } from "../../test-utils";
describe("ReasoningPart", () => {
test("流式状态时自动展开显示文本", () => {
const part = { state: "streaming", text: "正在思考...", type: "reasoning" };
renderWithProviders(createElement(ReasoningPart, { part }));
expect(screen.getByText("正在思考...")).toBeTruthy();
expect(screen.getByText("思考中")).toBeTruthy();
});
test("完成状态时显示思考完成标签", () => {
const part = { state: "complete", text: "思考内容", type: "reasoning" };
renderWithProviders(createElement(ReasoningPart, { part }));
expect(screen.getByText("思考完成")).toBeTruthy();
});
test("无状态时默认收起", () => {
const part = { text: "默认内容", type: "reasoning" };
const { container } = renderWithProviders(createElement(ReasoningPart, { part }));
const expanded = container.querySelector('[aria-expanded="true"]');
expect(expanded).toBeNull();
});
test("用户点击折叠后尊重用户意图", () => {
const part = { state: "streaming", text: "思考中内容", type: "reasoning" };
const { container } = renderWithProviders(createElement(ReasoningPart, { part }));
const collapseHeader = container.querySelector(".ant-collapse-header");
expect(collapseHeader).toBeTruthy();
if (collapseHeader) {
fireEvent.click(collapseHeader);
}
expect(screen.getByText("思考中内容")).toBeTruthy();
});
test("Markdown 代码块渲染(流式状态展开)", () => {
const part = { state: "streaming", text: "```typescript\nconst x = 1;\n```", type: "reasoning" };
renderWithProviders(createElement(ReasoningPart, { part }));
expect(screen.getByText("const x = 1;")).toBeTruthy();
expect(document.querySelector(".code-block")).toBeTruthy();
});
test("Markdown 有序列表渲染(流式状态展开)", () => {
const part = { state: "streaming", text: "1. 第一项\n2. 第二项", type: "reasoning" };
const { container } = renderWithProviders(createElement(ReasoningPart, { part }));
const ol = container.querySelector("ol");
expect(ol).toBeTruthy();
expect(screen.getByText("第一项")).toBeTruthy();
});
test("Markdown 表格渲染(流式状态展开)", () => {
const part = { state: "streaming", text: "| A | B |\n| --- | --- |\n| 1 | 2 |", type: "reasoning" };
renderWithProviders(createElement(ReasoningPart, { part }));
expect(screen.getByText("A")).toBeTruthy();
expect(document.querySelector(".markdown-table")).toBeTruthy();
});
});