diff --git a/src/lib/server/shopping/repository.ts b/src/lib/server/shopping/repository.ts index 39432bd..bd0e338 100644 --- a/src/lib/server/shopping/repository.ts +++ b/src/lib/server/shopping/repository.ts @@ -47,8 +47,11 @@ export function addRecipeToCart( ).run(recipeId, resolved, profileId); } -export function removeRecipeFromCart(_db: Database.Database, _recipeId: number): void { - throw new Error('not implemented'); +export function removeRecipeFromCart( + db: Database.Database, + recipeId: number +): void { + db.prepare('DELETE FROM shopping_cart_recipe WHERE recipe_id = ?').run(recipeId); } export function setCartServings( diff --git a/tests/integration/shopping-repository.test.ts b/tests/integration/shopping-repository.test.ts index 2487f2d..388e310 100644 --- a/tests/integration/shopping-repository.test.ts +++ b/tests/integration/shopping-repository.test.ts @@ -3,6 +3,7 @@ import { openInMemoryForTest } from '../../src/lib/server/db'; import { insertRecipe } from '../../src/lib/server/recipes/repository'; import { addRecipeToCart, + removeRecipeFromCart, listShoppingList } from '../../src/lib/server/shopping/repository'; import type { Recipe } from '../../src/lib/types'; @@ -63,3 +64,23 @@ describe('addRecipeToCart', () => { expect(listShoppingList(db).recipes[0].servings).toBe(4); }); }); + +describe('removeRecipeFromCart', () => { + it('deletes only the given recipe', () => { + const db = openInMemoryForTest(); + const a = insertRecipe(db, recipe({ title: 'A' })); + const b = insertRecipe(db, recipe({ title: 'B' })); + addRecipeToCart(db, a, null); + addRecipeToCart(db, b, null); + removeRecipeFromCart(db, a); + const snap = listShoppingList(db); + expect(snap.recipes).toHaveLength(1); + expect(snap.recipes[0].recipe_id).toBe(b); + }); + + it('is idempotent when recipe is not in cart', () => { + const db = openInMemoryForTest(); + const id = insertRecipe(db, recipe()); + expect(() => removeRecipeFromCart(db, id)).not.toThrow(); + }); +});