prop/test/microwaveprop/radio/contact_test.exs
Graham McIntire ca07c0288d
feat(contacts): antenna height fields feed terrain analysis
Add optional height1_ft/height2_ft to contact schema, submit form, and
edit form (direct + suggest-edit paths). Heights flow through to the
elevation-profile terrain analysis so clearance and diffraction are
computed from the actual antenna height instead of a 10-ft default.
Editing heights resets terrain_status and re-enqueues
TerrainProfileWorker so the stored path analysis picks up the new
geometry.

Also fix mark_likely_duct/3: the pattern was grabbing the element
instead of the index, so no duct ever got flagged as the likely
propagation path even when extract_ducts returned a valid layer.
2026-04-18 15:48:14 -05:00

76 lines
2.5 KiB
Elixir

defmodule Microwaveprop.Radio.ContactTest do
use Microwaveprop.DataCase, async: true
alias Microwaveprop.Radio.Contact
@valid_attrs %{
station1: "W1AW",
station2: "K3LR",
qso_timestamp: ~U[2026-03-28 12:00:00Z],
grid1: "FN31pr",
grid2: "EN91jm",
pos1: %{lat: 41.714, lon: -72.727},
pos2: %{lat: 41.049, lon: -80.166},
mode: "SSB",
band: Decimal.new("144.2"),
distance_km: Decimal.new("623.4")
}
describe "changeset/2" do
test "valid attributes" do
changeset = Contact.changeset(%Contact{}, @valid_attrs)
assert changeset.valid?
end
test "requires station1, station2, qso_timestamp, and band (mode is optional)" do
changeset = Contact.changeset(%Contact{}, %{})
errors = errors_on(changeset)
assert errors.station1 == ["can't be blank"]
assert errors.station2 == ["can't be blank"]
assert errors.qso_timestamp == ["can't be blank"]
assert errors.band == ["can't be blank"]
refute Map.has_key?(errors, :mode)
end
test "persists to the database" do
changeset = Contact.changeset(%Contact{}, @valid_attrs)
assert {:ok, contact} = Repo.insert(changeset)
assert contact.station1 == "W1AW"
assert contact.station2 == "K3LR"
assert contact.mode == "SSB"
assert Decimal.equal?(contact.band, Decimal.new("144.2"))
assert Decimal.equal?(contact.distance_km, Decimal.new("623.4"))
end
test "accepts optional height1_ft and height2_ft" do
attrs = Map.merge(@valid_attrs, %{height1_ft: 25, height2_ft: 60})
changeset = Contact.changeset(%Contact{}, attrs)
assert changeset.valid?
assert {:ok, contact} = Repo.insert(changeset)
assert contact.height1_ft == 25
assert contact.height2_ft == 60
end
end
describe "submission_changeset/2" do
@submission_attrs %{
"station1" => "W1AW",
"station2" => "K3LR",
"qso_timestamp" => "2026-03-28T12:00:00Z",
"grid1" => "FN31pr",
"grid2" => "EN91jm",
"mode" => "SSB",
"band" => Decimal.new("144"),
"submitter_email" => "test@example.com"
}
test "accepts height1_ft and height2_ft" do
attrs = Map.merge(@submission_attrs, %{"height1_ft" => 10, "height2_ft" => 50})
changeset = Contact.submission_changeset(%Contact{}, attrs)
assert changeset.valid?, inspect(errors_on(changeset))
assert Ecto.Changeset.get_field(changeset, :height1_ft) == 10
assert Ecto.Changeset.get_field(changeset, :height2_ft) == 50
end
end
end