aprs.me/test/aprsme/packets/query_builder_test.exs

90 lines
2.6 KiB
Elixir

defmodule Aprsme.Packets.QueryBuilderTest do
use Aprsme.DataCase
import Ecto.Query
alias Aprsme.Packet
alias Aprsme.Packets.QueryBuilder
describe "within_bounds/2" do
test "filters packets within normal bounds" do
# Create test packets
{:ok, inside} =
Aprsme.Repo.insert(%Packet{
sender: "TEST-1",
lat: 40.5,
lon: -73.5,
has_position: true,
received_at: DateTime.truncate(DateTime.utc_now(), :second)
})
{:ok, _outside} =
Aprsme.Repo.insert(%Packet{
sender: "TEST-2",
lat: 50.0,
lon: -73.5,
has_position: true,
received_at: DateTime.truncate(DateTime.utc_now(), :second)
})
# Test normal bounds [west, south, east, north]
query = QueryBuilder.within_bounds(Packet, [-74.0, 40.0, -73.0, 41.0])
results = Aprsme.Repo.all(query)
assert length(results) == 1
assert hd(results).id == inside.id
end
test "handles antimeridian crossing bounds" do
# Create test packets
{:ok, west_side} =
Aprsme.Repo.insert(%Packet{
sender: "WEST-1",
lat: 0.0,
lon: 175.0,
has_position: true,
received_at: DateTime.truncate(DateTime.utc_now(), :second)
})
{:ok, east_side} =
Aprsme.Repo.insert(%Packet{
sender: "EAST-1",
lat: 0.0,
lon: -175.0,
has_position: true,
received_at: DateTime.truncate(DateTime.utc_now(), :second)
})
{:ok, _middle} =
Aprsme.Repo.insert(%Packet{
sender: "MIDDLE-1",
lat: 0.0,
lon: 0.0,
has_position: true,
received_at: DateTime.truncate(DateTime.utc_now(), :second)
})
# Test antimeridian crossing bounds [west=170, south=-10, east=-170, north=10]
query = QueryBuilder.within_bounds(Packet, [170.0, -10.0, -170.0, 10.0])
results = Aprsme.Repo.all(query)
assert length(results) == 2
result_ids = results |> Enum.map(& &1.id) |> Enum.sort()
expected_ids = Enum.sort([west_side.id, east_side.id])
assert result_ids == expected_ids
end
test "returns query unchanged with invalid bounds" do
original_query = from(p in Packet)
# Test with nil
assert QueryBuilder.within_bounds(original_query, nil) == original_query
# Test with wrong number of elements
assert QueryBuilder.within_bounds(original_query, [1, 2, 3]) == original_query
# Test with non-numeric values
assert QueryBuilder.within_bounds(original_query, ["a", "b", "c", "d"]) == original_query
end
end
end