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