WIP feat: member user relation

This commit is contained in:
Moritz 2025-07-24 20:15:01 +02:00
parent 997691746a
commit 4e6f5a517a
Signed by: moritz
GPG key ID: 1020A035E5DD0824
35 changed files with 1208 additions and 192 deletions

View file

@ -119,8 +119,10 @@ defmodule MvWeb.OidcIntegrationTest do
assert {:error, %Ash.Error.Invalid{errors: errors}} = result
# Check for either Required error or InvalidAttribute error with email field
assert Enum.any?(errors, fn err ->
match?(%Ash.Error.Changes.Required{field: :email}, err)
match?(%Ash.Error.Changes.Required{field: :email}, err) or
match?(%Ash.Error.Changes.InvalidAttribute{field: :email}, err)
end)
end

View file

@ -0,0 +1,81 @@
defmodule MvWeb.UserLive.AdminMemberAssignmentTest do
use MvWeb.ConnCase, async: true
import Phoenix.LiveViewTest
test "admin can assign existing member without user to new user", %{conn: conn} do
{:ok, member} =
Mv.Membership.create_member(%{
first_name: "Admin",
last_name: "Choice",
email: "adminchoice@example.com"
})
conn = conn_with_oidc_user(conn, %{email: "admin@example.com"})
{:ok, view, _html} = live(conn, "/users/new")
# First click the "assign existing member" radio button
view
|> element("input[value='assign_existing']")
|> render_click()
# Then submit the form with member_id
view
|> form("#user-form", user: %{email: "adminuser@example.com", member_id: member.id})
|> render_submit()
user =
Ash.get!(Mv.Accounts.User, [email: Ash.CiString.new("adminuser@example.com")],
domain: Mv.Accounts
)
assert user.member_id == member.id
end
test "admin can create new member for user if none selected", %{conn: conn} do
conn = conn_with_oidc_user(conn, %{email: "admin2@example.com"})
{:ok, view, _html} = live(conn, "/users/new")
# Default mode is "create_new", so just submit
view
|> form("#user-form", user: %{email: "adminnewmember@example.com"})
|> render_submit()
user =
Ash.get!(Mv.Accounts.User, [email: Ash.CiString.new("adminnewmember@example.com")],
domain: Mv.Accounts
)
assert user.member_id
{:ok, member} = Mv.Membership.get_member!(user.member_id)
assert member.email == "adminnewmember@example.com"
end
test "admin cannot assign member that already has a user", %{conn: conn} do
{:ok, member} =
Mv.Membership.create_member(%{
first_name: "Taken",
last_name: "Member",
email: "taken@example.com"
})
{:ok, _user} =
Mv.Accounts.create_user(%{email: "takenuser@example.com", member_id: member.id})
conn = conn_with_oidc_user(conn, %{email: "admin3@example.com"})
{:ok, view, _html} = live(conn, "/users/new")
# First click the "assign existing member" radio button
view
|> element("input[value='assign_existing']")
|> render_click()
# Check that the already assigned member is NOT in the dropdown options
html = render(view)
# Member should not be available for selection
refute html =~ "Taken Member"
# The dropdown should have limited or no options since member is already taken
# Placeholder should be visible
assert html =~ "Choose a member..."
end
end

View file

@ -244,7 +244,9 @@ defmodule MvWeb.UserLive.FormTest do
flunk("Expected validation error but form was submitted successfully")
html when is_binary(html) ->
assert html =~ "must have length of at least 8"
# Allow for different validation message sources
assert html =~ "length must be greater than or equal to 8" or
html =~ "must have length of at least 8"
end
end
end

View file

@ -0,0 +1,36 @@
defmodule MvWeb.UserLive.MemberDisplayTest do
use MvWeb.ConnCase, async: true
import Phoenix.LiveViewTest
test "User-Liste zeigt zugeordneten Member an", %{conn: conn} do
{:ok, member} =
Mv.Membership.create_member(%{
first_name: "Max",
last_name: "Mustermann",
email: "max@example.com"
})
{:ok, _user} = Mv.Accounts.create_user(%{email: "user5@example.com", member_id: member.id})
conn = conn_with_oidc_user(conn)
{:ok, _view, html} = live(conn, "/users")
assert html =~ "Max Mustermann"
# User email, not member email
assert html =~ "user5@example.com"
end
test "User-Detailansicht zeigt Member-Daten an", %{conn: conn} do
{:ok, member} =
Mv.Membership.create_member(%{
first_name: "Anna",
last_name: "Test",
email: "anna@example.com"
})
{:ok, user} = Mv.Accounts.create_user(%{email: "user6@example.com", member_id: member.id})
conn = conn_with_oidc_user(conn)
{:ok, _view, html} = live(conn, "/users/#{user.id}")
assert html =~ "Anna Test"
# In detail view, member email should be shown
assert html =~ "anna@example.com"
end
end