prop/test/microwaveprop_web/live/user_management_live_test.exs
Graham McIntire ca842e3add
feat(admin): beacon monitor reassign, token regen, assigned_by display, user monitor management
Uncommitted work from previous session:
- Add list_users_select/0 helper for admin select dropdowns
- Add regenerate_token/1 context function
- Preload assigned_by association on monitor queries
- Add admin nav link to beacon monitors
- Fix JS event targets (remove redundant target: @myself)
- Add reassign user form to admin monitor show page
- Add regenerate token button to admin monitor show page
- Show assigned_by admin on monitor detail page
- Add beacon monitors section to user management edit page
- Add unassign monitor capability from user management
- Add full test coverage for all new functionality
- Fix pre-existing /account route warning (redirect → /users/settings)
2026-07-22 16:27:21 -05:00

100 lines
3.1 KiB
Elixir

defmodule MicrowavepropWeb.UserManagementLiveTest do
use MicrowavepropWeb.ConnCase
import Microwaveprop.AccountsFixtures
import Phoenix.LiveViewTest
alias Microwaveprop.Accounts
alias Microwaveprop.BeaconMonitors
defp admin_user_fixture do
user = user_fixture()
{:ok, user} = Accounts.admin_update_user(user, %{is_admin: true})
user
end
describe "Index" do
test "redirects non-admin to /", %{conn: conn} do
conn = log_in_user(conn, user_fixture())
assert {:error, {:redirect, %{to: "/"}}} = live(conn, ~p"/users")
end
test "redirects anonymous user to log in", %{conn: conn} do
assert {:error, {:redirect, %{to: "/users/log-in"}}} = live(conn, ~p"/users")
end
test "admin sees the user list", %{conn: conn} do
admin = admin_user_fixture()
other = user_fixture(callsign: "W5TX")
conn = log_in_user(conn, admin)
{:ok, _view, html} = live(conn, ~p"/users")
assert html =~ admin.callsign
assert html =~ other.callsign
end
test "admin can delete another user", %{conn: conn} do
admin = admin_user_fixture()
target = user_fixture(callsign: "W5TX")
conn = log_in_user(conn, admin)
{:ok, view, _} = live(conn, ~p"/users")
render_click(view, "delete", %{"id" => target.id})
refute Accounts.get_user_by_email(target.email)
end
end
describe "Edit" do
test "admin can promote a user to admin", %{conn: conn} do
admin = admin_user_fixture()
target = user_fixture(callsign: "W5TX")
conn = log_in_user(conn, admin)
{:ok, form_live, _} = live(conn, ~p"/users/#{target.id}/edit")
assert {:ok, _view, _html} =
form_live
|> form("#user-form",
user: %{
callsign: target.callsign,
name: target.name,
email: target.email,
is_admin: true
}
)
|> render_submit()
|> follow_redirect(conn, ~p"/users")
assert Accounts.get_user!(target.id).is_admin
end
end
describe "Edit monitors" do
test "shows monitors assigned to user", %{conn: conn} do
admin = admin_user_fixture()
target = user_fixture(callsign: "W5MON")
{:ok, _monitor} = BeaconMonitors.create_monitor(target, %{"name" => "Shack Pi"})
conn = log_in_user(conn, admin)
{:ok, _lv, html} = live(conn, ~p"/users/#{target.id}/edit")
assert html =~ "Shack Pi"
assert html =~ "Beacon monitors"
end
test "admin can remove a monitor from a user", %{conn: conn} do
admin = admin_user_fixture()
target = user_fixture(callsign: "W5MON")
{:ok, monitor} = BeaconMonitors.create_monitor(target, %{"name" => "Remove Me"})
conn = log_in_user(conn, admin)
{:ok, lv, html_before} = live(conn, ~p"/users/#{target.id}/edit")
assert html_before =~ "Remove Me"
render_click(lv, "unassign-monitor", %{"id" => monitor.id})
monitors = BeaconMonitors.list_monitors_for_user(target)
assert monitors == []
end
end
end