defmodule Microwaveprop.Radio.ContactSubmissionTest do use Microwaveprop.DataCase, async: true alias Microwaveprop.Radio.Contact @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 = Contact.submission_changeset(%Contact{}, @valid_attrs) assert changeset.valid? end test "requires station1, station2, qso_timestamp, mode, band, grid1, grid2, submitter_email" do changeset = Contact.submission_changeset(%Contact{}, %{}) 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 = Contact.submission_changeset(%Contact{}, 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 = Contact.submission_changeset(%Contact{}, 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 = Contact.submission_changeset(%Contact{}, attrs) assert changeset.valid? end test "rejects invalid mode" do attrs = Map.put(@valid_attrs, :mode, "RTTY") changeset = Contact.submission_changeset(%Contact{}, 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 = Contact.submission_changeset(%Contact{}, 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 = Contact.submission_changeset(%Contact{}, 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 = Contact.submission_changeset(%Contact{}, 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 = Contact.submission_changeset(%Contact{}, attrs) assert errors_on(changeset).submitter_email end test "does not cast user_submitted" do attrs = Map.put(@valid_attrs, :user_submitted, true) changeset = Contact.submission_changeset(%Contact{}, attrs) refute Ecto.Changeset.get_change(changeset, :user_submitted) end end end