Files
bookhoard/tests/ui/add_order_probe.spec.ts
T
John O'Keefe ace9e57d27 fix(ui): hx-confirm interception actually worked — htmx 2 detail shape
User report: Remove Feed still used the browser dialog. Headless-proven
root cause (tests/ui/confirm_probe.spec.ts): the htmx:confirm handler
read evt.detail.element, which htmx 2 does not provide (its detail is
{ elt, question, issueRequest, ... }) — the handler returned at
'if (!elt) return' BEFORE preventDefault, so every hx-confirm sitewide
fell through to htmx's native confirm. The acbcc61a migration only ever
worked for direct confirmDialog() callers; hx-confirm interception was
dead on arrival against htmx 2 and no test watched the JS side.

Fix: read detail.question (htmx's own closest-attribute resolution of
hx-confirm); return without preventing default when absent. Probe
spec pins: click Remove Feed → #confirm-modal opens with the message,
cancel hides it, no dialog event fires.

Companion fixes in the same user-test round (one commit, one defect
family — templ boolean attributes + confirm-modal placement):
- Add-modal Download order never revealed: #podcast-download-all was
  nested in a wrapper div, so ':checked ~ .podcast-add-order' had no
  sibling relationship. Input, label, and order row are now siblings.
- Order/auto-download dropdowns always DISPLAYED the last option
  ('Newest first'/'Newest') whatever was saved: templ selected={ bool }
  emits selected="false" — presence selects, so every option was
  selected and the browser honored the last. Swept to selected?={...}
  across podcast_detail (14), book_detail_modals (10, incl. two
  always-checked checkboxes), collection_modal (2, same). Saves were
  correct all along; display only.
- Global confirm modal moved from SidebarSignIn (signed-out only!) into
  Header — signed-in pages had no #confirm-modal, so confirmDialog
  degraded to window.confirm even with a working interceptor.

Facet bar scale (user question): values now carry feed counts, sort
frequency-first, cap at 6 chips per group with a native <details>
'+N more' expander.

Probes: tests/ui/confirm_probe.spec.ts + add_order_probe.spec.ts
(live-server, BH_FEED-gated) — both pass against the dev instance.
2026-10-30 12:24:16 -04:00

28 lines
1.2 KiB
TypeScript

// One-off probe: the add-modal "Download order" select must reveal when
// "Download all episodes now" is checked (pure-CSS sibling selector —
// the checkbox was nested, so the selector never fired; 2026-10-30).
import { test, expect } from "@playwright/test";
const BASE = process.env.BH_BASE ?? "http://localhost:8765";
test("download-order select reveals with the download-all checkbox", async ({ page }) => {
await page.request.post(`${BASE}/api/auth/login`, {
data: { login: "testuser", password: "Test@Pass123!" },
});
await page.goto(`${BASE}/podcasts`);
await page.getByRole("button", { name: "Add Feed" }).click();
const modal = page.locator("#podcast-add-feed-modal");
await expect(modal).toBeVisible();
const checkbox = page.locator("#podcast-download-all");
const orderRow = page.locator("#podcast-add-modal .podcast-add-order, form .podcast-add-order").first();
const orderSelect = page.locator("#podcast-download-order");
await expect(orderSelect).toBeAttached();
await expect(orderRow).toBeHidden(); // unchecked → hidden
await checkbox.check();
await expect(orderRow).toBeVisible(); // checked → revealed
await expect(orderSelect).toBeVisible();
});