
























@@ -100,11 +100,12 @@ describe("chat header controls (browser)", () => {
100100container.querySelectorAll<HTMLButtonElement>(".chat-controls .btn--icon[data-tooltip]"),
101101);
102102103-expect(buttons).toHaveLength(5);
103+expect(buttons).toHaveLength(6);
104104105105const labels = buttons.map((button) => button.getAttribute("data-tooltip"));
106106expect(labels).toEqual([
107107t("chat.refreshTitle"),
108+`${t("chat.autoScrollMode")}: ${t("chat.autoScrollNearBottom")}`,
108109t("chat.thinkingToggle"),
109110t("chat.toolCallsToggle"),
110111t("chat.focusToggle"),
@@ -162,7 +163,9 @@ describe("chat header controls (browser)", () => {
162163container.querySelectorAll<HTMLButtonElement>(".chat-controls__thinking .btn--icon"),
163164);
164165165-expect(buttons).toHaveLength(4);
166+expect(buttons).toHaveLength(5);
167+const autoScrollButton = requireButton(buttons.at(0), "auto-scroll mode");
168+expect(autoScrollButton.dataset.chatAutoScrollMode).toBe("near-bottom");
166169const cronButton = requireButton(buttons.at(-1), "cron sessions");
167170expect([...cronButton.classList]).toEqual(["btn", "btn--sm", "btn--icon", "active"]);
168171expect(cronButton.getAttribute("aria-pressed")).toBe("true");
@@ -173,26 +176,29 @@ describe("chat header controls (browser)", () => {
173176expect(state.sessionsHideCron).toBe(false);
174177});
175178176-it("renders and applies the chat auto-scroll mode selector", async () => {
179+it("renders and applies the chat auto-scroll mode toggle", async () => {
177180const applySettings = vi.fn();
178181const state = createState({ applySettings });
179182const container = document.createElement("div");
180183render(renderChatControls(state), container);
181184await Promise.resolve();
182185183-const select = requireElement(
184-container.querySelector<HTMLSelectElement>('[data-chat-auto-scroll-select="true"]'),
185-"auto-scroll select",
186+const toggle = requireButton(
187+container.querySelector<HTMLButtonElement>('[data-chat-auto-scroll-toggle="true"]'),
188+"auto-scroll toggle",
186189);
187-expect(select.getAttribute("aria-label")).toBe(t("chat.autoScrollMode"));
188-expect(select.value).toBe("near-bottom");
190+expect(toggle.getAttribute("aria-label")).toBe(
191+`${t("chat.autoScrollMode")}: ${t("chat.autoScrollNearBottom")}`,
192+);
193+expect(toggle.getAttribute("data-tooltip")).toBe(toggle.getAttribute("aria-label"));
194+expect(toggle.dataset.chatAutoScrollMode).toBe("near-bottom");
195+expect(toggle.getAttribute("aria-pressed")).toBe("true");
189196190-select.value = "off";
191-select.dispatchEvent(new Event("change"));
197+toggle.click();
192198193199expect(applySettings).toHaveBeenCalledWith({
194200 ...state.settings,
195-chatAutoScroll: "off",
201+chatAutoScroll: "always",
196202});
197203});
198204@@ -229,12 +235,16 @@ describe("chat header controls (browser)", () => {
229235const selectDatasets = Array.from(container.querySelectorAll("select")).map(
230236(select) => select.dataset,
231237);
232-expect(selectDatasets).toHaveLength(5);
238+expect(selectDatasets).toHaveLength(4);
233239expect(selectDatasets[0]?.chatAgentFilter).toBe("true");
234240expect(selectDatasets[1]?.chatSessionSelect).toBe("true");
235241expect(selectDatasets[2]?.chatModelSelect).toBe("true");
236242expect(selectDatasets[3]?.chatThinkingSelect).toBe("true");
237-expect(selectDatasets[4]?.chatAutoScrollSelect).toBe("true");
243+const autoScrollToggle = requireButton(
244+container.querySelector<HTMLButtonElement>('[data-chat-auto-scroll-toggle="true"]'),
245+"auto-scroll toggle",
246+);
247+expect(autoScrollToggle.dataset.chatAutoScrollMode).toBe("near-bottom");
238248});
239249240250it("renders the mobile dropdown from state instead of mutating DOM classes", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。