defmodule Mv.Accounts.RegistrationMemberTest do use Mv.DataCase alias Mv.Accounts alias Mv.Accounts.User.MemberCreationNotifier describe "registration creates member" do test "registering a user creates and assigns a new member via notifier" do # Create user first assert {:ok, user} = Accounts.register_with_password(%{ email: "test@example.com", password: "password123" }) assert to_string(user.email) == "test@example.com" # Manually trigger the notifier to test synchronously notification = %Ash.Notifier.Notification{ action: %{name: :register_with_password}, resource: Mv.Accounts.User, data: user } assert :ok = MemberCreationNotifier.notify(notification) # Reload user to get updated member_id user = Ash.reload!(user, domain: Mv.Accounts) # User should have a member assigned assert user.member_id != nil # Member should exist and have correct data member = Ash.get!(Mv.Membership.Member, user.member_id, domain: Mv.Membership) assert member.email == "test@example.com" assert member.first_name == "User" assert member.last_name == "Generated" end test "notifier doesn't create member if user already has one" do # Create a member first {:ok, existing_member} = Mv.Membership.create_member(%{ email: "existing@example.com", first_name: "Existing", last_name: "Member" }) # Create user with existing member assert {:ok, user} = Accounts.create_user(%{ email: "existing@example.com", member_id: existing_member.id }) # Trigger notifier notification = %Ash.Notifier.Notification{ action: %{name: :create_user}, resource: Mv.Accounts.User, data: user } assert :ok = MemberCreationNotifier.notify(notification) # User should still have the same member user = Ash.reload!(user, domain: Mv.Accounts) assert user.member_id == existing_member.id # Should not have created a new member member = Ash.get!(Mv.Membership.Member, user.member_id, domain: Mv.Membership) assert member.first_name == "Existing" assert member.last_name == "Member" end test "member data has correct default values" do # Create user assert {:ok, user} = Accounts.create_user(%{ email: "member@example.com" }) # Trigger notifier manually notification = %Ash.Notifier.Notification{ action: %{name: :create_user}, resource: Mv.Accounts.User, data: user } assert :ok = MemberCreationNotifier.notify(notification) # Reload and check member user = Ash.reload!(user, domain: Mv.Accounts) member = Ash.get!(Mv.Membership.Member, user.member_id, domain: Mv.Membership) # Email should match user assert member.email == "member@example.com" # Other fields should have default values assert member.first_name == "User" assert member.last_name == "Generated" # Allow both false and nil assert member.paid == false || member.paid == nil assert member.phone_number == nil assert member.birth_date == nil end end end