


























@@ -1,8 +1,15 @@
11import { render } from "lit";
22import { describe, expect, it } from "vitest";
33import { t } from "../i18n/index.ts";
4-import { renderChatControls } from "./app-render.helpers.ts";
4+import { renderChatControls, renderChatMobileToggle } from "./app-render.helpers.ts";
55import type { AppViewState } from "./app-view-state.ts";
6+import type { SessionsListResult } from "./types.ts";
7+8+type SessionRow = SessionsListResult["sessions"][number];
9+10+function row(overrides: Partial<SessionRow> & { key: string }): SessionRow {
11+return { kind: "direct", updatedAt: 0, ...overrides };
12+}
613714function createState(overrides: Partial<AppViewState> = {}) {
815return {
@@ -66,4 +73,35 @@ describe("chat header controls (browser)", () => {
6673expect(button.getAttribute("aria-label")).toBe(button.getAttribute("data-tooltip"));
6774}
6875});
76+77+it("renders the cron session filter in the mobile dropdown controls", async () => {
78+const state = createState({
79+sessionsResult: {
80+ts: 0,
81+path: "",
82+count: 2,
83+defaults: { modelProvider: "openai", model: "gpt-5", contextTokens: null },
84+sessions: [row({ key: "main" }), row({ key: "agent:main:cron:daily-briefing" })],
85+},
86+});
87+const container = document.createElement("div");
88+render(renderChatMobileToggle(state), container);
89+await Promise.resolve();
90+91+const buttons = Array.from(
92+container.querySelectorAll<HTMLButtonElement>(".chat-controls__thinking .btn--icon"),
93+);
94+95+expect(buttons).toHaveLength(4);
96+const cronButton = buttons.at(-1);
97+expect(cronButton?.classList.contains("active")).toBe(true);
98+expect(cronButton?.getAttribute("aria-pressed")).toBe("true");
99+expect(cronButton?.getAttribute("title")).toBe(
100+t("chat.showCronSessionsHidden", { count: "1" }),
101+);
102+103+cronButton?.click();
104+105+expect(state.sessionsHideCron).toBe(false);
106+});
69107});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。