storing fix

This commit is contained in:
Graham McIntire 2025-06-16 13:11:58 -05:00
parent 8cd596f3a4
commit 3b8d1f2cff
No known key found for this signature in database
7 changed files with 63 additions and 39 deletions

View file

@ -24,13 +24,16 @@ config :aprs, AprsWeb.Endpoint,
secret_key_base: "IV9+ENaw9i8xjReRk4sULRvRgsmFVTGQwQGGrf4G+Q/SFMeHBCNWRlPXQ2YvT36R",
server: false
# Disable Oban during tests to prevent background job execution
config :aprs, Oban, testing: :inline
# Disable APRS-IS external connections in test environment
config :aprs,
aprs_is_server: nil,
aprs_is_port: nil,
aprs_is_default_filter: nil,
aprs_is_login_id: nil,
aprs_is_password: nil,
aprs_is_server: "mock.aprs.test",
aprs_is_port: 14_580,
aprs_is_default_filter: "r/33/-96/100",
aprs_is_login_id: "TEST",
aprs_is_password: "-1",
disable_aprs_connection: true
# Disable automatic migrations during tests

View file

@ -308,7 +308,9 @@ defmodule Aprs.Is do
# Store in database through the Packets context
case Aprs.Packets.store_packet(attrs) do
# {:ok, packet} ->
{:ok, _packet} ->
# Packet stored successfully
:ok
{:error, changeset} ->
Logger.error(

View file

@ -2,7 +2,8 @@ defmodule Aprs.ConnectionPreventionTest do
@moduledoc """
Simple test to verify APRS connections are prevented in test environment.
"""
use ExUnit.Case, async: true
use ExUnit.Case, async: false
use Aprs.DataCase
test "APRS connection is disabled in test environment" do
# Verify we're in test environment

View file

@ -2,7 +2,8 @@ defmodule Aprs.IsTest do
@moduledoc """
Tests to ensure APRS-IS external connections are properly blocked in test environment.
"""
use ExUnit.Case, async: true
use ExUnit.Case, async: false
use Aprs.DataCase
require Logger
@ -27,7 +28,7 @@ defmodule Aprs.IsTest do
# Should return disconnected status without attempting external connection
assert status.connected == false
assert status.server != nil
assert status.port != nil
assert status.port == 14_580
assert status.connected_at == nil
assert status.uptime_seconds == 0
end
@ -56,10 +57,21 @@ defmodule Aprs.IsTest do
# Start the mock if not already running
case GenServer.start_link(AprsIsMock, [], name: AprsIsMock) do
{:ok, pid} ->
on_exit(fn -> GenServer.stop(pid, :normal) end)
on_exit(fn ->
if Process.alive?(pid) do
GenServer.stop(pid, :normal)
end
end)
{:ok, mock_pid: pid}
{:error, {:already_started, pid}} ->
on_exit(fn ->
if Process.alive?(pid) do
GenServer.stop(pid, :normal)
end
end)
{:ok, mock_pid: pid}
end
end

View file

@ -9,17 +9,16 @@ defmodule AprsWeb.Integration.AprsStatusTest do
describe "APRS status endpoints without external connections" do
test "status JSON endpoint returns proper response without APRS connection", %{conn: conn} do
conn = get(conn, "/api/status")
conn = get(conn, "/status.json")
assert response = json_response(conn, 200)
# Should have basic structure even without APRS connection
assert Map.has_key?(response, "aprs_status")
assert Map.has_key?(response, "version")
assert Map.has_key?(response, "uptime")
assert Map.has_key?(response, "aprs_is")
assert Map.has_key?(response, "application")
# APRS status should indicate disconnected state
aprs_status = response["aprs_status"]
aprs_status = response["aprs_is"]
assert aprs_status["connected"] == false
assert is_binary(aprs_status["server"])
assert is_integer(aprs_status["port"])
@ -41,15 +40,14 @@ defmodule AprsWeb.Integration.AprsStatusTest do
{:ok, view, html} = live(conn, "/")
# Page should load successfully
assert html =~ "APRS Map"
assert has_element?(view, "#aprs-map")
# Should not show connected status
refute html =~ "Connected to APRS"
# Should handle disconnected state gracefully
# Basic content should be present
assert html =~ "APRS"
# Basic content should be present - check for map div
assert html =~ "aprs-map"
end
test "status live view works without APRS connection", %{conn: conn} do
@ -75,20 +73,19 @@ defmodule AprsWeb.Integration.AprsStatusTest do
end
test "packet data endpoints handle no external connection gracefully", %{conn: conn} do
# Test any packet-related endpoints
case get(conn, "/api/packets") do
%{status: 200} = conn ->
response = json_response(conn, 200)
# Should return empty or default data structure
assert is_list(response) or is_map(response)
# Test packets live view instead of API endpoint
case live(conn, "/packets") do
{:ok, _view, html} ->
# Should load packets page successfully
assert html =~ "Packets"
%{status: 404} ->
# Endpoint might not exist, which is fine
{:error, {:redirect, %{to: "/"}}} ->
# Redirect is acceptable
:ok
%{status: status} when status in [500, 503] ->
# Should not crash with server errors
flunk("Packet endpoint crashed without APRS connection")
{:error, _} ->
# Other errors might be acceptable in test environment
:ok
end
end
end
@ -139,7 +136,7 @@ defmodule AprsWeb.Integration.AprsStatusTest do
Process.sleep(100)
# View should remain stable (no crashes from missing APRS connection)
assert render(view) =~ "APRS Map"
assert has_element?(view, "#aprs-map")
end
end
@ -152,7 +149,7 @@ defmodule AprsWeb.Integration.AprsStatusTest do
assert html =~ "APRS"
# API status
conn = get(conn, "/api/status")
conn = get(conn, "/status.json")
assert json_response(conn, 200)
# Any authentication pages should still work

View file

@ -122,17 +122,26 @@ defmodule AprsIsMock do
end
def handle_call(:get_status, _from, state) do
mock_status = %{
state
| connected: false,
uptime_seconds: 0
}
uptime_seconds =
if state.connected_at do
DateTime.diff(DateTime.utc_now(), state.connected_at, :second)
else
0
end
mock_status =
Map.put(state, :uptime_seconds, uptime_seconds)
{:reply, mock_status, state}
end
def handle_call({:set_connection_state, connected}, _from, state) do
new_state = %{state | connected: connected, connected_at: if(connected, do: DateTime.utc_now())}
new_state = %{
state
| connected: connected,
connected_at: if(connected, do: DateTime.utc_now())
}
{:reply, :ok, new_state}
end

View file

@ -3,8 +3,8 @@ Ecto.Adapters.SQL.Sandbox.mode(Aprs.Repo, :manual)
# Ensure no external APRS connections during tests
Application.put_env(:aprs, :disable_aprs_connection, true)
Application.put_env(:aprs, :aprs_is_server, nil)
Application.put_env(:aprs, :aprs_is_port, nil)
Application.put_env(:aprs, :aprs_is_server, "mock.aprs.test")
Application.put_env(:aprs, :aprs_is_port, 14_580)
Application.put_env(:aprs, :aprs_is_login_id, "TEST")
Application.put_env(:aprs, :aprs_is_password, "-1")
Application.put_env(:aprs, :aprs_is_default_filter, "r/0/0/1")