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