62 lines
2.0 KiB
TypeScript
62 lines
2.0 KiB
TypeScript
/* eslint-disable @next/next/no-img-element */
|
|
import React from "react";
|
|
import { render, screen } from "@testing-library/react";
|
|
import { ThemeProvider, createTheme } from "@mui/material/styles";
|
|
|
|
import { AgentComposer } from "./AgentComposer";
|
|
|
|
jest.mock("next/image", () => ({
|
|
__esModule: true,
|
|
default: (props: React.ImgHTMLAttributes<HTMLImageElement>) => (
|
|
<img {...props} alt={props.alt ?? ""} />
|
|
),
|
|
}));
|
|
|
|
jest.mock("framer-motion", () => ({
|
|
AnimatePresence: ({ children }: { children: React.ReactNode }) => <>{children}</>,
|
|
motion: {
|
|
div: ({
|
|
children,
|
|
animate: _animate,
|
|
exit: _exit,
|
|
initial: _initial,
|
|
transition: _transition,
|
|
...props
|
|
}: React.HTMLAttributes<HTMLDivElement> & Record<string, unknown>) => (
|
|
<div {...props}>{children}</div>
|
|
),
|
|
},
|
|
}));
|
|
|
|
describe("AgentComposer", () => {
|
|
it("places voice input immediately before send without an attachment action", () => {
|
|
render(
|
|
<ThemeProvider theme={createTheme()}>
|
|
<AgentComposer
|
|
isStreaming={false}
|
|
isListening={false}
|
|
isSttSupported
|
|
presets={[]}
|
|
onSend={jest.fn()}
|
|
onAbort={jest.fn()}
|
|
onStartListening={jest.fn()}
|
|
onStopListening={jest.fn()}
|
|
modelOptions={[{ id: "test-model", label: "测试模型" }]}
|
|
selectedModel="test-model"
|
|
onModelChange={jest.fn()}
|
|
approvalMode="request"
|
|
onApprovalModeChange={jest.fn()}
|
|
/>
|
|
</ThemeProvider>,
|
|
);
|
|
|
|
const voiceButton = screen.getByRole("button", { name: "语音输入" });
|
|
const sendButton = screen.getByRole("button", { name: "发送" });
|
|
|
|
expect(screen.queryByRole("button", { name: "上传附件" })).not.toBeInTheDocument();
|
|
expect(screen.getByTitle("快捷指令图标")).toBeInTheDocument();
|
|
expect(screen.queryByAltText("TJWater Agent")).not.toBeInTheDocument();
|
|
expect(voiceButton.nextElementSibling?.contains(sendButton)).toBe(true);
|
|
});
|
|
});
|