test: PacketConsumer batch sizing branches

This commit is contained in:
Graham McIntire 2026-04-23 18:20:31 -05:00
parent 0f700188f2
commit b6f34b9cb3
No known key found for this signature in database
GPG key ID: F4ABF488E6029E59

View file

@ -40,6 +40,67 @@ defmodule Aprsme.PacketConsumerTest do
end
end
describe "handle_events/3 batch sizing" do
test "partial batch just accumulates and re-schedules" do
{:consumer, state, _} = PacketConsumer.init(subscribe_to: [])
Process.cancel_timer(state.timer)
state = %{state | timer: nil, batch_size: 100, max_batch_size: 1000}
events = [%{sender: "BATCH-1", raw_packet: "x", received_at: DateTime.utc_now()}]
assert {:noreply, [], new_state} = PacketConsumer.handle_events(events, nil, state)
assert new_state.batch_length == 1
assert length(new_state.batch) == 1
end
test "full batch is processed (flushes state)" do
{:consumer, state, _} = PacketConsumer.init(subscribe_to: [])
Process.cancel_timer(state.timer)
# batch_size=1 so a single event triggers full-batch handling.
state = %{state | timer: nil, batch_size: 1, max_batch_size: 1000}
events = [
%{
sender: "FULL-1",
base_callsign: "FULL",
ssid: "1",
raw_packet: "FULL-1>APRS:>",
received_at: DateTime.utc_now()
}
]
assert {:noreply, [], new_state} = PacketConsumer.handle_events(events, nil, state)
assert new_state.batch_length == 0
assert new_state.batch == []
Process.cancel_timer(new_state.timer)
end
test "oversized batch processes up to max and carries remainder" do
{:consumer, state, _} = PacketConsumer.init(subscribe_to: [])
Process.cancel_timer(state.timer)
# batch_size=100, max_batch_size=2, so a 3-event burst is "oversized".
state = %{state | timer: nil, batch_size: 100, max_batch_size: 2}
events =
for i <- 1..3 do
%{
sender: "OS-#{i}",
base_callsign: "OS",
ssid: to_string(i),
raw_packet: "OS-#{i}>APRS:>",
received_at: DateTime.utc_now()
}
end
assert {:noreply, [], new_state} = PacketConsumer.handle_events(events, nil, state)
# Carryover holds the remaining 1 packet past the max.
assert new_state.batch_length == 1
Process.cancel_timer(new_state.timer)
end
end
describe "handle_info(:process_batch, state)" do
test "empty batch just restarts the timer" do
{:consumer, state, _} = PacketConsumer.init(subscribe_to: [])