All checks were successful
deploy / deploy (push) Successful in 1m23s
Every key shop flow now works via plain HTML forms when JS is unavailable. LiveView progressively enhances when JS connects. - PDP: form wraps variant/qty/add-to-cart with action="/cart/add" - Cart page: qty +/- and remove use form POST fallbacks - Cart/search header icons are now links with phx-click enhancement - Collection sort form has GET action + noscript submit button - New /search page with form-based search for no-JS users - CartController gains add/remove/update_item POST actions - CartHook gains update_quantity_form and remove_item_form handlers - Fix flaky analytics tests caused by event table pollution Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
112 lines
3.3 KiB
Elixir
112 lines
3.3 KiB
Elixir
defmodule BerrypodWeb.CartControllerTest do
|
|
use BerrypodWeb.ConnCase, async: false
|
|
|
|
import Berrypod.AccountsFixtures
|
|
|
|
alias Berrypod.ProductsFixtures
|
|
|
|
setup do
|
|
user_fixture()
|
|
{:ok, _} = Berrypod.Settings.set_site_live(true)
|
|
:ok
|
|
end
|
|
|
|
defp create_variant(_context) do
|
|
product = ProductsFixtures.complete_product_fixture(%{title: "Test Print"})
|
|
variant = List.first(product.variants)
|
|
%{product: product, variant: variant}
|
|
end
|
|
|
|
defp conn_with_cart(conn, variant_id, qty) do
|
|
Phoenix.ConnTest.init_test_session(conn, %{"cart" => [{variant_id, qty}]})
|
|
end
|
|
|
|
describe "POST /cart/add" do
|
|
setup [:create_variant]
|
|
|
|
test "adds item to session cart and redirects to /cart", %{conn: conn, variant: variant} do
|
|
conn = post(conn, ~p"/cart/add", %{"variant_id" => variant.id, "quantity" => "1"})
|
|
|
|
assert redirected_to(conn) == "/cart"
|
|
assert Phoenix.Flash.get(conn.assigns.flash, :info) == "Added to basket"
|
|
|
|
cart = get_session(conn, "cart")
|
|
assert [{variant_id, 1}] = cart
|
|
assert variant_id == variant.id
|
|
end
|
|
|
|
test "increments quantity if item already in cart", %{conn: conn, variant: variant} do
|
|
conn =
|
|
conn
|
|
|> conn_with_cart(variant.id, 2)
|
|
|> post(~p"/cart/add", %{"variant_id" => variant.id, "quantity" => "3"})
|
|
|
|
cart = get_session(conn, "cart")
|
|
assert [{_, 5}] = cart
|
|
end
|
|
|
|
test "defaults quantity to 1 for invalid values", %{conn: conn, variant: variant} do
|
|
conn = post(conn, ~p"/cart/add", %{"variant_id" => variant.id, "quantity" => "abc"})
|
|
|
|
cart = get_session(conn, "cart")
|
|
assert [{_, 1}] = cart
|
|
end
|
|
|
|
test "handles missing params gracefully", %{conn: conn} do
|
|
conn = post(conn, ~p"/cart/add", %{})
|
|
|
|
assert redirected_to(conn) == "/cart"
|
|
assert Phoenix.Flash.get(conn.assigns.flash, :error) == "Could not add item to basket"
|
|
end
|
|
end
|
|
|
|
describe "POST /cart/remove" do
|
|
setup [:create_variant]
|
|
|
|
test "removes item from session cart", %{conn: conn, variant: variant} do
|
|
conn =
|
|
conn
|
|
|> conn_with_cart(variant.id, 2)
|
|
|> post(~p"/cart/remove", %{"variant_id" => variant.id})
|
|
|
|
assert redirected_to(conn) == "/cart"
|
|
assert Phoenix.Flash.get(conn.assigns.flash, :info) == "Removed from basket"
|
|
|
|
cart = get_session(conn, "cart")
|
|
assert cart == []
|
|
end
|
|
|
|
test "handles removing non-existent item", %{conn: conn} do
|
|
conn = post(conn, ~p"/cart/remove", %{"variant_id" => Ecto.UUID.generate()})
|
|
|
|
assert redirected_to(conn) == "/cart"
|
|
end
|
|
end
|
|
|
|
describe "POST /cart/update" do
|
|
setup [:create_variant]
|
|
|
|
test "updates quantity in session cart", %{conn: conn, variant: variant} do
|
|
conn =
|
|
conn
|
|
|> conn_with_cart(variant.id, 1)
|
|
|> post(~p"/cart/update", %{"variant_id" => variant.id, "quantity" => "5"})
|
|
|
|
assert redirected_to(conn) == "/cart"
|
|
|
|
cart = get_session(conn, "cart")
|
|
assert [{_, 5}] = cart
|
|
end
|
|
|
|
test "removes item when quantity is 0 or less", %{conn: conn, variant: variant} do
|
|
conn =
|
|
conn
|
|
|> conn_with_cart(variant.id, 3)
|
|
|> post(~p"/cart/update", %{"variant_id" => variant.id, "quantity" => "0"})
|
|
|
|
cart = get_session(conn, "cart")
|
|
assert cart == []
|
|
end
|
|
end
|
|
end
|