test: adapt tests for attribute-level default solution
This commit is contained in:
parent
f984819508
commit
93e966bc6b
4 changed files with 37 additions and 20 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue