test: verify folder dialog listener cleanup
This commit is contained in:
@@ -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 () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user