import { screen } from "@testing-library/react"; import { describe, expect, mock, test } from "bun:test"; import { createElement } from "react"; import { CodeBlockWithCopy } from "../../../../src/web/consoles/workbench/components/chat/parts/CodeBlockWithCopy"; import { renderWithProviders } from "../../test-utils"; const mockWriteText = mock(() => Promise.resolve()); Object.defineProperty(navigator, "clipboard", { configurable: true, get: () => ({ writeText: mockWriteText }), }); describe("CodeBlockWithCopy", () => { test("block 模式渲染 CodeHighlighter 和语言标签", () => { renderWithProviders( createElement(CodeBlockWithCopy, { block: true, children: "const x = 1;", lang: "typescript", streamStatus: "done", }), ); expect(screen.getByText("typescript")).toBeTruthy(); }); test("block 模式渲染复制按钮", () => { renderWithProviders( createElement(CodeBlockWithCopy, { block: true, children: "hello world", lang: "python", streamStatus: "done", }), ); const copyBtn = screen.getByRole("button"); expect(copyBtn).toBeTruthy(); }); test("block 模式语言为空时显示 plaintext", () => { renderWithProviders( createElement(CodeBlockWithCopy, { block: true, children: "some code", lang: "", streamStatus: "done", }), ); expect(screen.getByText("plaintext")).toBeTruthy(); }); test("block 模式语言为 undefined 时显示 plaintext", () => { renderWithProviders( createElement(CodeBlockWithCopy, { block: true, children: "some code", streamStatus: "done", }), ); expect(screen.getByText("plaintext")).toBeTruthy(); }); test("inline 模式返回 code 元素", () => { const { container } = renderWithProviders( createElement(CodeBlockWithCopy, { block: false, children: "inline code", className: "language-ts", }), ); const code = container.querySelector("code.language-ts"); expect(code).toBeTruthy(); expect(code?.textContent).toBe("inline code"); }); test("点击复制按钮调用 clipboard.writeText", () => { mockWriteText.mockClear(); renderWithProviders( createElement(CodeBlockWithCopy, { block: true, children: "copy me", lang: "javascript", streamStatus: "done", }), ); const copyBtn = screen.getByRole("button"); copyBtn.click(); expect(mockWriteText).toHaveBeenCalledWith("copy me"); }); });