3.2 KiB · text 5af55d9
defmodule GitGud.Federation.SuggestedBlocksTest do
use GitGud.DataCase, async: false
alias GitGud.Federation
alias GitGud.Federation.SuggestedBlocks
alias GitGud.Federation.SuggestedInstanceBlock
import GitGud.AccountsFixtures
describe "parse_list/1" do
test "host-per-line + CSV + comments" do
text = """
# a list
bad.example
worse.example,known spammer
spaces.example , trimmed
"""
assert SuggestedBlocks.parse_list(text) == [
{"bad.example", nil},
{"worse.example", "known spammer"},
{"spaces.example", "trimmed"}
]
end
test "empty + comment-only returns []" do
assert SuggestedBlocks.parse_list("") == []
assert SuggestedBlocks.parse_list("# nothing here\n") == []
end
end
describe "ingest/3" do
test "creates pending rows for new hosts" do
{created, updated} =
SuggestedBlocks.ingest(
[{"bad.example", "abuse"}, {"worse.example", nil}],
"coop.example"
)
assert created == 2
assert updated == 0
assert SuggestedBlocks.pending_count() == 2
[a, b] = SuggestedBlocks.list_pending() |> Enum.sort_by(& &1.host)
assert a.peers == ["coop.example"]
assert a.peer_count == 1
_ = b
end
test "second peer reporting the same host bumps peers + count" do
SuggestedBlocks.ingest([{"bad.example", "abuse"}], "coop.example")
SuggestedBlocks.ingest([{"bad.example", "spam"}], "peer.example")
[row] = SuggestedBlocks.list_pending()
assert Enum.sort(row.peers) == ["coop.example", "peer.example"]
assert row.peer_count == 2
assert row.reasons =~ "abuse"
assert row.reasons =~ "spam"
end
test "hosts already blocked are filtered out" do
{:ok, _} = Federation.block_instance("already.example", severity: "suspend")
{created, _} =
SuggestedBlocks.ingest(
[{"already.example", "x"}, {"new.example", nil}],
"peer.example"
)
assert created == 1
assert [%{host: "new.example"}] = SuggestedBlocks.list_pending()
end
test "dry_run doesn't write" do
{created, _} =
SuggestedBlocks.ingest(
[{"x.example", nil}],
"peer.example",
dry_run: true
)
assert created == 1
assert SuggestedBlocks.pending_count() == 0
end
end
describe "approve / dismiss" do
setup do
user = user_fixture()
SuggestedBlocks.ingest([{"bad.example", "abuse"}], "coop.example")
[sug] = SuggestedBlocks.list_pending()
{:ok, user: user, sug: sug}
end
test "approve applies the real block + flips status", %{user: user, sug: sug} do
assert {:ok, %SuggestedInstanceBlock{} = updated} = SuggestedBlocks.approve(sug, user.id)
assert updated.status == "approved"
assert GitGud.Repo.get_by(GitGud.Federation.InstanceBlock, host: "bad.example")
end
test "dismiss flips status only", %{user: user, sug: sug} do
{:ok, updated} = SuggestedBlocks.dismiss(sug, user.id)
assert updated.status == "dismissed"
refute GitGud.Repo.get_by(GitGud.Federation.InstanceBlock, host: "bad.example")
end
end
end