test(FN-4514): complete Step 4 — add quick chat autosize regression tests
Fusion-Task-Id: FN-4514 Fusion-Task-Lineage: 5910815a-9d67-4312-97d4-44d65d01dbc7
This commit is contained in:
@@ -0,0 +1,120 @@
|
|||||||
|
import { readFileSync } from "node:fs";
|
||||||
|
import { resolve } from "node:path";
|
||||||
|
import { describe, expect, it, vi } from "vitest";
|
||||||
|
import { fireEvent, render, screen } from "@testing-library/react";
|
||||||
|
import { QuickChatFAB, clampQuickChatInputHeight } from "../QuickChatFAB";
|
||||||
|
|
||||||
|
vi.mock("../../api", () => ({
|
||||||
|
fetchDiscoveredSkills: vi.fn().mockResolvedValue([]),
|
||||||
|
fetchModels: vi.fn().mockResolvedValue({
|
||||||
|
models: [],
|
||||||
|
favoriteProviders: [],
|
||||||
|
favoriteModels: [],
|
||||||
|
defaultProvider: "",
|
||||||
|
defaultModelId: "",
|
||||||
|
}),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("../../hooks/useQuickChat", () => ({
|
||||||
|
FN_AGENT_ID: "__fn_agent__",
|
||||||
|
useQuickChat: vi.fn(() => ({
|
||||||
|
activeSession: { id: "session-1", agentId: "agent-1", modelProvider: null, modelId: null },
|
||||||
|
messages: [],
|
||||||
|
isStreaming: false,
|
||||||
|
streamingText: "",
|
||||||
|
streamingThinking: null,
|
||||||
|
streamingToolCalls: [],
|
||||||
|
sessions: [],
|
||||||
|
sessionsLoading: false,
|
||||||
|
messagesLoading: false,
|
||||||
|
sendMessage: vi.fn(),
|
||||||
|
stopStreaming: vi.fn(),
|
||||||
|
pendingMessage: "",
|
||||||
|
clearPendingMessage: vi.fn(),
|
||||||
|
switchSession: vi.fn(),
|
||||||
|
selectSession: vi.fn(),
|
||||||
|
startModelChat: vi.fn(),
|
||||||
|
startFreshSession: vi.fn(),
|
||||||
|
refreshSessions: vi.fn(),
|
||||||
|
skipNextSessionInitRef: { current: false },
|
||||||
|
})),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("../../hooks/useAgents", () => ({
|
||||||
|
useAgents: vi.fn(() => ({
|
||||||
|
agents: [{ id: "agent-1", name: "Agent One", role: "executor", state: "active" }],
|
||||||
|
activeAgents: [{ id: "agent-1", name: "Agent One", role: "executor", state: "active" }],
|
||||||
|
stats: null,
|
||||||
|
isLoading: false,
|
||||||
|
loadAgents: vi.fn(),
|
||||||
|
loadStats: vi.fn(),
|
||||||
|
})),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("../../hooks/useFileMention", () => ({
|
||||||
|
useFileMention: vi.fn(() => ({
|
||||||
|
mentionActive: false,
|
||||||
|
files: [],
|
||||||
|
selectedIndex: 0,
|
||||||
|
detectMention: vi.fn(),
|
||||||
|
dismissMention: vi.fn(),
|
||||||
|
handleKeyDown: vi.fn(),
|
||||||
|
selectFile: vi.fn((file: { path?: string }, text: string) => `${text}${file.path ?? ""}`),
|
||||||
|
selectHighlighted: vi.fn(),
|
||||||
|
closeMention: vi.fn(),
|
||||||
|
openMention: vi.fn(),
|
||||||
|
hasResults: false,
|
||||||
|
isLoading: false,
|
||||||
|
query: "",
|
||||||
|
})),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("../../hooks/useMobileKeyboard", () => ({
|
||||||
|
useMobileKeyboard: vi.fn(() => ({
|
||||||
|
keyboardOverlap: 0,
|
||||||
|
viewportHeight: null,
|
||||||
|
viewportOffsetTop: 0,
|
||||||
|
keyboardOpen: false,
|
||||||
|
})),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("../../hooks/useViewportMode", () => ({
|
||||||
|
useViewportMode: vi.fn(() => "desktop"),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("react-markdown", () => ({
|
||||||
|
default: ({ children }: { children: string }) => children,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const quickChatCss = readFileSync(resolve(__dirname, "../QuickChatFAB.css"), "utf8");
|
||||||
|
|
||||||
|
describe("QuickChatFAB autosize", () => {
|
||||||
|
it("keeps textarea CSS min/max height aligned with autosize contract", () => {
|
||||||
|
const textareaRule = quickChatCss.match(/\.quick-chat-textarea\s*\{[^}]*\}/);
|
||||||
|
|
||||||
|
expect(textareaRule).not.toBeNull();
|
||||||
|
expect(textareaRule?.[0]).toContain("max-height: 320px");
|
||||||
|
expect(textareaRule?.[0]).toContain("min-height: 40px");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("clamps composer heights to the expected floor and cap", () => {
|
||||||
|
expect(clampQuickChatInputHeight(600)).toBe(320);
|
||||||
|
expect(clampQuickChatInputHeight(80)).toBe(80);
|
||||||
|
expect(clampQuickChatInputHeight(20)).toBe(40);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("renders quick chat input as textarea and assigns a px height while typing", () => {
|
||||||
|
render(<QuickChatFAB addToast={vi.fn()} projectId="proj-1" open />);
|
||||||
|
|
||||||
|
const input = screen.getByTestId("quick-chat-input");
|
||||||
|
Object.defineProperty(input, "scrollHeight", {
|
||||||
|
configurable: true,
|
||||||
|
get: () => 96,
|
||||||
|
});
|
||||||
|
|
||||||
|
fireEvent.change(input, { target: { value: "line 1\nline 2" } });
|
||||||
|
|
||||||
|
expect(input.tagName).toBe("TEXTAREA");
|
||||||
|
expect((input as HTMLTextAreaElement).style.height).toMatch(/^\d+px$/);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user