prop/test/microwaveprop/commercial/link_test.exs
Graham McIntire 10e8feb486
Add commercial link monitoring via SNMP polling
Poll UBNT AirFiber radios (AF11X + AF60-LR) every 5 minutes via
net-snmp CLI, storing signal metrics in commercial_samples. Fetches
ASOS weather alongside each cycle for propagation correlation.

Includes 7 seeded link definitions, Oban cron worker, and net-snmp
in the Docker image.
2026-03-30 13:02:59 -05:00

58 lines
1.8 KiB
Elixir

defmodule Microwaveprop.Commercial.LinkTest do
use Microwaveprop.DataCase, async: true
alias Microwaveprop.Commercial.Link
@valid_attrs %{
label: "test-link-abc",
host: "10.250.1.26",
community: "public",
radio_type: "af11x",
endpoint_a: %{lat: 33.246171, lon: -96.426516, alt_m: 205.4},
endpoint_b: %{lat: 33.187294, lon: -96.448128, alt_m: 191.0},
weather_station: "KTKI",
enabled: true
}
describe "changeset/2" do
test "valid attributes" do
changeset = Link.changeset(%Link{}, @valid_attrs)
assert changeset.valid?
end
test "requires label, host, community" do
changeset = Link.changeset(%Link{}, %{})
assert %{
label: ["can't be blank"],
host: ["can't be blank"],
community: ["can't be blank"]
} = errors_on(changeset)
end
test "validates radio_type inclusion" do
changeset = Link.changeset(%Link{}, %{@valid_attrs | radio_type: "unknown"})
assert %{radio_type: ["is invalid"]} = errors_on(changeset)
end
test "defaults enabled to true" do
changeset = Link.changeset(%Link{}, @valid_attrs)
assert Ecto.Changeset.get_field(changeset, :enabled) == true
end
test "persists to the database" do
changeset = Link.changeset(%Link{}, @valid_attrs)
assert {:ok, link} = Repo.insert(changeset)
assert link.label == "test-link-abc"
assert link.host == "10.250.1.26"
assert link.radio_type == "af11x"
assert link.endpoint_a[:lat] == 33.246171
end
test "enforces unique label" do
assert {:ok, _} = Repo.insert(Link.changeset(%Link{}, @valid_attrs))
assert {:error, changeset} = Repo.insert(Link.changeset(%Link{}, @valid_attrs))
assert %{label: ["has already been taken"]} = errors_on(changeset)
end
end
end