From ba4a1052e847b0b6827e30ad7b818e05ec7a3ef4 Mon Sep 17 00:00:00 2001 From: wxs Date: Fri, 17 Jul 2026 13:06:48 +0800 Subject: [PATCH] test: verify folder dialog listener cleanup --- tests/favorite-folder-dialog.test.ts | 49 +++++++++++++++------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/tests/favorite-folder-dialog.test.ts b/tests/favorite-folder-dialog.test.ts index 7577394..6ed5067 100644 --- a/tests/favorite-folder-dialog.test.ts +++ b/tests/favorite-folder-dialog.test.ts @@ -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 () => {