defmodule MicrowavepropWeb.BeaconLiveTest do use MicrowavepropWeb.ConnCase import Microwaveprop.AccountsFixtures import Microwaveprop.BeaconsFixtures import Phoenix.LiveViewTest alias Microwaveprop.Accounts defp promote_to_admin(user) do {:ok, user} = Accounts.admin_update_user(user, %{is_admin: true}) user end defp admin_user_fixture do promote_to_admin(user_fixture()) end describe "Index (public)" do test "lists beacons without logging in", %{conn: conn} do beacon = beacon_fixture(user_fixture()) {:ok, _view, html} = live(conn, ~p"/beacons") assert html =~ "Beacons" assert html =~ beacon.callsign end test "non-admin does not see the New Beacon button", %{conn: conn} do user = user_fixture() conn = log_in_user(conn, user) {:ok, _view, html} = live(conn, ~p"/beacons") refute html =~ "New Beacon" end test "admin sees the New Beacon button", %{conn: conn} do conn = log_in_user(conn, admin_user_fixture()) {:ok, _view, html} = live(conn, ~p"/beacons") assert html =~ "New Beacon" end end describe "Show (public)" do test "renders beacon details without logging in", %{conn: conn} do beacon = beacon_fixture(user_fixture()) {:ok, _view, html} = live(conn, ~p"/beacons/#{beacon}") assert html =~ beacon.callsign assert html =~ "#{beacon.frequency_mhz}" end end describe "Form (admin only)" do test "redirects non-admin away from /beacons/new", %{conn: conn} do user = user_fixture() conn = log_in_user(conn, user) assert {:error, {:redirect, %{to: "/"}}} = live(conn, ~p"/beacons/new") end test "redirects anonymous user away from /beacons/new", %{conn: conn} do assert {:error, {:redirect, %{to: "/users/log-in"}}} = live(conn, ~p"/beacons/new") end test "admin creates a beacon", %{conn: conn} do conn = log_in_user(conn, admin_user_fixture()) {:ok, form_live, _html} = live(conn, ~p"/beacons/new") attrs = valid_beacon_attrs() assert {:ok, _view, html} = form_live |> form("#beacon-form", beacon: attrs) |> render_submit() |> follow_redirect(conn, ~p"/beacons") assert html =~ "Beacon created" assert html =~ attrs.callsign end test "admin edits a beacon", %{conn: conn} do admin = admin_user_fixture() beacon = beacon_fixture(admin) conn = log_in_user(conn, admin) {:ok, form_live, _} = live(conn, ~p"/beacons/#{beacon}/edit") assert {:ok, _view, html} = form_live |> form("#beacon-form", beacon: %{power_watts: 25.0}) |> render_submit() |> follow_redirect(conn, ~p"/beacons") assert html =~ "Beacon updated" end end end