aprs.me/test/support/fixtures/packets_fixtures.ex
Graham McIntire e8d48f8058
speed up slow tests: remove Process.sleep, add batch fixture helper
- Replace Process.sleep(N) with explicit synchronization:
  render(view) to force LV mailbox drain, PubSub assert_receive for
  leader election, and render_hook sync guarantees
- Add batch_packet_fixtures/2 using Repo.insert_all for bulk test
  fixtures (200 inserts -> 1 round trip)
- Remove sleeps from historical_loading_test — tests query DB
  directly, don't need LV async processing
2026-06-02 15:02:07 -05:00

120 lines
3.3 KiB
Elixir

defmodule Aprsme.PacketsFixtures do
@moduledoc """
This module defines test helpers for creating
entities via the `Aprsme.Packets` context.
"""
alias Aprsme.Callsign
alias Aprsme.Packet
alias Aprsme.Repo
@doc """
Generate a packet.
"""
def packet_fixture(attrs \\ %{}) do
base_attrs = %{
sender: "TEST-1",
base_callsign: "TEST",
ssid: "1",
destination: "APRS",
received_at: DateTime.utc_now(),
lat: Decimal.new("40.7128"),
lon: Decimal.new("-74.0060"),
has_position: true,
raw_packet: "TEST-1>APRS:=4042.77N/07400.36W>Test packet",
data_type: "position",
path: "APRS",
data_extended: %{
symbol_table_id: "/",
symbol_code: ">",
comment: "Test packet"
}
}
# Extract base_callsign and ssid from sender if provided
final_attrs =
case Map.get(attrs, :sender) do
nil ->
base_attrs
sender ->
{base, ssid} = Callsign.extract_parts(sender)
Map.merge(base_attrs, %{base_callsign: base, ssid: ssid})
end
# Ensure location is set if lat/lon are provided
final_attrs_with_location =
if final_attrs[:lat] && final_attrs[:lon] do
location = %Geo.Point{
coordinates: {Decimal.to_float(final_attrs[:lon]), Decimal.to_float(final_attrs[:lat])},
srid: 4326
}
Map.put(final_attrs, :location, location)
else
final_attrs
end
{:ok, packet} =
attrs
|> Enum.into(final_attrs_with_location)
|> then(&Packet.changeset(%Packet{}, &1))
|> Repo.insert()
packet
end
@doc """
Batch-insert multiple packet fixtures in a single Repo.insert_all call.
Useful for tests that need many packets without the overhead of individual
changeset + insert round trips.
"""
def batch_packet_fixtures(count, base_attrs \\ %{}) do
base_attrs = Map.new(base_attrs)
now = DateTime.truncate(DateTime.utc_now(), :second)
lat_num = base_attrs[:lat] || 40.7
lon_num = base_attrs[:lon] || -74.0
lat_str = "#{lat_num}"
lon_str = "#{lon_num}"
location = %Geo.Point{
coordinates: {lon_num, lat_num},
srid: 4326
}
attrs_list =
for i <- 1..count do
sender = Map.get(base_attrs, :sender, "TEST#{i}")
{base, ssid} = Callsign.extract_parts(sender)
received_at =
DateTime.truncate(Map.get(base_attrs, :received_at) || DateTime.add(now, -rem(i, 60) * 60, :second), :second)
%{
sender: sender,
base_callsign: base,
ssid: ssid,
destination: Map.get(base_attrs, :destination, "APRS"),
received_at: received_at,
lat: Decimal.new(lat_str),
lon: Decimal.new(lon_str),
location: location,
has_position: true,
raw_packet: Map.get(base_attrs, :raw_packet, "#{sender}>APRS:=4042.77N/07400.36W>Test packet"),
data_type: Map.get(base_attrs, :data_type, "position"),
path: Map.get(base_attrs, :path, "APRS"),
comment: Map.get(base_attrs, :comment, "Test station #{i}"),
symbol_code: ">",
symbol_table_id: "/",
inserted_at: now,
updated_at: now
}
end
Repo.insert_all(Packet, attrs_list)
count
end
end