From a7d62c7ec0393f7ed38426d70ea84d2d1c423d18 Mon Sep 17 00:00:00 2001 From: wxs Date: Fri, 17 Jul 2026 11:58:12 +0800 Subject: [PATCH] fix: validate favorite folder removal --- src/content/market/favorites-store.ts | 5 +++++ tests/favorites-store.test.ts | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/content/market/favorites-store.ts b/src/content/market/favorites-store.ts index 4ba3c62..009f3ba 100644 --- a/src/content/market/favorites-store.ts +++ b/src/content/market/favorites-store.ts @@ -107,6 +107,11 @@ export function createFavoritesRepository(options: { }, async removeCreatorFromFolder(authorId, folderId) { await mutate((state) => { + const folder = state.folders.find((item) => item.id === folderId); + if (!folder) { + throw new Error(`收藏夹不存在: ${folderId}`); + } + state.memberships = state.memberships.filter( (membership) => membership.authorId !== authorId || membership.folderId !== folderId diff --git a/tests/favorites-store.test.ts b/tests/favorites-store.test.ts index feba11f..d61a512 100644 --- a/tests/favorites-store.test.ts +++ b/tests/favorites-store.test.ts @@ -136,6 +136,21 @@ describe("favorites-store", () => { }); }); + test("rejects removal from an unknown folder without changing state", async () => { + const { repository } = createRepository(); + const folder = await repository.createFolder("合作"); + await repository.setCreatorFolderIds( + { authorId: "author-1", authorName: "Alice" }, + [folder.id] + ); + const beforeRemoval = await repository.read(); + + await expect( + repository.removeCreatorFromFolder("author-1", "missing") + ).rejects.toThrow("收藏夹不存在"); + await expect(repository.read()).resolves.toEqual(beforeRemoval); + }); + test("recovers from malformed, duplicate, and dangling stored values", async () => { const { repository } = createRepository( createMemoryStorage({