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", 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", 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 } assert :ok = 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", email: "lisa@example.com" }) assert member.id end end end