test: the gate's output carries no noise to hide a real warning in

- Home tests mocked the api without downloadIndex, so every card's download button logged a
  missing-queryFn error (64 stderr blocks per run).
- QueryState rendered without an i18n instance; Modal.fullscreen awaited a synchronous act,
  which React reports as an act environment it does not support.
- pytest: Starlette 1.x's TestClient is built on httpx2 and warned on every run without it
  (pinned in requirements-dev); alembic.ini declares its path separator.
This commit is contained in:
2026-09-17 03:03:37 +02:00
parent c3d88d9b20
commit 9c9b1cf6d5
6 changed files with 14 additions and 5 deletions
@@ -49,6 +49,7 @@ vi.mock("../lib/api", () => ({
setState: () => Promise.resolve(),
watchLaterAdd: () => Promise.resolve(),
watchLaterRemove: () => Promise.resolve(),
downloadIndex: () => Promise.resolve({}), // the cards' download buttons read it
},
DISCOVER_BUDGETS: ["short", "medium", "long", "any"],
discoverCardKey: (c: { source: string; id: string }) => `${c.source}:${c.id}`,
@@ -53,6 +53,7 @@ vi.mock("../lib/api", () => ({
setState: () => Promise.resolve(),
watchLaterAdd: () => Promise.resolve(),
watchLaterRemove: () => Promise.resolve(),
downloadIndex: () => Promise.resolve({}), // the cards' download buttons read it
comfortPins: (...a: unknown[]) => comfortPins(...a),
addComfortPin: (...a: unknown[]) => addComfortPin(...a),
removeComfortPin: (...a: unknown[]) => removeComfortPin(...a),
@@ -31,7 +31,7 @@ describe("a dialog open while fullscreen is left", () => {
it("keeps what the viewer had typed in it, and the focus inside it", async () => {
const stage = document.createElement("div");
document.body.appendChild(stage);
await setFullscreen(stage);
setFullscreen(stage);
render(
<Modal title="Download" onClose={() => {}}>
<input aria-label="name" defaultValue="" />
@@ -42,7 +42,7 @@ describe("a dialog open while fullscreen is left", () => {
field.focus();
expect(stage.contains(field)).toBe(true);
await setFullscreen(null); // the browser's own Esc leaves fullscreen; the dialog stays open
setFullscreen(null); // the browser's own Esc leaves fullscreen; the dialog stays open
const after = screen.getByLabelText("name") as HTMLInputElement;
expect(after.value).toBe("my cut");
@@ -78,7 +78,7 @@ describe("a dialog with an autoFocus child", () => {
const field = screen.getByLabelText("query");
expect(document.activeElement).toBe(field);
await setFullscreen(stage); // the player goes fullscreen under the open dialog
setFullscreen(stage); // the player goes fullscreen under the open dialog
expect(stage.contains(field)).toBe(true);
expect(document.activeElement).toBe(field);
@@ -8,6 +8,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { render, cleanup } from "@testing-library/react";
import { LoadingState } from "./QueryState";
// The label is not under test; without an i18n instance react-i18next warns on every render.
vi.mock("react-i18next", () => ({ useTranslation: () => ({ t: (key: string) => key }) }));
let now = 0;
beforeEach(() => {
vi.spyOn(performance, "now").mockImplementation(() => now);