diff --git a/lib/aprsme/packets.ex b/lib/aprsme/packets.ex index 0460046..39acea8 100644 --- a/lib/aprsme/packets.ex +++ b/lib/aprsme/packets.ex @@ -31,6 +31,16 @@ defmodule Aprsme.Packets do {:ok, packet} <- insert_packet(packet_attrs, packet_data) do {:ok, packet} else + {:error, {:validation_error, message}} -> + Logger.error("Failed to store packet for #{inspect(packet_data[:sender])}: #{message}") + store_bad_packet(packet_data, %{message: message, type: "ValidationError"}) + {:error, :validation_error} + + {:error, {:storage_exception, exception}} -> + Logger.error("Storage exception for #{inspect(packet_data[:sender])}: #{inspect(exception)}") + store_bad_packet(packet_data, %{message: inspect(exception), type: "StorageException"}) + {:error, :storage_exception} + {:error, reason} = error -> Logger.error("Failed to store packet for #{inspect(packet_data[:sender])}: #{inspect(reason)}") store_bad_packet(packet_data, reason) @@ -211,7 +221,7 @@ defmodule Aprsme.Packets do defp normalize_ssid(%{ssid: ssid} = attrs), do: Map.put(attrs, :ssid, to_string(ssid)) defp normalize_ssid(attrs), do: attrs - defp insert_packet(attrs, packet_data) do + defp insert_packet(attrs, _packet_data) do # Ensure data_extended is properly sanitized before insertion attrs = if attrs[:data_extended] do @@ -253,9 +263,11 @@ defmodule Aprsme.Packets do error_message = Enum.map_join(changeset.errors, ", ", fn {field, {msg, _}} -> "#{field}: #{msg}" end) - store_bad_packet(packet_data, %{message: error_message, type: "ValidationError"}) - {:error, :validation_error} + {:error, {:validation_error, error_message}} end + rescue + exception -> + {:error, {:storage_exception, exception}} end @doc """ diff --git a/test/aprsme_web/integration/aprs_status_test.exs b/test/aprsme_web/integration/aprs_status_test.exs index 7ae3df4..5111d21 100644 --- a/test/aprsme_web/integration/aprs_status_test.exs +++ b/test/aprsme_web/integration/aprs_status_test.exs @@ -156,7 +156,7 @@ defmodule AprsmeWeb.Integration.AprsStatusTest do # Verify various endpoints don't crash when APRS.Is is not available # Home page - assert {:ok, _view, html} = live(conn, "/") + assert {:ok, _view, html} = live_with_warn(conn, "/") assert html =~ "APRS" # API status @@ -178,7 +178,7 @@ defmodule AprsmeWeb.Integration.AprsStatusTest do assert SQL.query!(Aprsme.Repo, "SELECT 1", []) # Web interface should load - {:ok, _view, html} = live(conn, "/") + {:ok, _view, html} = live_with_warn(conn, "/") assert html =~ "APRS" # This confirms the app can function without external APRS data diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index b8a28d4..a3dba34 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -35,6 +35,11 @@ defmodule AprsmeWeb.ConnCase do # Import conveniences for testing with connections # The default import for Repo + + # Helper for LiveView tests that may have duplicate IDs + def live_with_warn(conn, path) do + Phoenix.LiveViewTest.live(conn, path, on_error: :warn) + end end end