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.
76 lines
2.5 KiB
Elixir
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
|