aprs.me/test/aprsme/cleanup_scheduler_test.exs

67 lines
2.4 KiB
Elixir

defmodule Aprsme.CleanupSchedulerTest do
# Mutates :aprsme, :cleanup_scheduler env; must be serialized with anything
# else that reads it.
use ExUnit.Case, async: false
alias Aprsme.CleanupScheduler
setup do
original = Application.get_env(:aprsme, :cleanup_scheduler)
on_exit(fn -> Application.put_env(:aprsme, :cleanup_scheduler, original || []) end)
:ok
end
describe "init/1" do
test "returns default 6-hour interval when enabled" do
Application.put_env(:aprsme, :cleanup_scheduler, enabled: true)
assert {:ok, %{interval: interval}} = CleanupScheduler.init([])
assert interval == 6 * 60 * 60 * 1000
end
test "honors a configured interval" do
Application.put_env(:aprsme, :cleanup_scheduler, enabled: true, interval: 5_000)
assert {:ok, %{interval: 5_000}} = CleanupScheduler.init([])
end
test "returns nil interval when disabled" do
Application.put_env(:aprsme, :cleanup_scheduler, enabled: false)
assert {:ok, %{interval: nil}} = CleanupScheduler.init([])
end
test "defaults to enabled when no config" do
Application.put_env(:aprsme, :cleanup_scheduler, [])
assert {:ok, %{interval: interval}} = CleanupScheduler.init([])
assert is_integer(interval)
end
test "init schedules a follow-up :schedule_cleanup message when enabled" do
Application.put_env(:aprsme, :cleanup_scheduler, enabled: true, interval: 10)
{:ok, _state} = CleanupScheduler.init([])
# Process.send_after targets self() (the test process in this call context),
# so we should receive the scheduled message shortly.
assert_receive :schedule_cleanup, 100
end
end
describe "handle_info/2" do
test "no-op for :schedule_cleanup when disabled" do
state = %{interval: nil}
assert CleanupScheduler.handle_info(:schedule_cleanup, state) == {:noreply, state}
end
test "runs cleanup and reschedules when interval is an integer" do
# Ensure BroadcastTaskSupervisor is up — it wraps Task.Supervisor.
_ =
case Process.whereis(Aprsme.BroadcastTaskSupervisor) do
nil -> start_supervised({Task.Supervisor, name: Aprsme.BroadcastTaskSupervisor})
_ -> :ok
end
state = %{interval: 100}
assert {:noreply, ^state} = CleanupScheduler.handle_info(:schedule_cleanup, state)
# Next cleanup scheduled.
assert_receive :schedule_cleanup, 300
end
end
end