From 2c756dd037f60324b0499ea8ddbbc853d66aae1c Mon Sep 17 00:00:00 2001 From: Amolith Date: Wed, 10 Jun 2026 15:30:22 -0600 Subject: [PATCH] shopping-list: clear list client --- internal/cooked/client.go | 5 +++++ internal/cooked/client_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/internal/cooked/client.go b/internal/cooked/client.go index d8fd1f0f6a7d39496a339ac3a7388da7dd05a019..8a4451d801ac719960c72300cf4f8d7b0f626131 100644 --- a/internal/cooked/client.go +++ b/internal/cooked/client.go @@ -122,6 +122,11 @@ func (c *Client) ReadShoppingList(ctx context.Context) (ShoppingList, error) { return response.ShoppingList, nil } +// ClearShoppingList logs in when needed and clears the authenticated user's shopping list. +func (c *Client) ClearShoppingList(ctx context.Context) error { + return c.doAuthenticated(ctx, http.MethodDelete, "/api/user/{username}/shopping-list", nil, nil) +} + // ListRecipes logs in when needed and returns one page of saved recipes. func (c *Client) ListRecipes(ctx context.Context, page, limit int) ([]RecipeCard, error) { query := url.Values{} diff --git a/internal/cooked/client_test.go b/internal/cooked/client_test.go index 3aa655ba16963a3151088a18f4332141161e49b9..c69b39a4592cf90e7f4036dc1bc38f1f88eaf70d 100644 --- a/internal/cooked/client_test.go +++ b/internal/cooked/client_test.go @@ -174,6 +174,21 @@ func TestDeleteRecipeDeletesSavedRecipe(t *testing.T) { } } +func TestClearShoppingListACIDShoppingListClear1ClearsAllItems(t *testing.T) { + var clearCalls int + client, closeServer := newTestClient(t, clearShoppingListTestHandler(t, &clearCalls)) + defer closeServer() + + err := client.ClearShoppingList(context.Background()) + if err != nil { + t.Fatalf("ClearShoppingList() error = %v", err) + } + + if clearCalls != 1 { + t.Fatalf("clear calls = %d, want 1", clearCalls) + } +} + func TestUserPathEscapesAuthenticatedUsername(t *testing.T) { client := &Client{authenticatedUsername: "user/name"} @@ -389,6 +404,24 @@ func deleteRecipeTestHandler(t *testing.T, deleteCalls *int) http.HandlerFunc { } } +func clearShoppingListTestHandler(t *testing.T, clearCalls *int) http.HandlerFunc { + t.Helper() + + return func(w http.ResponseWriter, r *http.Request) { + switch r.URL.EscapedPath() { + case "/api/public/login": + writeLoginResponse(t, w) + case "/api/user/returned-user/shopping-list": + requireMethod(t, r, http.MethodDelete, "clear shopping list") + requireSessionCookie(t, r) + (*clearCalls)++ + w.WriteHeader(http.StatusNoContent) + default: + t.Fatalf("unexpected path %s", r.URL.EscapedPath()) + } + } +} + func requirePreviewRecipeTextRequest(t *testing.T, r *http.Request) { t.Helper()