From c56238b329f6e29e624c1b51b8ffac12f9b1584e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 23:08:55 +0000 Subject: [PATCH] Fix moderation fixture click timeout by preventing VideoCard auto-hide The `VideoCard` component automatically hides itself if it detects no valid playback source (no URL or magnet). This caused the moderation visual test fixtures, which used dummy data without sources, to be hidden (`hidden=""` on root element) in the DOM, even though they were "visible" in terms of layout (display: block forced on inner container). This state prevented Playwright from interacting with the "Show anyway" button, causing click timeouts. This change: 1. Updates `docs/moderation/fixtures/index.html` to provide a dummy URL for all fixture videos, ensuring the card remains visible and interactive. 2. Implements the missing `onModerationHide` handler in the fixture logic to support the full override/restore lifecycle in tests. 3. Uncomments and restores the failing assertions in `tests/visual/moderation.spec.ts`. 4. Removes `force: true` from click actions as the elements are now properly visible. Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- docs/moderation/fixtures/index.html | 21 ++++++++++++++++----- tests/visual/moderation.spec.ts | 24 ++++++------------------ 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/docs/moderation/fixtures/index.html b/docs/moderation/fixtures/index.html index c18e1f2a..f8cdd3fe 100644 --- a/docs/moderation/fixtures/index.html +++ b/docs/moderation/fixtures/index.html @@ -75,7 +75,8 @@ id: "1".repeat(64), title: "Fixture: Blurred Preview", pubkey: "a".repeat(64), - thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg" + thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg", + url: "https://example.com/dummy.mp4" }, moderation: { blockAutoplay: true, @@ -103,7 +104,8 @@ id: "2".repeat(64), title: "Fixture: Autoplay Blocked", pubkey: "e".repeat(64), - thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg" + thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg", + url: "https://example.com/dummy.mp4" }, moderation: { blockAutoplay: true, @@ -127,7 +129,8 @@ id: "3".repeat(64), title: "Fixture: Override Persistence", pubkey: "f".repeat(64), - thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg" + thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg", + url: "https://example.com/dummy.mp4" }, moderation: { blockAutoplay: true, @@ -152,7 +155,8 @@ id: "4".repeat(64), title: "Fixture: Trusted Report Hide", pubkey: "aa".repeat(32), - thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg" + thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg", + url: "https://example.com/dummy.mp4" }, moderation: { blockAutoplay: true, @@ -177,7 +181,8 @@ id: "5".repeat(64), title: "Fixture: Trusted Mute Hide", pubkey: "bb".repeat(32), - thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg" + thumbnail: "/assets/jpg/video-thumbnail-fallback.jpg", + url: "https://example.com/dummy.mp4" }, moderation: { blockAutoplay: false, @@ -607,6 +612,12 @@ } return true; }; + + card.onModerationHide = () => { + overrides = setOverride(overrides, video.id, { showAnyway: false }); + refreshModeration(); + return true; + }; } const root = card.getRoot(); diff --git a/tests/visual/moderation.spec.ts b/tests/visual/moderation.spec.ts index 945d04d8..d5e0516c 100644 --- a/tests/visual/moderation.spec.ts +++ b/tests/visual/moderation.spec.ts @@ -89,14 +89,11 @@ test.describe("moderation fixtures", () => { await expect(overrideCard).toHaveAttribute("data-autoplay-policy", "blocked"); await expect(thumbnail).toHaveAttribute("data-thumbnail-state", "blurred"); - // TODO: Investigate why visibility check fails in fixture environment (headless) - // await expect(showAnywayButton).toBeVisible(); + await expect(showAnywayButton).toBeVisible(); await expect(restoreButtonQuery).toHaveCount(0); - // TODO: Investigate why click times out in fixture environment (headless) - // await showAnywayButton.click({ force: true }); + await showAnywayButton.click(); - /* await expect(overrideCard).toHaveAttribute( "data-moderation-override", "show-anyway" @@ -143,7 +140,6 @@ test.describe("moderation fixtures", () => { await expect( reloadedCard.getByRole("button", { name: "Show anyway" }) ).toBeVisible(); - */ }); test("trusted report hide fixture supports show anyway override", async ({ page }) => { @@ -166,14 +162,11 @@ test.describe("moderation fixtures", () => { await expect(hideCard).toHaveAttribute("data-moderation-hide-reason", "trusted-report-hide"); await expect(hideCard).toHaveAttribute("data-moderation-hide-trusted-report-count", "3"); await expect(badge).toContainText("Hidden · 3 trusted spam reports"); - // TODO: Investigate visibility check failure (fails with 0x0 size in headless) - // await expect(showAnywayButton).toBeVisible(); + await expect(showAnywayButton).toBeVisible(); await expect(restoreButtonQuery).toHaveCount(0); - // TODO: Investigate click timeout failure - // await showAnywayButton.click({ force: true }); + await showAnywayButton.click(); - /* await expect(hideCard).not.toHaveAttribute("data-moderation-hidden", "true"); await expect(hideCard).toHaveAttribute("data-moderation-override", "show-anyway"); await expect(hideCard.locator('[data-moderation-badge="true"]')).toContainText( @@ -190,7 +183,6 @@ test.describe("moderation fixtures", () => { await expect(hideCard).toHaveAttribute("data-moderation-hidden", "true"); await expect(hideCard).not.toHaveAttribute("data-moderation-override", "show-anyway"); await expect(hideCard.getByRole("button", { name: "Show anyway" })).toBeVisible(); - */ }); test("trusted mute hide fixture annotates mute reason and can be overridden", async ({ @@ -219,14 +211,11 @@ test.describe("moderation fixtures", () => { await expect(muteCard).toHaveAttribute("data-moderation-trusted-mute-count", "1"); await expect(badge).toContainText("Hidden · 1 trusted mute"); await expect(thumbnail).toHaveAttribute("data-thumbnail-state", "blurred"); - // TODO: Investigate visibility check failure - // await expect(showAnywayButton).toBeVisible(); + await expect(showAnywayButton).toBeVisible(); await expect(restoreButtonQuery).toHaveCount(0); - // TODO: Investigate click timeout failure - // await showAnywayButton.click({ force: true }); + await showAnywayButton.click(); - /* await expect(muteCard).not.toHaveAttribute("data-moderation-hidden", "true"); await expect(muteCard).toHaveAttribute("data-moderation-override", "show-anyway"); await expect(muteCard.locator('[data-moderation-badge="true"]')).toContainText( @@ -245,6 +234,5 @@ test.describe("moderation fixtures", () => { await expect(muteCard).not.toHaveAttribute("data-moderation-override", "show-anyway"); await expect(thumbnail).toHaveAttribute("data-thumbnail-state", "blurred"); await expect(muteCard.getByRole("button", { name: "Show anyway" })).toBeVisible(); - */ }); });