- 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
82 lines
2.6 KiB
Elixir
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
|