From 045ae1c3c79f9d509f9217a54261bc2ba643191f Mon Sep 17 00:00:00 2001 From: Moritz Date: Thu, 16 Oct 2025 15:24:49 +0200 Subject: [PATCH] add tests for member deletion --- test/accounts/user_member_deletion_test.exs | 88 +++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 test/accounts/user_member_deletion_test.exs diff --git a/test/accounts/user_member_deletion_test.exs b/test/accounts/user_member_deletion_test.exs new file mode 100644 index 0000000..52a3865 --- /dev/null +++ b/test/accounts/user_member_deletion_test.exs @@ -0,0 +1,88 @@ +defmodule Mv.Accounts.UserMemberDeletionTest do + @moduledoc """ + Tests for ON DELETE SET NULL constraint on users.member_id. + When a member is deleted, the linked user should remain but with member_id set to NULL. + """ + use Mv.DataCase, async: true + alias Mv.Accounts + alias Mv.Membership + + describe "User remains when linked Member is deleted (ON DELETE SET NULL)" do + @valid_user_attrs %{ + email: "test@example.com" + } + + @valid_member_attrs %{ + first_name: "John", + last_name: "Doe", + email: "john@example.com" + } + + test "deleting a member sets the user's member_id to NULL" do + # Create a member + {:ok, member} = Membership.create_member(@valid_member_attrs) + + # Create a user linked to the member + {:ok, user} = + Accounts.create_user(Map.put(@valid_user_attrs, :member, %{id: member.id})) + + # Verify the relationship is established + {:ok, user_before_delete} = Ash.get(Mv.Accounts.User, user.id, load: [:member]) + assert user_before_delete.member_id == member.id + assert user_before_delete.member.id == member.id + + # Delete the member + :ok = Membership.destroy_member(member) + + # Verify the user still exists but member_id is NULL + {:ok, user_after_delete} = Ash.get(Mv.Accounts.User, user.id, load: [:member]) + assert user_after_delete.id == user.id + assert user_after_delete.member_id == nil + assert user_after_delete.member == nil + end + + test "user can be linked to a new member after old member is deleted" do + # Create first member + {:ok, member1} = Membership.create_member(@valid_member_attrs) + + # Create user linked to first member + {:ok, user} = + Accounts.create_user(Map.put(@valid_user_attrs, :member, %{id: member1.id})) + + assert user.member_id == member1.id + + # Delete first member + :ok = Membership.destroy_member(member1) + + # Reload user from database to get updated member_id (should be NULL) + {:ok, user_after_delete} = Ash.get(Mv.Accounts.User, user.id) + assert user_after_delete.member_id == nil + + # Create second member + {:ok, member2} = + Membership.create_member(%{ + first_name: "Jane", + last_name: "Smith", + email: "jane@example.com" + }) + + # Link user to second member (use reloaded user) + {:ok, updated_user} = Accounts.update_user(user_after_delete, %{member: %{id: member2.id}}) + + # Verify new relationship + {:ok, final_user} = Ash.get(Mv.Accounts.User, updated_user.id, load: [:member]) + assert final_user.member_id == member2.id + assert final_user.member.id == member2.id + end + + test "member without linked user can be deleted normally" do + {:ok, member} = Membership.create_member(@valid_member_attrs) + + # Delete member (no users linked) + assert :ok = Membership.destroy_member(member) + + # Verify member is deleted + assert {:error, _} = Ash.get(Mv.Membership.Member, member.id) + end + end +end