commit: 29f76079107f12e14b87e58c804ff10550381478
parent 8a0551686238af40ac21a2a9152f2a218c69d04e
Author: Mark Felder <feld@feld.me>
Date: Sat, 28 Jun 2025 12:51:10 -0700
Add Instances.check_all_unreachable/0 and Instance.check_unreachable/1
Diffstat:
4 files changed, 85 insertions(+), 0 deletions(-)
diff --git a/lib/pleroma/instances.ex b/lib/pleroma/instances.ex
@@ -24,4 +24,13 @@ defmodule Pleroma.Instances do
url_or_host
end
end
+
+ @doc "Schedules reachability checks for all unreachable instances"
+ def check_all_unreachable do
+ get_unreachable()
+ |> Enum.each(fn {domain, _} ->
+ Pleroma.Workers.ReachabilityWorker.new(%{"domain" => domain})
+ |> Oban.insert()
+ end)
+ end
end
diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex
@@ -304,4 +304,10 @@ defmodule Pleroma.Instances.Instance do
DeleteWorker.new(%{"op" => "delete_instance", "host" => host})
|> Oban.insert()
end
+
+ @doc "Schedules reachability check for instance"
+ def check_unreachable(domain) when is_binary(domain) do
+ Pleroma.Workers.ReachabilityWorker.new(%{"domain" => domain})
+ |> Oban.insert()
+ end
end
diff --git a/test/pleroma/instances/instance_test.exs b/test/pleroma/instances/instance_test.exs
@@ -249,4 +249,34 @@ defmodule Pleroma.Instances.InstanceTest do
args: %{"op" => "delete_instance", "host" => "mushroom.kingdom"}
)
end
+
+ describe "check_unreachable/1" do
+ test "schedules a ReachabilityWorker job for the given domain" do
+ domain = "test.example.com"
+
+ # Call check_unreachable
+ assert {:ok, _job} = Instance.check_unreachable(domain)
+
+ # Verify that a ReachabilityWorker job was scheduled
+ jobs = all_enqueued(worker: Pleroma.Workers.ReachabilityWorker)
+ assert length(jobs) == 1
+ [job] = jobs
+ assert job.args["domain"] == domain
+ end
+
+ test "handles multiple calls for the same domain (uniqueness enforced)" do
+ domain = "duplicate.example.com"
+
+ assert {:ok, _job1} = Instance.check_unreachable(domain)
+
+ # Second call for the same domain
+ assert {:ok, %Oban.Job{conflict?: true}} = Instance.check_unreachable(domain)
+
+ # Should only have one job due to uniqueness
+ jobs = all_enqueued(worker: Pleroma.Workers.ReachabilityWorker)
+ assert length(jobs) == 1
+ [job] = jobs
+ assert job.args["domain"] == domain
+ end
+ end
end
diff --git a/test/pleroma/instances_test.exs b/test/pleroma/instances_test.exs
@@ -6,6 +6,7 @@ defmodule Pleroma.InstancesTest do
alias Pleroma.Instances
use Pleroma.DataCase
+ use Oban.Testing, repo: Pleroma.Repo
describe "reachable?/1" do
test "returns `true` for host / url with unknown reachability status" do
@@ -69,4 +70,43 @@ defmodule Pleroma.InstancesTest do
assert {:error, _} = Instances.set_unreachable(1)
end
end
+
+ describe "check_all_unreachable/0" do
+ test "schedules ReachabilityWorker jobs for all unreachable instances" do
+ domain1 = "unreachable1.example.com"
+ domain2 = "unreachable2.example.com"
+ domain3 = "unreachable3.example.com"
+
+ Instances.set_unreachable(domain1)
+ Instances.set_unreachable(domain2)
+ Instances.set_unreachable(domain3)
+
+ Instances.check_all_unreachable()
+
+ # Verify that ReachabilityWorker jobs were scheduled for all unreachable domains
+ jobs = all_enqueued(worker: Pleroma.Workers.ReachabilityWorker)
+ assert length(jobs) == 3
+
+ domains = Enum.map(jobs, & &1.args["domain"])
+ assert domain1 in domains
+ assert domain2 in domains
+ assert domain3 in domains
+ end
+
+ test "does not schedule jobs for reachable instances" do
+ unreachable_domain = "unreachable.example.com"
+ reachable_domain = "reachable.example.com"
+
+ Instances.set_unreachable(unreachable_domain)
+ Instances.set_reachable(reachable_domain)
+
+ Instances.check_all_unreachable()
+
+ # Verify that only one job was scheduled (for the unreachable domain)
+ jobs = all_enqueued(worker: Pleroma.Workers.ReachabilityWorker)
+ assert length(jobs) == 1
+ [job] = jobs
+ assert job.args["domain"] == unreachable_domain
+ end
+ end
end