aprs.me/test/aprsme/packets_oldest_test.exs
Graham McIntire c711caff4e
Remove AppSignal; fix decrement trigger and stale test assertions
- Delete config/appsignal.exs (was never wired into mix.exs or any
  other config file)
- Migration: fix decrement_packet_sequence trigger to handle the case
  where currval() hasn't been called in the current DB session, matching
  the same exception handling already present in get_packet_count()
- Fix get_historical_packet_count test: invalid non-list bounds are
  silently ignored (no error), so assert is_integer not count == 0
- Add Repo.delete_all(Packet) setup blocks in PacketsOldestTest and
  PacketConsumerTest to clear any committed DB state before tests that
  depend on an empty packets table
2026-05-05 13:20:58 -05:00

82 lines
2.6 KiB
Elixir

defmodule Aprsme.PacketsOldestTest do
use Aprsme.DataCase
alias Aprsme.Packet
alias Aprsme.Packets
alias Aprsme.Repo
describe "get_oldest_packet_timestamp/0" do
setup do
Repo.delete_all(Packet)
:ok
end
test "returns nil when no packets exist" do
assert is_nil(Packets.get_oldest_packet_timestamp())
end
test "returns the timestamp of the oldest packet" do
# Create packets with different timestamps relative to now
now = DateTime.utc_now()
# 1 year ago
oldest_time = DateTime.add(now, -365 * 24 * 60 * 60, :second)
# 6 months ago
middle_time = DateTime.add(now, -180 * 24 * 60 * 60, :second)
# 1 month ago
newest_time = DateTime.add(now, -30 * 24 * 60 * 60, :second)
# Insert packets with different timestamps
{:ok, _} = create_test_packet("OLD-1", oldest_time)
{:ok, _} = create_test_packet("MID-1", middle_time)
{:ok, _} = create_test_packet("NEW-1", newest_time)
# Should return the oldest timestamp
result = Packets.get_oldest_packet_timestamp()
# Allow for small time differences due to database precision (±1 second)
assert abs(DateTime.diff(result, oldest_time, :second)) <= 1
end
test "handles packets with microsecond precision" do
# Create a packet with microsecond precision using current time
now = DateTime.utc_now()
# Truncate to microseconds to match database precision
timestamp_with_microseconds = DateTime.truncate(now, :microsecond)
{:ok, _} = create_test_packet("TEST-1", timestamp_with_microseconds)
result = Packets.get_oldest_packet_timestamp()
# Database might truncate microseconds, so we check the timestamp is close
assert DateTime.diff(result, timestamp_with_microseconds, :microsecond) < 1000
end
end
# Helper function to create a test packet with specific timestamp
defp create_test_packet(callsign, received_at) do
# Extract SSID from callsign (e.g., "TEST-1" -> ssid = "1")
{base_callsign, ssid} =
case String.split(callsign, "-", parts: 2) do
[base] -> {base, "0"}
[base, ssid_part] -> {base, ssid_part}
end
packet_data = %{
sender: callsign,
base_callsign: base_callsign,
ssid: ssid,
destination: "APRS",
data_type: "position",
path: "WIDE1-1",
information_field: "!3216.46N/09647.82W>Test packet",
raw_packet: "#{callsign}>APRS,WIDE1-1:!3216.46N/09647.82W>Test packet",
lat: 32.274333,
lon: -96.797,
has_position: true,
received_at: received_at
}
%Packet{}
|> Packet.changeset(packet_data)
|> Repo.insert()
end
end