From 5f64a43304e2f7242f5ce2d62064329d5fee43bf Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Thu, 23 Apr 2026 18:08:05 -0500 Subject: [PATCH] test: additional MapLive.Index handle_info + InfoLive path decoders --- .../live/info_live/show_full_render_test.exs | 35 +++++++++++++ .../live/info_live/show_helpers_test.exs | 30 +++++++++++ test/aprsme_web/live/map_live/index_test.exs | 52 +++++++++++++++++++ 3 files changed, 117 insertions(+) diff --git a/test/aprsme_web/live/info_live/show_full_render_test.exs b/test/aprsme_web/live/info_live/show_full_render_test.exs index b2f7982..5c59ce7 100644 --- a/test/aprsme_web/live/info_live/show_full_render_test.exs +++ b/test/aprsme_web/live/info_live/show_full_render_test.exs @@ -111,6 +111,41 @@ defmodule AprsmeWeb.InfoLive.ShowFullRenderTest do assert html =~ "WXONLY" end + test "renders a station with a rich APRS path exercising decoders", %{conn: conn} do + _packet = + packet_fixture(%{ + sender: "PATH2", + base_callsign: "PATH2", + ssid: "0", + received_at: DateTime.utc_now(), + lat: Decimal.new("30.0"), + lon: Decimal.new("-90.0"), + has_position: true, + # Mixes q-construct, WIDE, TRACE, RELAY, TCPIP, generic digi, and bare station. + path: "WIDE1-1,WIDE2-2,TRACE3-3,RELAY,TCPIP*,K5ABC-1,N0CALL,qAC" + }) + + {:ok, _lv, html} = live(conn, ~p"/info/PATH2", on_error: :warn) + assert html =~ "PATH2" + end + + test "renders a station with a packet that has a nil path", %{conn: conn} do + _packet = + packet_fixture(%{ + sender: "NOPATH", + base_callsign: "NOPATH", + ssid: "0", + received_at: DateTime.utc_now(), + lat: Decimal.new("30.0"), + lon: Decimal.new("-90.0"), + has_position: true, + path: nil + }) + + {:ok, _lv, html} = live(conn, ~p"/info/NOPATH", on_error: :warn) + assert html =~ "NOPATH" + end + test "posts a postgres_packet broadcast to InfoLive.Show without crashing", %{conn: conn} do _packet = packet_fixture(%{ diff --git a/test/aprsme_web/live/info_live/show_helpers_test.exs b/test/aprsme_web/live/info_live/show_helpers_test.exs index 8b193f2..25ff126 100644 --- a/test/aprsme_web/live/info_live/show_helpers_test.exs +++ b/test/aprsme_web/live/info_live/show_helpers_test.exs @@ -166,6 +166,36 @@ defmodule AprsmeWeb.InfoLive.ShowHelpersTest do end end + describe "haversine/4 with Decimal input" do + test "handles Decimal-valued coordinates" do + result = + Show.haversine( + Decimal.new("40.0"), + Decimal.new("-100.0"), + Decimal.new("41.0"), + Decimal.new("-99.0") + ) + + assert is_float(result) + assert result > 0 + end + end + + describe "format_distance/2 rounding" do + test "rounds to 2 decimal places in metric mode" do + # 1.234567 km → "1.23 km" + assert Show.format_distance(1.234567, "fr") == "1.23 km" + end + + test "0 km in metric mode prints 0 m" do + assert Show.format_distance(0.0, "de") == "0.0 m" + end + + test "0 km in English mode prints 0 ft" do + assert Show.format_distance(0.0, "en") == "0.0 ft" + end + end + describe "position_changed_for_test/2" do test "returns true when current packet is nil" do assert Show.position_changed_for_test(nil, %{lat: 1.0, lon: 1.0}) diff --git a/test/aprsme_web/live/map_live/index_test.exs b/test/aprsme_web/live/map_live/index_test.exs index 15e82d1..a07d8a4 100644 --- a/test/aprsme_web/live/map_live/index_test.exs +++ b/test/aprsme_web/live/map_live/index_test.exs @@ -606,6 +606,58 @@ defmodule AprsmeWeb.MapLive.IndexTest do assert render(view) =~ "aprs-map" end + test "handles drain_connections with small to_drain value", %{conn: conn} do + {:ok, view, _html} = live(conn, "/", on_error: :warn) + + # to_drain * 10 << 100, likely no-op; still should keep process alive. + send(view.pid, {:drain_connections, 1}) + Process.sleep(30) + assert Process.alive?(view.pid) + end + + test "handles clear_rf_path via direct send", %{conn: conn} do + {:ok, view, _html} = live(conn, "/", on_error: :warn) + send(view.pid, :clear_rf_path) + Process.sleep(30) + assert Process.alive?(view.pid) + end + + test "handles load_historical_batch with stale generation", %{conn: conn} do + {:ok, view, _html} = live(conn, "/", on_error: :warn) + # Send with a generation that probably doesn't match — should just be ignored. + send(view.pid, {:load_historical_batch, 0, 99_999}) + Process.sleep(30) + assert Process.alive?(view.pid) + end + + test "handles load_historical_batch with backward-compat 2-arg form", %{conn: conn} do + {:ok, view, _html} = live(conn, "/", on_error: :warn) + send(view.pid, {:load_historical_batch, 0}) + Process.sleep(30) + assert Process.alive?(view.pid) + end + + test "handles historical_loading_timeout with stale generation", %{conn: conn} do + {:ok, view, _html} = live(conn, "/", on_error: :warn) + send(view.pid, {:historical_loading_timeout, 99_999}) + Process.sleep(30) + assert Process.alive?(view.pid) + end + + test "handles process_pending_bounds with no pending", %{conn: conn} do + {:ok, view, _html} = live(conn, "/", on_error: :warn) + send(view.pid, {:process_pending_bounds}) + Process.sleep(30) + assert Process.alive?(view.pid) + end + + test "handles load_rf_path_station_packets with empty list", %{conn: conn} do + {:ok, view, _html} = live(conn, "/", on_error: :warn) + send(view.pid, {:load_rf_path_station_packets, []}) + Process.sleep(30) + assert Process.alive?(view.pid) + end + test "handles postgres_packet broadcast via batcher", %{conn: conn} do {:ok, view, _html} = live(conn, "/?lat=33.0&lng=-96.0&z=12", on_error: :warn)