


























@@ -4,6 +4,23 @@ import { render } from "lit";
44import { describe, expect, it, vi } from "vitest";
55import { renderQuickSettings, type QuickSettingsProps } from "./config-quick.ts";
667+function expectButtonByText(container: Element, text: string): HTMLButtonElement {
8+const button = Array.from(container.querySelectorAll("button")).find(
9+(candidate) => candidate.textContent?.trim() === text,
10+);
11+if (!(button instanceof HTMLButtonElement)) {
12+throw new Error(`Expected button labelled ${text}`);
13+}
14+return button;
15+}
16+17+function expectFileInput(input: Element | null | undefined): HTMLInputElement {
18+if (!(input instanceof HTMLInputElement)) {
19+throw new Error("Expected file input");
20+}
21+return input;
22+}
23+724function createProps(overrides: Partial<QuickSettingsProps> = {}): QuickSettingsProps {
825return {
926currentModel: "gpt-5.5",
@@ -253,11 +270,7 @@ describe("renderQuickSettings", () => {
253270expect(container.querySelector(".qs-identity-card__source")?.textContent).toContain(
254271"UI override",
255272);
256-const clear = Array.from(container.querySelectorAll("button")).find(
257-(button) => button.textContent?.trim() === "Clear override",
258-);
259-expect(clear).toBeInstanceOf(HTMLButtonElement);
260-clear!.dispatchEvent(new Event("click"));
273+expectButtonByText(container, "Clear override").dispatchEvent(new Event("click"));
261274262275expect(onAssistantAvatarClearOverride).toHaveBeenCalledTimes(1);
263276});
@@ -307,18 +320,19 @@ describe("renderQuickSettings", () => {
307320const container = document.createElement("div");
308321render(renderQuickSettings(createProps({ onUserAvatarChange })), container);
309322310-const input = Array.from(container.querySelectorAll('input[type="file"]')).find(
311-(node) => !node.closest(".qs-identity-card--assistant"),
312-) as HTMLInputElement | null;
313-expect(input).toBeInstanceOf(HTMLInputElement);
323+const input = expectFileInput(
324+Array.from(container.querySelectorAll('input[type="file"]')).find(
325+(node) => !node.closest(".qs-identity-card--assistant"),
326+),
327+);
314328315329const file = new File([new Uint8Array(1_500_001)], "avatar.png", { type: "image/png" });
316-Object.defineProperty(input!, "files", {
330+Object.defineProperty(input, "files", {
317331configurable: true,
318332value: [file],
319333});
320334321-input!.dispatchEvent(new Event("change"));
335+input.dispatchEvent(new Event("change"));
322336323337expect(fileReader).not.toHaveBeenCalled();
324338expect(onUserAvatarChange).not.toHaveBeenCalled();
@@ -355,11 +369,7 @@ describe("renderQuickSettings", () => {
355369container,
356370);
357371358-const customButton = Array.from(container.querySelectorAll("button")).find(
359-(button) => button.textContent?.trim() === "Import",
360-);
361-expect(customButton).toBeInstanceOf(HTMLButtonElement);
362-customButton!.click();
372+expectButtonByText(container, "Import").click();
363373364374expect(onOpenCustomThemeImport).toHaveBeenCalledTimes(1);
365375expect(setTheme).not.toHaveBeenCalled();
@@ -383,11 +393,7 @@ describe("renderQuickSettings", () => {
383393container,
384394);
385395386-const customButton = Array.from(container.querySelectorAll("button")).find(
387-(button) => button.textContent?.trim() === "Light Green",
388-);
389-expect(customButton).toBeInstanceOf(HTMLButtonElement);
390-customButton!.click();
396+expectButtonByText(container, "Light Green").click();
391397392398expect(setTheme).toHaveBeenCalledWith("custom", expect.any(Object));
393399expect(onOpenCustomThemeImport).not.toHaveBeenCalled();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。