defmodule AmmopricesWeb.HomeLiveTest do use AmmopricesWeb.ConnCase, async: true import Ammoprices.Fixtures import Phoenix.LiveViewTest describe "HomeLive" do test "renders category sections", %{conn: conn} do {:ok, view, _html} = live(conn, "/") assert has_element?(view, "#category-handgun") assert has_element?(view, "#category-rifle") assert has_element?(view, "#category-rimfire") assert has_element?(view, "#category-shotgun") end test "renders caliber links", %{conn: conn} do caliber_fixture(%{name: "9mm Luger", slug: "9mm-luger", category: "handgun"}) {:ok, view, _html} = live(conn, "/") assert has_element?(view, "#caliber-9mm-luger") end test "shows cheapest price when snapshots exist", %{conn: conn} do caliber = caliber_fixture(%{name: "9mm Luger", slug: "9mm-luger", category: "handgun"}) retailer = retailer_fixture() product = product_fixture(%{caliber: caliber, retailer: retailer, in_stock: true}) now = DateTime.truncate(DateTime.utc_now(), :second) snapshot_fixture(%{product: product, price_per_round_cents: 25, in_stock: true, recorded_at: now}) {:ok, _view, html} = live(conn, "/") assert html =~ "25" end test "updates cheapest prices via PubSub broadcast", %{conn: conn} do caliber = caliber_fixture(%{name: "9mm Luger", slug: "9mm-luger", category: "handgun"}) retailer = retailer_fixture() product = product_fixture(%{caliber: caliber, retailer: retailer, in_stock: true}) now = DateTime.truncate(DateTime.utc_now(), :second) {:ok, view, _html} = live(conn, "/") snapshot_fixture(%{product: product, price_per_round_cents: 17, in_stock: true, recorded_at: now}) Phoenix.PubSub.broadcast(Ammoprices.PubSub, "prices:updated", {:prices_updated, [caliber.id]}) assert render(view) =~ "0.17" end end end