feat: relate user and member
This commit is contained in:
parent
b7f0060358
commit
d4c7af558d
8 changed files with 167 additions and 12 deletions
77
test/accounts/user_member_integration_test.exs
Normal file
77
test/accounts/user_member_integration_test.exs
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue