test: verify folder dialog listener cleanup

This commit is contained in:
wxs
2026-07-17 13:06:48 +08:00
parent 6570eb32b4
commit ba4a1052e8
+26 -23
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");
title: "新建收藏夹"
});
void first.then(() => {
firstSettlementCount += 1;
});
readButton("cancel").click(); try {
await expect(first).resolves.toBeNull(); const result = promptForFavoriteFolderName(document, {
await Promise.resolve(); title: "新建收藏夹"
expect(firstSettlementCount).toBe(1); });
const keydownRegistration = addEventListener.mock.calls.find(
(call) => call[0] === "keydown" && call[2] === true
);
if (!keydownRegistration) {
throw new Error("Expected a captured keydown listener");
}
const keydownHandler = keydownRegistration[1];
const current = promptForFavoriteFolderName(document, { readButton("cancel").click();
title: "重命名收藏夹" await expect(result).resolves.toBeNull();
});
document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape" }));
await expect(current).resolves.toBeNull(); expect(removeEventListener).toHaveBeenCalledWith(
await Promise.resolve(); "keydown",
expect(firstSettlementCount).toBe(1); keydownHandler,
expect( true
document.querySelector('[data-sces-favorite-folder-dialog="root"]') );
).toBeNull(); } finally {
addEventListener.mockRestore();
removeEventListener.mockRestore();
}
}); });
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 () => {