feat: relate user and member

This commit is contained in:
Moritz 2025-08-05 17:17:28 +02:00
parent b7f0060358
commit d4c7af558d
Signed by: moritz
GPG key ID: 1020A035E5DD0824
8 changed files with 167 additions and 12 deletions

View file

@ -0,0 +1,77 @@
defmodule Mv.Accounts.UserMemberIntegrationTest do
use Mv.DataCase, async: true
alias Mv.Accounts
alias Mv.Membership
alias Mv.Accounts.User.MemberCreationNotifier
describe "User-Member-Relation" do
test "ein User kann einem Member zugeordnet werden" do
{:ok, member} =
Membership.create_member(%{
first_name: "Max",
last_name: "Mustermann",
member_email: "max@example.com"
})
{:ok, user} = Accounts.create_user(%{email: "user1@example.com", member_id: member.id})
assert user.member_id == member.id
end
test "ein Member kann nur einem User zugeordnet werden (unique constraint)" do
{:ok, member} =
Membership.create_member(%{
first_name: "Anna",
last_name: "Test",
member_email: "anna@example.com"
})
{:ok, user1} = Accounts.create_user(%{email: "user2@example.com", member_id: member.id})
assert user1.member_id == member.id
{:error, %Ash.Error.Invalid{errors: errors}} =
Accounts.create_user(%{email: "user3@example.com", member_id: member.id})
assert Enum.any?(errors, fn error ->
error.message =~ "already been taken" or error.field == :member_id
end)
end
test "ein User ohne Member ist nicht erlaubt (bei Registrierung/Erstellung)" do
# Create user without member first
result = Accounts.create_user(%{email: "user4@example.com"})
case result do
{:ok, user} ->
# User is created but doesn't have member yet
assert user.member_id == nil
# Manually trigger the notifier to simulate automatic member creation
notification = %Ash.Notifier.Notification{
action: %{name: :create_user},
resource: Mv.Accounts.User,
data: user
}
{:ok, _updated_user} = MemberCreationNotifier.notify(notification)
# Reload user and verify member was created and assigned
user = Ash.reload!(user, domain: Mv.Accounts)
assert user.member_id, "User should have a member_id assigned after notifier"
{:error, _} ->
flunk("User creation should succeed")
end
end
test "ein Member kann ohne User existieren" do
{:ok, member} =
Membership.create_member(%{
first_name: "Lisa",
last_name: "Solo",
member_email: "lisa@example.com"
})
assert member.id
end
end
end

View file

@ -8,7 +8,7 @@ defmodule Mv.Membership.MemberTest do
last_name: "Doe",
birth_date: ~D[1990-01-01],
paid: true,
email: "john@example.com",
member_email: "john@example.com",
phone_number: "+49123456789",
join_date: ~D[2020-01-01],
exit_date: nil,
@ -31,16 +31,15 @@ defmodule Mv.Membership.MemberTest do
assert error_message(errors, :last_name) =~ "must be present"
end
test "Email is required" do
attrs = Map.put(@valid_attrs, :email, "")
assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs)
assert error_message(errors, :email) =~ "must be present"
test "Email is optional" do
attrs = Map.delete(@valid_attrs, :member_email)
assert {:ok, _member} = Membership.create_member(attrs)
end
test "Email must be valid" do
attrs = Map.put(@valid_attrs, :email, "test@")
test "Email must be valid if provided" do
attrs = Map.put(@valid_attrs, :member_email, "test@")
assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs)
assert error_message(errors, :email) =~ "is not a valid email"
assert error_message(errors, :member_email) =~ "is not a valid email"
end
test "Birth date is optional but must not be in the future" do