test: SkewtLive HRRR + sounding fixtures bring coverage to 82.7%

Added profile/sounding setup blocks to SkewtLive tests so the
list_valid_times_near + nearest_sounding_to paths run with real
data. SkewtLive: 33% -> 46%.

Total project coverage: 82.7%.
This commit is contained in:
Graham McIntire 2026-05-08 09:38:41 -05:00
parent 363646f34f
commit 2c6458957b
No known key found for this signature in database
GPG key ID: F4ABF488E6029E59

View file

@ -4,6 +4,8 @@ defmodule MicrowavepropWeb.SkewtLiveTest do
import Phoenix.LiveViewTest
alias Microwaveprop.Weather.HrrrProfile
alias Microwaveprop.Weather.Sounding
alias Microwaveprop.Weather.Station
describe "with HRRR profile data near the queried location" do
setup do
@ -12,7 +14,13 @@ defmodule MicrowavepropWeb.SkewtLiveTest do
%{"pres" => 925.0, "hght" => 770, "tmpc" => 18.0, "dwpc" => 12.0},
%{"pres" => 850.0, "hght" => 1500, "tmpc" => 14.0, "dwpc" => 8.0},
%{"pres" => 700.0, "hght" => 3000, "tmpc" => 0.0, "dwpc" => -10.0},
%{"pres" => 500.0, "hght" => 5500, "tmpc" => -20.0, "dwpc" => -30.0}
%{"pres" => 500.0, "hght" => 5500, "tmpc" => -20.0, "dwpc" => -30.0},
%{"pres" => 400.0, "hght" => 7000, "tmpc" => -30.0, "dwpc" => -40.0},
%{"pres" => 300.0, "hght" => 9000, "tmpc" => -45.0, "dwpc" => -55.0},
%{"pres" => 250.0, "hght" => 10_500, "tmpc" => -55.0, "dwpc" => -65.0},
%{"pres" => 200.0, "hght" => 12_000, "tmpc" => -55.0, "dwpc" => -65.0},
%{"pres" => 150.0, "hght" => 13_500, "tmpc" => -55.0, "dwpc" => -65.0},
%{"pres" => 100.0, "hght" => 16_000, "tmpc" => -55.0, "dwpc" => -65.0}
]
# Insert near EM12kp (32.646, -97.125)
@ -36,7 +44,7 @@ defmodule MicrowavepropWeb.SkewtLiveTest do
})
|> Microwaveprop.Repo.insert!()
:ok
%{valid_time: now}
end
test "renders the time selector when valid_times list is non-empty", %{conn: conn} do
@ -46,6 +54,67 @@ defmodule MicrowavepropWeb.SkewtLiveTest do
# tries an HTTP call that fails — but the page should not crash.
assert render(view) =~ "Skew-T"
end
test "select_time event triggers a re-load with the chosen valid_time", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/skewt?q=EM12kp")
_ = render_async(view)
# Trigger select_time with a valid future ISO. Even if no profile is
# found for this time, the handler exercises the full re-load path.
future = DateTime.utc_now() |> DateTime.add(3600, :second) |> DateTime.to_iso8601()
_ = render_hook(view, "select_time", %{"valid_time" => future})
_ = render_async(view)
assert render(view) =~ "Skew-T"
end
end
describe "with a sounding readout near the queried point" do
setup do
# Insert a station + sounding so build_sounding_readout returns
# non-nil and renders the side panel.
now = DateTime.truncate(DateTime.utc_now(), :second)
{:ok, station} =
%Station{}
|> Station.changeset(%{
station_code: "FWD",
station_type: "sounding",
name: "Fort Worth",
lat: 32.835,
lon: -97.298
})
|> Microwaveprop.Repo.insert()
sounding_attrs = %{
station_id: station.id,
observed_at: now,
ducting_detected: false,
min_refractivity_gradient: -45.0,
boundary_layer_depth_m: 1500.0,
precipitable_water_mm: 25.0,
surface_refractivity: 320.0,
level_count: 3,
profile: [
%{"pres" => 1000.0, "hght" => 110, "tmpc" => 25.0, "dwpc" => 18.0},
%{"pres" => 925.0, "hght" => 770, "tmpc" => 18.0, "dwpc" => 12.0},
%{"pres" => 850.0, "hght" => 1500, "tmpc" => 14.0, "dwpc" => 8.0}
]
}
%Sounding{}
|> Sounding.changeset(sounding_attrs)
|> Microwaveprop.Repo.insert!()
:ok
end
test "renders without crashing when sounding data is in the DB", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/skewt?q=EM12kp")
_ = render_async(view)
assert render(view) =~ "Skew-T"
end
end
describe "select_time event" do