test: adapt tests for attribute-level default solution

This commit is contained in:
Moritz 2026-01-25 13:39:18 +01:00
parent e7bf777be2
commit 8f3fd9d0d7
Signed by: moritz
GPG key ID: 1020A035E5DD0824
4 changed files with 37 additions and 20 deletions

View file

@ -354,9 +354,14 @@ defmodule Mv.Accounts.UserPoliciesTest do
}) })
|> Ash.Changeset.set_context(%{private: %{ash_authentication?: true}}) |> Ash.Changeset.set_context(%{private: %{ash_authentication?: true}})
{:ok, user} = Ash.create(changeset) {:ok, user} = Ash.create(changeset, domain: Mv.Accounts)
assert user.email assert user.email
# Verify that default "Mitglied" role was assigned
{:ok, user_with_role} = Ash.load(user, :role, domain: Mv.Accounts, authorize?: false)
assert user_with_role.role != nil
assert user_with_role.role.name == "Mitglied"
end end
test "register_with_rauthy works without actor via AshAuthentication bypass" do test "register_with_rauthy works without actor via AshAuthentication bypass" do

View file

@ -4,6 +4,8 @@ defmodule Mv.Helpers.SystemActorTest do
""" """
use Mv.DataCase, async: false use Mv.DataCase, async: false
import Ecto.Query
alias Mv.Helpers.SystemActor alias Mv.Helpers.SystemActor
alias Mv.Authorization alias Mv.Authorization
alias Mv.Accounts alias Mv.Accounts
@ -266,13 +268,15 @@ defmodule Mv.Helpers.SystemActorTest do
describe "edge cases" do describe "edge cases" do
test "raises error if admin user has no role", %{admin_user: admin_user} do test "raises error if admin user has no role", %{admin_user: admin_user} do
system_actor = SystemActor.get_system_actor() # Remove role from admin user by directly setting role_id to NULL in database
# (We can't use Ash because allow_nil? false prevents setting role_id to nil)
# Convert UUID to binary format for Postgrex
admin_user_id = Ecto.UUID.cast!(admin_user.id)
# Remove role from admin user Mv.Repo.update_all(
admin_user from(u in "users", where: u.id == type(^admin_user_id, :binary_id)),
|> Ash.Changeset.for_update(:update, %{}) set: [role_id: nil]
|> Ash.Changeset.manage_relationship(:role, nil, type: :append_and_remove) )
|> Ash.update!(actor: system_actor)
# Delete system user to force fallback # Delete system user to force fallback
system_actor = SystemActor.get_system_actor() system_actor = SystemActor.get_system_actor()
@ -369,13 +373,15 @@ defmodule Mv.Helpers.SystemActorTest do
end end
test "raises error if system user has no role", %{system_user: system_user} do test "raises error if system user has no role", %{system_user: system_user} do
system_actor = SystemActor.get_system_actor() # Remove role from system user by directly setting role_id to NULL in database
# (We can't use Ash because allow_nil? false prevents setting role_id to nil)
# Convert UUID to binary format for Postgrex
system_user_id = Ecto.UUID.cast!(system_user.id)
# Remove role from system user Mv.Repo.update_all(
system_user from(u in "users", where: u.id == type(^system_user_id, :binary_id)),
|> Ash.Changeset.for_update(:update, %{}) set: [role_id: nil]
|> Ash.Changeset.manage_relationship(:role, nil, type: :append_and_remove) )
|> Ash.update!(actor: system_actor)
SystemActor.invalidate_cache() SystemActor.invalidate_cache()

View file

@ -126,7 +126,7 @@ defmodule Mv.SeedsTest do
test "creates all 5 authorization roles with correct permission sets" do test "creates all 5 authorization roles with correct permission sets" do
# Run seeds once for this test # Run seeds once for this test
Code.eval_file("priv/repo/seeds.exs") Code.eval_file("priv/repo/seeds.exs")
{:ok, roles} = Ash.read(Mv.Authorization.Role) {:ok, roles} = Ash.read(Mv.Authorization.Role, domain: Mv.Authorization, authorize?: false)
assert length(roles) >= 5, "Should have at least 5 roles" assert length(roles) >= 5, "Should have at least 5 roles"
@ -153,7 +153,7 @@ defmodule Mv.SeedsTest do
{:ok, mitglied} = {:ok, mitglied} =
Mv.Authorization.Role Mv.Authorization.Role
|> Ash.Query.filter(name == "Mitglied") |> Ash.Query.filter(name == "Mitglied")
|> Ash.read_one() |> Ash.read_one(domain: Mv.Authorization, authorize?: false)
assert mitglied.is_system_role == true assert mitglied.is_system_role == true
end end
@ -161,7 +161,7 @@ defmodule Mv.SeedsTest do
test "all roles have valid permission_set_names" do test "all roles have valid permission_set_names" do
Code.eval_file("priv/repo/seeds.exs") Code.eval_file("priv/repo/seeds.exs")
{:ok, roles} = Ash.read(Mv.Authorization.Role) {:ok, roles} = Ash.read(Mv.Authorization.Role, domain: Mv.Authorization, authorize?: false)
valid_sets = valid_sets =
Mv.Authorization.PermissionSets.all_permission_sets() Mv.Authorization.PermissionSets.all_permission_sets()
@ -238,10 +238,14 @@ defmodule Mv.SeedsTest do
test "role creation is idempotent" do test "role creation is idempotent" do
Code.eval_file("priv/repo/seeds.exs") Code.eval_file("priv/repo/seeds.exs")
{:ok, roles_1} = Ash.read(Mv.Authorization.Role)
{:ok, roles_1} =
Ash.read(Mv.Authorization.Role, domain: Mv.Authorization, authorize?: false)
Code.eval_file("priv/repo/seeds.exs") Code.eval_file("priv/repo/seeds.exs")
{:ok, roles_2} = Ash.read(Mv.Authorization.Role)
{:ok, roles_2} =
Ash.read(Mv.Authorization.Role, domain: Mv.Authorization, authorize?: false)
assert length(roles_1) == length(roles_2), assert length(roles_1) == length(roles_2),
"Role count should remain same after re-running seeds" "Role count should remain same after re-running seeds"

View file

@ -31,7 +31,9 @@ defmodule Mv.DataCase do
setup tags do setup tags do
Mv.DataCase.setup_sandbox(tags) Mv.DataCase.setup_sandbox(tags)
# Ensure "Mitglied" role exists for AssignDefaultRole to work in tests # Ensure "Mitglied" role exists for default role assignment to work in tests
# Note: This runs in every test because each test runs in a sandboxed database.
# The check is fast (single query) and idempotent (skips if role exists).
Mv.DataCase.ensure_default_role() Mv.DataCase.ensure_default_role()
:ok :ok
end end
@ -49,7 +51,7 @@ defmodule Mv.DataCase do
@doc """ @doc """
Ensures the default "Mitglied" role exists in the test database. Ensures the default "Mitglied" role exists in the test database.
This is necessary because AssignDefaultRole expects this role to exist. This is necessary because the role_id attribute's default function expects this role to exist.
Tests run in sandbox mode, so the role needs to be created for each test. Tests run in sandbox mode, so the role needs to be created for each test.
""" """
def ensure_default_role do def ensure_default_role do