
























@@ -2,6 +2,7 @@
2233import { html, render } from "lit";
44import { beforeEach, describe, expect, it, vi } from "vitest";
5+import { i18n } from "../i18n/index.ts";
56import type { AppViewState } from "./app-view-state.ts";
67import type { ChatProps } from "./views/chat.ts";
78import type { QuickSettingsProps } from "./views/config-quick.ts";
@@ -13,6 +14,7 @@ const chatProps = vi.hoisted(() => ({
1314current: null as ChatProps | null,
1415}));
1516const localStorageValues = vi.hoisted(() => new Map<string, string>());
17+const renderChatControlsMock = vi.hoisted(() => vi.fn(() => "chat-controls"));
16181719vi.mock("../local-storage.ts", () => ({
1820getSafeLocalStorage: () => ({
@@ -33,10 +35,18 @@ vi.mock("./views/config-quick.ts", () => ({
3335vi.mock("./views/chat.ts", () => ({
3436renderChat: (props: ChatProps) => {
3537chatProps.current = props;
36-return html`<div data-testid="chat"></div>`;
38+return html`<div data-testid="chat">${props.composerControls}</div>`;
3739},
3840}));
394142+vi.mock("./app-render.helpers.ts", async (importOriginal) => {
43+const actual = await importOriginal<typeof import("./app-render.helpers.ts")>();
44+return {
45+ ...actual,
46+renderChatControls: renderChatControlsMock,
47+};
48+});
49+4050vi.mock("./icons.ts", () => ({
4151icons: {},
4252}));
@@ -218,10 +228,12 @@ function createState(overrides: Partial<AppViewState> = {}): AppViewState {
218228} as unknown as AppViewState;
219229}
220230221-beforeEach(() => {
231+beforeEach(async () => {
232+await i18n.setLocale("en");
222233localStorageValues.clear();
223234quickSettingsProps.current = null;
224235chatProps.current = null;
236+renderChatControlsMock.mockClear();
225237});
226238227239describe("renderApp assistant avatar routing", () => {
@@ -332,6 +344,35 @@ describe("renderApp assistant avatar routing", () => {
332344expect(chatProps.current?.error).toBe("gateway disconnected");
333345});
334346347+it("does not rebuild chat composer controls for draft-only rerenders", () => {
348+const container = document.createElement("div");
349+const state = createState({ tab: "chat", chatMessage: "" });
350+351+render(renderApp(state), container);
352+state.chatMessage = "h";
353+render(renderApp(state), container);
354+state.chatMessage = "hello";
355+render(renderApp(state), container);
356+357+expect(renderChatControlsMock).toHaveBeenCalledTimes(1);
358+359+state.chatSending = true;
360+render(renderApp(state), container);
361+362+expect(renderChatControlsMock).toHaveBeenCalledTimes(2);
363+});
364+365+it("rebuilds chat composer controls after locale changes", async () => {
366+const container = document.createElement("div");
367+const state = createState({ tab: "chat", chatMessage: "" });
368+369+render(renderApp(state), container);
370+await i18n.setLocale("zh-CN");
371+render(renderApp(state), container);
372+373+expect(renderChatControlsMock).toHaveBeenCalledTimes(2);
374+});
375+335376it("passes security quick setting fields to Quick Settings", () => {
336377const state = createState({
337378configForm: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。