aprs.me/test/aprsme_web/live/map_live/display_manager_test.exs
Graham McIntire 6add35b11a
feat: add send_trail_line_for_tracked_callsign function
- Filters packets by tracked callsign and time threshold
- Sorts packets chronologically by received_at
- Pushes show_trail_line event with coordinates
- Returns socket unchanged when no packets found
2026-02-27 13:10:34 -06:00

136 lines
3.8 KiB
Elixir

defmodule AprsmeWeb.MapLive.DisplayManagerTest do
use Aprsme.DataCase, async: true
alias AprsmeWeb.MapLive.DisplayManager
setup do
# Create a basic socket mock for testing
socket = %Phoenix.LiveView.Socket{
assigns: %{
visible_packets: %{},
tracked_callsign: nil,
packet_age_threshold: nil,
map_bounds: nil,
map_zoom: 10,
historical_packets: %{}
},
private: %{live_temp: %{}}
}
{:ok, socket: socket}
end
describe "send_trail_line_for_tracked_callsign/1" do
test "pushes trail line event with sorted points", %{socket: socket} do
packet1 = %{
id: "1",
sender: "W5ISP-9",
lat: 30.123,
lon: -97.456,
received_at: ~U[2024-01-01 10:00:00Z]
}
packet2 = %{
id: "2",
sender: "W5ISP-9",
lat: 30.124,
lon: -97.457,
received_at: ~U[2024-01-01 10:05:00Z]
}
packet3 = %{
id: "3",
sender: "W5ISP-9",
lat: 30.125,
lon: -97.458,
received_at: ~U[2024-01-01 10:10:00Z]
}
visible_packets = %{"W5ISP-9:1" => packet1, "W5ISP-9:2" => packet2, "W5ISP-9:3" => packet3}
socket =
Map.put(socket, :assigns, %{
socket.assigns
| visible_packets: visible_packets,
tracked_callsign: "W5ISP-9",
packet_age_threshold: ~U[2024-01-01 09:00:00Z]
})
result_socket = DisplayManager.send_trail_line_for_tracked_callsign(socket)
push_events = get_in(result_socket.private, [:live_temp, :push_events]) || []
assert length(push_events) == 1
[[event_name, event_data]] = push_events
assert event_name == "show_trail_line"
assert event_data == %{
callsign: "W5ISP-9",
points: [
%{lat: 30.123, lng: -97.456, timestamp: "2024-01-01T10:00:00Z"},
%{lat: 30.124, lng: -97.457, timestamp: "2024-01-01T10:05:00Z"},
%{lat: 30.125, lng: -97.458, timestamp: "2024-01-01T10:10:00Z"}
]
}
end
test "filters by packet age threshold", %{socket: socket} do
packet1 = %{
id: "1",
sender: "W5ISP-9",
lat: 30.123,
lon: -97.456,
received_at: ~U[2024-01-01 09:00:00Z]
}
# Too old
packet2 = %{
id: "2",
sender: "W5ISP-9",
lat: 30.124,
lon: -97.457,
received_at: ~U[2024-01-01 10:05:00Z]
}
# Within threshold
visible_packets = %{"W5ISP-9:1" => packet1, "W5ISP-9:2" => packet2}
socket =
Map.put(socket, :assigns, %{
socket.assigns
| visible_packets: visible_packets,
tracked_callsign: "W5ISP-9",
packet_age_threshold: ~U[2024-01-01 10:00:00Z]
})
result_socket = DisplayManager.send_trail_line_for_tracked_callsign(socket)
push_events = get_in(result_socket.private, [:live_temp, :push_events]) || []
assert length(push_events) == 1
[[event_name, event_data]] = push_events
assert event_name == "show_trail_line"
assert event_data == %{
callsign: "W5ISP-9",
points: [%{lat: 30.124, lng: -97.457, timestamp: "2024-01-01T10:05:00Z"}]
}
end
test "returns socket unchanged when no packets", %{socket: socket} do
socket =
Map.put(socket, :assigns, %{
socket.assigns
| visible_packets: %{},
tracked_callsign: "W5ISP-9",
packet_age_threshold: ~U[2024-01-01 10:00:00Z]
})
result_socket = DisplayManager.send_trail_line_for_tracked_callsign(socket)
push_events = get_in(result_socket.private, [:live_temp, :push_events]) || []
assert push_events == []
end
end
end