defmodule DexiWeb.Admin.UsersLiveTest do use DexiWeb.ConnCase import Dexi.AccountsFixtures import Phoenix.LiveViewTest alias Dexi.Accounts test "an admin can edit an account from its card", %{conn: conn} do admin_pubkey = unique_public_key() user_pubkey = unique_public_key() assert {:ok, admin} = Accounts.create_or_promote_admin(admin_pubkey) assert {:ok, _user} = Accounts.get_or_create_user(user_pubkey) conn = init_test_session(conn, %{user_pubkey: admin.pubkey}) {:ok, view, _html} = live(conn, ~p"/admin/users") view |> element("#edit-user-#{user_pubkey}") |> render_click() assert has_element?(view, "#edit-user-modal") view |> form("#edit-user-form", user: %{name: "Edited User", email: "edited@example.com"}) |> render_submit() refute has_element?(view, "#edit-user-modal") assert %{name: "Edited User", email: "edited@example.com"} = Accounts.get_user_by_pubkey(user_pubkey) end test "a shared URL restores search, role, and page", %{conn: conn} do admin = admin_fixture() Enum.each(1..21, fn index -> user_fixture(%{name: "Shareable User #{index}"}) end) conn = init_test_session(conn, %{user_pubkey: admin.pubkey}) path = ~p"/admin/users?#{%{page: 2, search: "Shareable", role: "user"}}" {:ok, view, _html} = live(conn, path) assert has_element?(view, "#users-page-2[aria-current=page]") assert has_element?(view, "#search_query[value='Shareable']") assert has_element?(view, "#search_role option[value='user'][selected]") assert has_element?(view, "#previous-users-page") refute has_element?(view, "#next-users-page") end test "changing search criteria updates the shareable URL", %{conn: conn} do admin = admin_fixture() conn = init_test_session(conn, %{user_pubkey: admin.pubkey}) {:ok, view, _html} = live(conn, ~p"/admin/users") view |> form("#user-search-form", search: %{query: "alice", role: "admin"}) |> render_change() assert_patch( view, ~p"/admin/users?#{%{page: 1, search: "alice", role: "admin"}}" ) end end