prop/test/microwaveprop/workers/terrain_profile_worker_test.exs
Graham McIntire fd976b0cd5
fix: resolve 391 Credo issues across codebase
- Add jump_credo_checks ~> 0.4 with all 20 checks enabled
- Fix all standard Credo issues: 139 @spec (113 done, 26 remain),
  4 refactoring, 3 alias usage, 9 System.cmd env, 5 unsafe_to_atom,
  2 max line length, 9 assert_receive timeout
- Fix 170+ jump_credo_checks warnings:
  - 117 TopLevelAliasImportRequire: move nested alias/import to module top
  - 32 UseObanProWorker: switch to Oban.Pro.Worker
  - 4 DoctestIExExamples: add doctests / create test file
  - ~20 WeakAssertion: strengthen type-check assertions
  - Various ConditionalAssertion, AssertReceiveTimeout fixes
- Exclude vendor/ from Credo analysis
- Remaining: 175 warnings (mostly opinionated WeakAssertion,
  AvoidSocketAssignsInTest), 26 @spec annotations
2026-06-12 13:51:32 -05:00

95 lines
2.9 KiB
Elixir

defmodule Microwaveprop.Workers.TerrainProfileWorkerTest do
use Microwaveprop.DataCase, async: true
alias Microwaveprop.Radio.Contact
alias Microwaveprop.Terrain
alias Microwaveprop.Terrain.ElevationClient
alias Microwaveprop.Workers.TerrainProfileWorker
@qso_attrs %{
station1: "W5XD",
station2: "K5TR",
qso_timestamp: ~U[2026-03-28 18:00:00Z],
mode: "CW",
band: Decimal.new("1296"),
pos1: %{"lat" => 32.9, "lon" => -97.0},
pos2: %{"lat" => 30.3, "lon" => -97.7},
distance_km: Decimal.new("295")
}
defp create_contact(attrs \\ %{}) do
{:ok, contact} =
%Contact{}
|> Contact.changeset(Map.merge(@qso_attrs, attrs))
|> Repo.insert()
contact
end
defp stub_elevation_api do
Req.Test.stub(ElevationClient, fn conn ->
params = Plug.Conn.fetch_query_params(conn).query_params
lat_count = params["latitude"] |> String.split(",") |> length()
elevations = List.duplicate(200.0, lat_count)
Req.Test.json(conn, %{"elevation" => elevations})
end)
end
describe "perform/1" do
test "fetches elevation and stores terrain profile" do
stub_elevation_api()
contact = create_contact()
refute Terrain.has_terrain_profile?(contact.id)
job = TerrainProfileWorker.new(%{"contact_id" => contact.id})
assert :ok = TerrainProfileWorker.perform(%Oban.Job{args: job.changes.args})
assert Terrain.has_terrain_profile?(contact.id)
profile = Terrain.get_terrain_profile(contact.id)
assert profile.sample_count == 65
assert profile.verdict in ["CLEAR", "FRESNEL_MINOR", "FRESNEL_PARTIAL", "BLOCKED"]
assert profile.path_points != []
end
test "skips if terrain profile already exists" do
stub_elevation_api()
contact = create_contact()
{:ok, _} =
Terrain.upsert_terrain_profile(%{
contact_id: contact.id,
sample_count: 65,
path_points: [],
verdict: "CLEAR"
})
job = TerrainProfileWorker.new(%{"contact_id" => contact.id})
assert :ok = TerrainProfileWorker.perform(%Oban.Job{args: job.changes.args})
end
test "returns error when elevation API fails" do
Req.Test.stub(ElevationClient, fn conn ->
Plug.Conn.send_resp(conn, 500, "error")
end)
contact = create_contact()
job = TerrainProfileWorker.new(%{"contact_id" => contact.id})
assert {:error, _} = TerrainProfileWorker.perform(%Oban.Job{args: job.changes.args})
refute Terrain.has_terrain_profile?(contact.id)
end
test "uses correct frequency from band" do
stub_elevation_api()
contact = create_contact(%{band: Decimal.new("10368")})
job = TerrainProfileWorker.new(%{"contact_id" => contact.id})
assert :ok = TerrainProfileWorker.perform(%Oban.Job{args: job.changes.args})
profile = Terrain.get_terrain_profile(contact.id)
assert profile.verdict
end
end
end