3.2 KiB · text 5af55d9
defmodule GitGud.FederationTest do
use GitGud.DataCase, async: false
alias GitGud.Federation
alias GitGud.Federation.Actor
import GitGud.AccountsFixtures
import GitGud.ForgeFixtures
describe "ensure_local_actor/1" do
test "creates an actor with a keypair for a user" do
user = user_fixture()
assert {:ok, %Actor{} = actor} = Federation.ensure_local_actor(user)
assert actor.kind == "local"
assert actor.actor_type == "Person"
assert actor.local_user_id == user.id
assert String.starts_with?(actor.actor_url, "http")
assert String.contains?(actor.public_key_pem, "BEGIN PUBLIC KEY")
assert String.contains?(actor.private_key_pem, "PRIVATE KEY")
assert actor.public_key_id == actor.actor_url <> "#main-key"
end
test "is idempotent for a given entity" do
user = user_fixture()
{:ok, a1} = Federation.ensure_local_actor(user)
{:ok, a2} = Federation.ensure_local_actor(user)
assert a1.id == a2.id
assert a1.actor_url == a2.actor_url
end
test "Group actor type for an organization" do
user = user_fixture()
{:ok, org} = GitGud.Organizations.create_organization(user, %{"handle" => "fediorg"})
assert {:ok, actor} = Federation.ensure_local_actor(org)
assert actor.actor_type == "Group"
assert actor.preferred_username == "fediorg"
end
test "Repository actor type for a repo" do
{_user, repo} = repository_fixture()
assert {:ok, actor} = Federation.ensure_local_actor(repo)
assert actor.actor_type == "Repository"
end
end
describe "screen_inbound/1" do
test "default open mode allows unknown actors" do
assert :ok = Federation.screen_inbound("https://other.example/users/alice")
end
test "blocks an explicitly blocked instance" do
{:ok, _} = Federation.block_instance("bad.example", reason: "spam")
assert {:drop, "instance_blocked"} =
Federation.screen_inbound("https://bad.example/users/spammer")
end
test "blocks an explicitly blocked actor" do
url = "https://other.example/users/troll"
{:ok, _} = Federation.block_actor(url, "harassment")
assert {:drop, "actor_blocked"} = Federation.screen_inbound(url)
end
test "allowlist mode rejects non-allowlisted hosts" do
original_mode = Application.get_env(:git_gud, Federation, [])
Application.put_env(
:git_gud,
Federation,
Keyword.put(original_mode, :federation_mode, :allowlist)
)
on_exit(fn -> Application.put_env(:git_gud, Federation, original_mode) end)
assert {:drop, "not_on_allowlist"} =
Federation.screen_inbound("https://random.example/users/x")
{:ok, _} = Federation.allowlist_instance("random.example")
assert :ok = Federation.screen_inbound("https://random.example/users/x")
end
end
describe "WebFinger discovery" do
test "find_local_actor_by_handle/1 resolves user actors" do
user = user_fixture()
{:ok, _} = Federation.ensure_local_actor(user)
handle = GitGud.Repositories.Storage.owner_handle(user)
assert %Actor{} = Federation.find_local_actor_by_handle(handle)
end
end
end