aprs.me/test/aprsme/packets_weather_test.exs

217 lines
8 KiB
Elixir

defmodule Aprsme.PacketsWeatherTest do
use Aprsme.DataCase
alias Aprsme.Packets
describe "store_packet/1 with weather data" do
test "removes raw_weather_data from packet attributes before insertion and parses weather string" do
# Simulate a real APRS weather packet with correct format
raw_packet = "TEST-1>APRS,WIDE1-1,WIDE2-2:!3216.46N/09647.82W_180/010g015t072r000p000h45b10132"
# Parse the packet using the real APRS parser
{:ok, parsed_packet} = Aprs.parse(raw_packet)
# Create packet data as it would come from the parser
packet_data = %{
base_callsign: "TEST",
ssid: "1",
sender: "TEST-1",
destination: "APRS",
data_type: "position",
path: "WIDE1-1,WIDE2-2",
information_field: "!3216.46N/09647.82W_180/010g015t072r000p000h45b10132",
raw_packet: raw_packet,
data_extended: parsed_packet
}
assert {:ok, stored_packet} = Packets.store_packet(packet_data)
assert stored_packet.sender == "TEST-1"
assert stored_packet.data_type == "weather"
refute Map.has_key?(stored_packet, :raw_weather_data)
refute Map.has_key?(stored_packet, "raw_weather_data")
assert stored_packet.temperature == 72
assert stored_packet.humidity == 45
assert stored_packet.wind_direction == 180
assert stored_packet.wind_speed == 10
assert stored_packet.wind_gust == 15
assert stored_packet.pressure == 1013.2
assert stored_packet.rain_1h == 0
end
test "removes raw_weather_data from weather packets with string weather data" do
# Simulate a real APRS weather packet with correct format
raw_packet = "WEATHER-1>APRS,WIDE1-1:!3216.46N/09647.82W_270/012g018t085r000p000h60b10150"
# Parse the packet using the real APRS parser
{:ok, parsed_packet} = Aprs.parse(raw_packet)
packet_data = %{
base_callsign: "WEATHER",
ssid: "1",
sender: "WEATHER-1",
destination: "APRS",
data_type: "position",
path: "WIDE1-1",
information_field: "!3216.46N/09647.82W_270/012g018t085r000p000h60b10150",
raw_packet: raw_packet,
data_extended: parsed_packet
}
assert {:ok, stored_packet} = Packets.store_packet(packet_data)
assert stored_packet.data_type == "weather"
refute Map.has_key?(stored_packet, :raw_weather_data)
refute Map.has_key?(stored_packet, "raw_weather_data")
assert stored_packet.temperature == 85
assert stored_packet.humidity == 60
assert stored_packet.wind_direction == 270
assert stored_packet.wind_speed == 12
assert stored_packet.wind_gust == 18
assert stored_packet.pressure == 1015.0
end
test "removes raw_weather_data from comment-based weather parsing" do
# Simulate a real APRS packet with weather data in comment
raw_packet = "COMMENT-1>APRS,WIDE1-1:!3216.46N/09647.82W>090/008g012t095r000p000h70b10200"
# Parse the packet using the real APRS parser
{:ok, parsed_packet} = Aprs.parse(raw_packet)
packet_data = %{
base_callsign: "COMMENT",
ssid: "1",
sender: "COMMENT-1",
destination: "APRS",
data_type: "position",
path: "WIDE1-1",
information_field: "!3216.46N/09647.82W>090/008g012t095r000p000h70b10200",
raw_packet: raw_packet,
data_extended: parsed_packet
}
assert {:ok, stored_packet} = Packets.store_packet(packet_data)
assert stored_packet.data_type == "weather"
refute Map.has_key?(stored_packet, :raw_weather_data)
refute Map.has_key?(stored_packet, "raw_weather_data")
assert stored_packet.temperature == 95
assert stored_packet.humidity == 70
assert stored_packet.wind_direction == 90
assert stored_packet.wind_speed == 8
assert stored_packet.wind_gust == 12
assert stored_packet.pressure == 1020.0
end
test "handles packets without weather data correctly" do
# Simulate a real APRS packet without weather data
raw_packet = "REGULAR-1>APRS,WIDE1-1:!3216.46N/09647.82W>Just a regular packet"
# Parse the packet using the real APRS parser
{:ok, parsed_packet} = Aprs.parse(raw_packet)
packet_data = %{
base_callsign: "REGULAR",
ssid: "1",
sender: "REGULAR-1",
destination: "APRS",
data_type: "position",
path: "WIDE1-1",
information_field: "!3216.46N/09647.82W>Just a regular packet",
raw_packet: raw_packet,
data_extended: parsed_packet
}
assert {:ok, stored_packet} = Packets.store_packet(packet_data)
assert stored_packet.data_type == "position"
assert is_nil(stored_packet.temperature)
assert is_nil(stored_packet.humidity)
assert is_nil(stored_packet.wind_direction)
assert is_nil(stored_packet.wind_speed)
assert is_nil(stored_packet.wind_gust)
assert is_nil(stored_packet.pressure)
assert is_nil(stored_packet.rain_1h)
assert is_nil(stored_packet.rain_24h)
assert is_nil(stored_packet.rain_since_midnight)
refute Map.has_key?(stored_packet, :raw_weather_data)
refute Map.has_key?(stored_packet, "raw_weather_data")
end
test "handles batch insert operations correctly" do
# Simulate real APRS weather packets with correct format
raw_packet1 = "BATCH1-1>APRS,WIDE1-1:!3216.46N/09647.82W_200/010g015t070r000p000h50b10120"
raw_packet2 = "BATCH2-1>APRS,WIDE1-1:!3216.46N/09647.82W_220/012g018t075r000p000h55b10140"
# Parse the packets using the real APRS parser
{:ok, parsed_packet1} = Aprs.parse(raw_packet1)
{:ok, parsed_packet2} = Aprs.parse(raw_packet2)
packets_data = [
%{
base_callsign: "BATCH1",
ssid: "1",
sender: "BATCH1-1",
destination: "APRS",
data_type: "position",
path: "WIDE1-1",
information_field: "!3216.46N/09647.82W_200/010g015t070r000p000h50b10120",
raw_packet: raw_packet1,
data_extended: parsed_packet1
},
%{
base_callsign: "BATCH2",
ssid: "1",
sender: "BATCH2-1",
destination: "APRS",
data_type: "position",
path: "WIDE1-1",
information_field: "!3216.46N/09647.82W_220/012g018t075r000p000h55b10140",
raw_packet: raw_packet2,
data_extended: parsed_packet2
}
]
results = Enum.map(packets_data, &Packets.store_packet/1)
assert Enum.all?(results, fn {status, _} -> status == :ok end)
Enum.each(results, fn {:ok, stored_packet} ->
refute Map.has_key?(stored_packet, :raw_weather_data)
refute Map.has_key?(stored_packet, "raw_weather_data")
end)
[first_result, second_result] = results
{:ok, first_packet} = first_result
{:ok, second_packet} = second_result
assert first_packet.temperature == 70
assert first_packet.humidity == 50
assert first_packet.wind_direction == 200
assert second_packet.temperature == 75
assert second_packet.humidity == 55
assert second_packet.wind_direction == 220
end
test "handles snow data correctly" do
# Simulate a real APRS weather packet with snow data
raw_packet = "SNOW-1>APRS,WIDE1-1:!3216.46N/09647.82W_180/010g015t072r000p000h45b10132s005"
# Parse the packet using the real APRS parser
{:ok, parsed_packet} = Aprs.parse(raw_packet)
packet_data = %{
base_callsign: "SNOW",
ssid: "1",
sender: "SNOW-1",
destination: "APRS",
data_type: "position",
path: "WIDE1-1",
information_field: "!3216.46N/09647.82W_180/010g015t072r000p000h45b10132s005",
raw_packet: raw_packet,
data_extended: parsed_packet
}
assert {:ok, stored_packet} = Packets.store_packet(packet_data)
assert stored_packet.data_type == "weather"
assert stored_packet.snow == 0.5
refute Map.has_key?(stored_packet, :raw_weather_data)
refute Map.has_key?(stored_packet, "raw_weather_data")
end
end
end