prop/test/microwaveprop/commercial/sample_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.6 KiB
Elixir

defmodule Microwaveprop.Commercial.SampleTest do
use Microwaveprop.DataCase, async: true
alias Microwaveprop.Commercial.Link
alias Microwaveprop.Commercial.Sample
defp create_link do
%Link{}
|> Link.changeset(%{
label: "test-link",
host: "10.0.0.1",
community: "public",
radio_type: "af11x"
})
|> Repo.insert!()
end
@sample_attrs %{
sampled_at: ~U[2026-03-30 12:00:00.000000Z],
rx_power_0: -55.0,
tx_power: 20.0,
link_state: 1,
link_uptime: 86_400,
cur_tx_mod_rate: 6,
rx_capacity: 450,
tx_capacity: 450
}
describe "changeset/2" do
test "valid attributes with link_id" do
link = create_link()
attrs = Map.put(@sample_attrs, :link_id, link.id)
changeset = Sample.changeset(%Sample{}, attrs)
assert changeset.valid?
end
test "requires link_id and sampled_at" do
changeset = Sample.changeset(%Sample{}, %{})
assert %{link_id: ["can't be blank"], sampled_at: ["can't be blank"]} = errors_on(changeset)
end
test "persists to the database" do
link = create_link()
attrs = Map.put(@sample_attrs, :link_id, link.id)
assert {:ok, sample} = Repo.insert(Sample.changeset(%Sample{}, attrs))
assert sample.rx_power_0 == -55.0
assert sample.link_id == link.id
end
test "all signal fields are optional" do
link = create_link()
attrs = %{link_id: link.id, sampled_at: ~U[2026-03-30 12:00:00.000000Z]}
changeset = Sample.changeset(%Sample{}, attrs)
assert changeset.valid?
end
end
end