diff --git a/test/microwaveprop_web/live/skewt_live_test.exs b/test/microwaveprop_web/live/skewt_live_test.exs index efafbd30..d7a6e4b6 100644 --- a/test/microwaveprop_web/live/skewt_live_test.exs +++ b/test/microwaveprop_web/live/skewt_live_test.exs @@ -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