Maidenhead grid module converts grid squares to lat/lon coordinates. Submission form validates grids, bands, modes, and email, computes positions and distance, then triggers the weather/HRRR/terrain processing pipeline via Oban.
95 lines
3 KiB
Elixir
95 lines
3 KiB
Elixir
defmodule Microwaveprop.Radio.QsoSubmissionTest do
|
|
use Microwaveprop.DataCase, async: true
|
|
|
|
alias Microwaveprop.Radio.Qso
|
|
|
|
@valid_attrs %{
|
|
station1: "W5XD",
|
|
station2: "K5TR",
|
|
qso_timestamp: ~U[2026-03-28 18:00:00Z],
|
|
mode: "CW",
|
|
band: "1296",
|
|
grid1: "EM12",
|
|
grid2: "EM00",
|
|
submitter_email: "test@example.com"
|
|
}
|
|
|
|
describe "submission_changeset/2" do
|
|
test "valid attrs produce a valid changeset" do
|
|
changeset = Qso.submission_changeset(%Qso{}, @valid_attrs)
|
|
assert changeset.valid?
|
|
end
|
|
|
|
test "requires station1, station2, qso_timestamp, mode, band, grid1, grid2, submitter_email" do
|
|
changeset = Qso.submission_changeset(%Qso{}, %{})
|
|
errors = errors_on(changeset)
|
|
|
|
assert errors[:station1]
|
|
assert errors[:station2]
|
|
assert errors[:qso_timestamp]
|
|
assert errors[:mode]
|
|
assert errors[:band]
|
|
assert errors[:grid1]
|
|
assert errors[:grid2]
|
|
assert errors[:submitter_email]
|
|
end
|
|
|
|
test "rejects invalid grid1" do
|
|
attrs = Map.put(@valid_attrs, :grid1, "ZZ99")
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
assert "is not a valid Maidenhead grid square" in errors_on(changeset).grid1
|
|
end
|
|
|
|
test "rejects invalid grid2" do
|
|
attrs = Map.put(@valid_attrs, :grid2, "ZZ99")
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
assert "is not a valid Maidenhead grid square" in errors_on(changeset).grid2
|
|
end
|
|
|
|
test "accepts valid 6-char grids" do
|
|
attrs = %{@valid_attrs | grid1: "EM12ab", grid2: "EM00cd"}
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
assert changeset.valid?
|
|
end
|
|
|
|
test "rejects invalid mode" do
|
|
attrs = Map.put(@valid_attrs, :mode, "RTTY")
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
assert errors_on(changeset).mode
|
|
end
|
|
|
|
test "accepts valid modes" do
|
|
for mode <- ~w(CW SSB FM FT8 FT4) do
|
|
attrs = Map.put(@valid_attrs, :mode, mode)
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
assert changeset.valid?, "Expected mode #{mode} to be valid"
|
|
end
|
|
end
|
|
|
|
test "rejects invalid band" do
|
|
attrs = Map.put(@valid_attrs, :band, "144")
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
assert errors_on(changeset).band
|
|
end
|
|
|
|
test "accepts valid microwave bands" do
|
|
for band <- ~w(1296 2304 3456 5760 10000 24000 47000 75000) do
|
|
attrs = Map.put(@valid_attrs, :band, band)
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
assert changeset.valid?, "Expected band #{band} to be valid"
|
|
end
|
|
end
|
|
|
|
test "rejects email without @" do
|
|
attrs = Map.put(@valid_attrs, :submitter_email, "notanemail")
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
assert errors_on(changeset).submitter_email
|
|
end
|
|
|
|
test "does not cast user_submitted" do
|
|
attrs = Map.put(@valid_attrs, :user_submitted, true)
|
|
changeset = Qso.submission_changeset(%Qso{}, attrs)
|
|
refute Ecto.Changeset.get_change(changeset, :user_submitted)
|
|
end
|
|
end
|
|
end
|