defmodule MicrowavepropWeb.Admin.MonitorLiveTest do use MicrowavepropWeb.ConnCase, async: false import Microwaveprop.AccountsFixtures import Phoenix.LiveViewTest alias Microwaveprop.Accounts alias Microwaveprop.BeaconMonitors defp admin_and_monitor do admin = user_fixture() {:ok, admin} = Accounts.admin_update_user(admin, %{is_admin: true}) target = user_fixture(callsign: "W5MON") {:ok, monitor} = BeaconMonitors.create_monitor(target, %{"name" => "Test Monitor"}) {admin, target, monitor} end describe "index" do test "lists all monitors", %{conn: conn} do {admin, _target, monitor} = admin_and_monitor() conn = log_in_user(conn, admin) {:ok, _lv, html} = live(conn, ~p"/admin/beacon-monitors") assert html =~ monitor.name end test "redirects non-admin to /", %{conn: conn} do conn = log_in_user(conn, user_fixture()) assert {:error, {:redirect, %{to: "/"}}} = live(conn, ~p"/admin/beacon-monitors") end end describe "show" do test "shows monitor details", %{conn: conn} do {admin, target, monitor} = admin_and_monitor() conn = log_in_user(conn, admin) {:ok, _lv, html} = live(conn, ~p"/admin/beacon-monitors/#{monitor.id}") assert html =~ monitor.name assert html =~ monitor.token assert html =~ target.callsign end test "reassigns monitor to a different user", %{conn: conn} do {admin, _target, monitor} = admin_and_monitor() new_user = user_fixture(callsign: "W5NEW") conn = log_in_user(conn, admin) {:ok, lv, _html} = live(conn, ~p"/admin/beacon-monitors/#{monitor.id}") html = lv |> form("#reassign-form", beacon_monitor: %{user_id: new_user.id}) |> render_submit() assert html =~ "Monitor reassigned to #{new_user.callsign}" end test "regenerates the auth token", %{conn: conn} do {admin, _target, monitor} = admin_and_monitor() conn = log_in_user(conn, admin) {:ok, lv, _html} = live(conn, ~p"/admin/beacon-monitors/#{monitor.id}") html = lv |> element("#regenerate-token-btn") |> render_click() assert html =~ "Auth token regenerated" end end end