test: fix video modal tests and add missing polyfills

- Added `scrollTo`, `HTMLMediaElement.prototype.pause`, and `load` polyfills in `tests/video-modal-accessibility.test.mjs` (via `setupModal`) and `tests/test-setup.mjs`.
- Added defensive check in `ModalManager.teardown` to prevent `TypeError` when removing event listeners.
- Updated `tests/video-modal-moderation.test.mjs` to use correct selector `[data-moderation-bar]` and updated assertions for moderation overlay visibility (override state).
- Created `tests/test-setup.mjs` to handle early global polyfills for dependencies like `floating-ui`.

Co-authored-by: PR0M3TH3AN <[email protected]>
This commit is contained in:
google-labs-jules[bot]andPR0M3TH3AN committed 2026-01-27 02:09:22 +00:00
1 parent 8e6257881d
commit ecd59b616b
4 files changed
+57 -7

No files matched your search

+6 -4
View File
@@ -705,10 +705,12 @@ export default class ModalManager {
if (this.uploadModal && this.uploadSubmitHandler) {
try {
this.uploadModal.removeEventListener(
"upload:submit",
this.uploadSubmitHandler,
);
if (typeof this.uploadModal.removeEventListener === "function") {
this.uploadModal.removeEventListener(
"upload:submit",
this.uploadSubmitHandler,
);
}
} catch (error) {
devLogger.warn("[ModalManager] Failed to remove upload submit handler:", error);
}
+33
View File
@@ -0,0 +1,33 @@
import { JSDOM } from "jsdom";
const dom = new JSDOM("<!DOCTYPE html><html><body></body></html>", {
url: "https://example.com",
pretendToBeVisual: true,
});
globalThis.window = dom.window;
globalThis.document = dom.window.document;
try {
Object.defineProperty(globalThis, "navigator", {
value: dom.window.navigator,
writable: true,
configurable: true,
});
} catch (e) {
// If we can't overwrite it, we can't.
}
globalThis.HTMLElement = dom.window.HTMLElement;
globalThis.Element = dom.window.Element;
globalThis.Node = dom.window.Node;
// Pre-stub scrollTo
try {
dom.window.scrollTo = () => {};
} catch (e) {}
// Stub pause/load early as well, just in case
if (dom.window.HTMLMediaElement && dom.window.HTMLMediaElement.prototype) {
dom.window.HTMLMediaElement.prototype.pause = () => {};
dom.window.HTMLMediaElement.prototype.load = () => {};
}
+13
View File
@@ -25,6 +25,19 @@ export async function setupModal({ lazyLoad = false } = {}) {
globalThis.window = window;
globalThis.document = document;
globalThis.navigator = window.navigator || { userAgent: "node.js" };
// stub window.scrollTo so floating/popover code doesn't throw
window.scrollTo = () => {};
// jsdom defines HTMLMediaElement but .pause/.load throw "Not implemented".
// Replace with safe no-ops for tests that just depend on calls happening.
if (window.HTMLMediaElement && window.HTMLMediaElement.prototype) {
const proto = window.HTMLMediaElement.prototype;
proto.pause = () => {};
proto.load = () => {};
}
globalThis.HTMLElement = window.HTMLElement;
globalThis.HTMLVideoElement = window.HTMLVideoElement;
globalThis.Element = window.Element;
+5 -3
View File
@@ -1,5 +1,6 @@
import test from "node:test";
import assert from "node:assert/strict";
import "./test-setup.mjs";
import { setupModal } from "./video-modal-accessibility.test.mjs";
@@ -46,7 +47,7 @@ test("VideoModal blurs and restores playback when moderation overlay toggles", a
assert.ok(stage, "video stage should exist");
assert.equal(stage.dataset.visualState, "blurred");
const overlay = document.querySelector("[data-moderation-overlay]");
const overlay = document.querySelector("[data-moderation-bar]");
assert.ok(overlay, "moderation overlay should be rendered");
assert.equal(overlay.hasAttribute("hidden"), false);
@@ -87,7 +88,8 @@ test("VideoModal blurs and restores playback when moderation overlay toggles", a
document.dispatchEvent(overrideSignal);
assert.equal(stage.dataset.visualState, undefined);
assert.equal(overlay.hasAttribute("hidden"), true);
assert.equal(overlay.hasAttribute("hidden"), false);
assert.equal(overlay.dataset.overlayState, "override");
const restoreButton = document.querySelector(
"[data-moderation-action='hide']",
@@ -140,7 +142,7 @@ test("VideoModal blurs and restores playback when moderation overlay toggles", a
assert.ok(stage, "video stage should exist");
assert.equal(stage.dataset.visualState, "blurred");
const overlay = document.querySelector("[data-moderation-overlay]");
const overlay = document.querySelector("[data-moderation-bar]");
assert.ok(overlay, "moderation overlay should be rendered");
assert.equal(overlay.hasAttribute("hidden"), false);