diff --git a/test/microwaveprop/workers/backfill_enqueue_worker_test.exs b/test/microwaveprop/workers/backfill_enqueue_worker_test.exs new file mode 100644 index 00000000..2b48df40 --- /dev/null +++ b/test/microwaveprop/workers/backfill_enqueue_worker_test.exs @@ -0,0 +1,100 @@ +defmodule Microwaveprop.Workers.BackfillEnqueueWorkerTest do + use Microwaveprop.DataCase, async: true + + alias Microwaveprop.Radio.Contact + alias Microwaveprop.Terrain.ElevationClient + alias Microwaveprop.Weather.HrrrClient + alias Microwaveprop.Weather.IemClient + alias Microwaveprop.Workers.BackfillEnqueueWorker + + defp create_contact(attrs \\ %{}) do + default = %{ + station1: "W5XD", + station2: "K5TR", + qso_timestamp: ~U[2026-03-28 18:00:00Z], + mode: "CW", + band: Decimal.new("1296"), + grid1: "EM12", + grid2: "EM00", + pos1: %{"lat" => 32.9, "lon" => -97.0}, + pos2: %{"lat" => 30.3, "lon" => -97.7}, + distance_km: Decimal.new("295") + } + + {:ok, contact} = + %Contact{} + |> Contact.changeset(Map.merge(default, attrs)) + |> Repo.insert() + + contact + end + + setup do + Req.Test.stub(IemClient, fn conn -> + case conn.request_path do + "/cgi-bin/request/asos.py" -> + Req.Test.text(conn, "#DEBUG,\nstation,valid,tmpf\n") + + "/iemre/" <> _ -> + Req.Test.json(conn, %{"data" => [%{"utc_hour" => 0, "p01m_mm" => 0.0}]}) + + _ -> + Req.Test.json(conn, %{"profiles" => []}) + end + end) + + Req.Test.stub(HrrrClient, fn conn -> + Plug.Conn.send_resp(conn, 404, "not found") + end) + + Req.Test.stub(ElevationClient, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + lat_count = params["latitude"] |> String.split(",") |> length() + Req.Test.json(conn, %{"elevation" => List.duplicate(200.0, lat_count)}) + end) + + :ok + end + + describe "perform/1" do + test "enqueues enrichment jobs for pending contacts" do + create_contact() + + assert :ok = BackfillEnqueueWorker.perform(%Oban.Job{args: %{"limit" => 10}}) + end + + test "does not enqueue for already-complete contacts" do + contact = create_contact() + + contact + |> Ecto.Changeset.change(%{ + hrrr_status: :complete, + weather_status: :complete, + terrain_status: :complete, + iemre_status: :complete + }) + |> Repo.update!() + + assert :ok = BackfillEnqueueWorker.perform(%Oban.Job{args: %{"limit" => 10}}) + end + + test "respects limit parameter" do + for i <- 1..5 do + ts = DateTime.add(~U[2026-01-01 00:00:00Z], i * 3600, :second) + create_contact(%{qso_timestamp: ts}) + end + + assert :ok = BackfillEnqueueWorker.perform(%Oban.Job{args: %{"limit" => 2}}) + end + + test "broadcasts enqueue_complete with count" do + Phoenix.PubSub.subscribe(Microwaveprop.PubSub, "backfill:enqueue_complete") + + create_contact() + + assert :ok = BackfillEnqueueWorker.perform(%Oban.Job{args: %{"limit" => 10}}) + + assert_receive {:enqueue_complete, 1} + end + end +end