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
import { beforeEach, describe, expect, test } from "vitest";
import { beforeEach, describe, expect, test, vi } from "vitest";
import { promptForFavoriteFolderName } from "../src/content/market/favorite-folder-dialog";
@@ -146,31 +146,34 @@ describe("favorite-folder-dialog", () => {
await expect(second).resolves.toBeNull();
});
test("removes a closed dialog keydown listener before a fresh dialog opens", async () => {
let firstSettlementCount = 0;
const first = promptForFavoriteFolderName(document, {
title: "新建收藏夹"
});
void first.then(() => {
firstSettlementCount += 1;
});
test("removes the exact captured document keydown listener when closed", async () => {
const addEventListener = vi.spyOn(document, "addEventListener");
const removeEventListener = vi.spyOn(document, "removeEventListener");
readButton("cancel").click();
await expect(first).resolves.toBeNull();
await Promise.resolve();
expect(firstSettlementCount).toBe(1);
try {
const result = promptForFavoriteFolderName(document, {
title: "新建收藏夹"
});
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, {
title: "重命名收藏夹"
});
document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape" }));
readButton("cancel").click();
await expect(result).resolves.toBeNull();
await expect(current).resolves.toBeNull();
await Promise.resolve();
expect(firstSettlementCount).toBe(1);
expect(
document.querySelector('[data-sces-favorite-folder-dialog="root"]')
).toBeNull();
expect(removeEventListener).toHaveBeenCalledWith(
"keydown",
keydownHandler,
true
);
} finally {
addEventListener.mockRestore();
removeEventListener.mockRestore();
}
});
test("traps Tab within the dialog and restores the opener focus on close", async () => {