fix: validate favorite folder removal

This commit is contained in:
wxs
2026-07-17 11:58:12 +08:00
parent 30748ddc0f
commit a7d62c7ec0
2 changed files with 20 additions and 0 deletions
+5
View File
@@ -107,6 +107,11 @@ export function createFavoritesRepository(options: {
}, },
async removeCreatorFromFolder(authorId, folderId) { async removeCreatorFromFolder(authorId, folderId) {
await mutate((state) => { await mutate((state) => {
const folder = state.folders.find((item) => item.id === folderId);
if (!folder) {
throw new Error(`收藏夹不存在: ${folderId}`);
}
state.memberships = state.memberships.filter( state.memberships = state.memberships.filter(
(membership) => (membership) =>
membership.authorId !== authorId || membership.folderId !== folderId membership.authorId !== authorId || membership.folderId !== folderId
+15
View File
@@ -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 () => { test("recovers from malformed, duplicate, and dangling stored values", async () => {
const { repository } = createRepository( const { repository } = createRepository(
createMemoryStorage({ createMemoryStorage({