defmodule Microwaveprop.Propagation.GridScoreTest do use Microwaveprop.DataCase, async: true alias Microwaveprop.Propagation.GridScore @valid_attrs %{ lat: 32.875, lon: -97.0, valid_time: ~U[2026-03-28 18:00:00Z], band_mhz: 10_000, score: 72, factors: %{ "humidity" => 85, "time_of_day" => 60, "td_depression" => 70, "refractivity" => 55, "sky" => 80, "season" => 65, "wind" => 50, "rain" => 90, "pressure" => 45 } } describe "changeset/2" do test "valid attributes" do changeset = GridScore.changeset(%GridScore{}, @valid_attrs) assert changeset.valid? end test "requires all fields" do changeset = GridScore.changeset(%GridScore{}, %{}) assert %{ lat: ["can't be blank"], lon: ["can't be blank"], valid_time: ["can't be blank"], band_mhz: ["can't be blank"], score: ["can't be blank"], factors: ["can't be blank"] } = errors_on(changeset) end test "persists to database" do changeset = GridScore.changeset(%GridScore{}, @valid_attrs) assert {:ok, score} = Repo.insert(changeset) assert score.lat == 32.875 assert score.lon == -97.0 assert score.band_mhz == 10_000 assert score.score == 72 assert score.factors["humidity"] == 85 end test "enforces unique lat + lon + valid_time + band_mhz" do assert {:ok, _} = %GridScore{} |> GridScore.changeset(@valid_attrs) |> Repo.insert() assert {:error, changeset} = %GridScore{} |> GridScore.changeset(@valid_attrs) |> Repo.insert() assert %{lat: ["has already been taken"]} = errors_on(changeset) end test "allows same location at different times" do assert {:ok, _} = %GridScore{} |> GridScore.changeset(@valid_attrs) |> Repo.insert() later_attrs = Map.put(@valid_attrs, :valid_time, ~U[2026-03-28 19:00:00Z]) assert {:ok, _} = %GridScore{} |> GridScore.changeset(later_attrs) |> Repo.insert() end test "allows same location and time for different bands" do assert {:ok, _} = %GridScore{} |> GridScore.changeset(@valid_attrs) |> Repo.insert() other_band_attrs = Map.put(@valid_attrs, :band_mhz, 24_000) assert {:ok, _} = %GridScore{} |> GridScore.changeset(other_band_attrs) |> Repo.insert() end end end