storage: add behavior boundary and postgres adapter skeleton

This commit is contained in:
2026-03-13 20:20:58 +01:00
parent 307372fdfe
commit 7ec588805b
13 changed files with 365 additions and 1 deletions

View File

@@ -0,0 +1,53 @@
defmodule Parrhesia.Storage.BehaviourContractsTest do
use ExUnit.Case, async: true
test "events behavior exposes expected callbacks" do
assert callback_names(Parrhesia.Storage.Events) ==
[:count, :delete_by_request, :get_event, :purge_expired, :put_event, :query, :vanish]
end
test "moderation behavior exposes expected callbacks" do
assert callback_names(Parrhesia.Storage.Moderation) ==
[
:allow_pubkey,
:ban_event,
:ban_pubkey,
:block_ip,
:disallow_pubkey,
:event_banned?,
:ip_blocked?,
:pubkey_allowed?,
:pubkey_banned?,
:unban_event,
:unban_pubkey,
:unblock_ip
]
end
test "groups behavior exposes expected callbacks" do
assert callback_names(Parrhesia.Storage.Groups) ==
[
:delete_membership,
:delete_role,
:get_membership,
:list_memberships,
:list_roles,
:put_membership,
:put_role
]
end
test "admin behavior exposes expected callbacks" do
assert callback_names(Parrhesia.Storage.Admin) ==
[:append_audit_log, :execute, :list_audit_logs]
end
defp callback_names(behavior_module) do
behavior_module
|> behaviour_callbacks()
|> Enum.map(fn {name, _arity} -> name end)
|> Enum.sort()
end
defp behaviour_callbacks(behavior_module), do: behavior_module.behaviour_info(:callbacks)
end

View File

@@ -0,0 +1,28 @@
defmodule Parrhesia.StorageTest do
use ExUnit.Case, async: false
alias Parrhesia.Storage
test "resolves default storage modules" do
assert Storage.events() == Parrhesia.Storage.Adapters.Postgres.Events
assert Storage.moderation() == Parrhesia.Storage.Adapters.Postgres.Moderation
assert Storage.groups() == Parrhesia.Storage.Adapters.Postgres.Groups
assert Storage.admin() == Parrhesia.Storage.Adapters.Postgres.Admin
end
test "raises when configured module does not implement required behavior" do
previous = Application.get_env(:parrhesia, :storage, [])
Application.put_env(:parrhesia, :storage, events: Parrhesia.Config)
on_exit(fn ->
Application.put_env(:parrhesia, :storage, previous)
end)
assert_raise ArgumentError,
~r/does not implement Parrhesia\.Storage\.Events/,
fn ->
Storage.events()
end
end
end