test: verify folder dialog listener cleanup

This commit is contained in:
wxs
2026-07-17 13:06:48 +08:00
parent 6570eb32b4
commit ba4a1052e8
+24 -21
View File
@@ -1,6 +1,6 @@
// @vitest-environment jsdom // @vitest-environment jsdom
import { beforeEach, describe, expect, test } from "vitest"; import { beforeEach, describe, expect, test, vi } from "vitest";
import { promptForFavoriteFolderName } from "../src/content/market/favorite-folder-dialog"; import { promptForFavoriteFolderName } from "../src/content/market/favorite-folder-dialog";
@@ -146,31 +146,34 @@ describe("favorite-folder-dialog", () => {
await expect(second).resolves.toBeNull(); await expect(second).resolves.toBeNull();
}); });
test("removes a closed dialog keydown listener before a fresh dialog opens", async () => { test("removes the exact captured document keydown listener when closed", async () => {
let firstSettlementCount = 0; const addEventListener = vi.spyOn(document, "addEventListener");
const first = promptForFavoriteFolderName(document, { const removeEventListener = vi.spyOn(document, "removeEventListener");
try {
const result = promptForFavoriteFolderName(document, {
title: "新建收藏夹" title: "新建收藏夹"
}); });
void first.then(() => { const keydownRegistration = addEventListener.mock.calls.find(
firstSettlementCount += 1; (call) => call[0] === "keydown" && call[2] === true
}); );
if (!keydownRegistration) {
throw new Error("Expected a captured keydown listener");
}
const keydownHandler = keydownRegistration[1];
readButton("cancel").click(); readButton("cancel").click();
await expect(first).resolves.toBeNull(); await expect(result).resolves.toBeNull();
await Promise.resolve();
expect(firstSettlementCount).toBe(1);
const current = promptForFavoriteFolderName(document, { expect(removeEventListener).toHaveBeenCalledWith(
title: "重命名收藏夹" "keydown",
}); keydownHandler,
document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape" })); true
);
await expect(current).resolves.toBeNull(); } finally {
await Promise.resolve(); addEventListener.mockRestore();
expect(firstSettlementCount).toBe(1); removeEventListener.mockRestore();
expect( }
document.querySelector('[data-sces-favorite-folder-dialog="root"]')
).toBeNull();
}); });
test("traps Tab within the dialog and restores the opener focus on close", async () => { test("traps Tab within the dialog and restores the opener focus on close", async () => {