71 lines
2.3 KiB
Elixir
71 lines
2.3 KiB
Elixir
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(%{
|
|
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(%{
|
|
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(%{
|
|
member_email: "lisa@example.com"
|
|
})
|
|
|
|
assert member.id
|
|
end
|
|
end
|
|
end
|