aprs.me/test/aprsme/is_test.exs

113 lines
3.6 KiB
Elixir

defmodule Aprsme.IsTest do
@moduledoc """
Tests to ensure APRS-IS external connections are properly blocked in test environment.
"""
use ExUnit.Case, async: false
use Aprsme.DataCase
describe "APRS-IS mock functionality" do
setup do
# Start the mock if not already running
case GenServer.start_link(AprsIsMock, [], name: AprsIsMock) do
{:ok, pid} ->
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
test "mock should provide status without external connections", %{mock_pid: _pid} do
status = AprsIsMock.get_status()
assert status.connected == false
assert status.server == "mock.aprs.test"
assert status.port == 14_580
assert status.login_id == "TEST"
assert is_map(status.packet_stats)
end
test "mock should handle message sending safely", %{mock_pid: _pid} do
# These should not attempt external connections
assert AprsIsMock.send_message("test message") == :ok
assert AprsIsMock.send_message("TEST", "DEST", "hello") == :ok
assert AprsIsMock.set_filter("r/0/0/1") == :ok
assert AprsIsMock.list_active_filters() == :ok
end
test "mock can simulate packet reception for testing", %{mock_pid: _pid} do
# This allows tests to simulate receiving packets without external connections
test_packet = %{
sender: "TEST-1",
destination: "APRS",
path: ["WIDE1-1", "WIDE2-1"],
data_type: :position,
latitude: 33.0,
longitude: -96.0
}
assert AprsIsMock.simulate_packet(test_packet) == :ok
end
test "mock can simulate connection state changes", %{mock_pid: _pid} do
# Simulate connected state
assert AprsIsMock.simulate_connection_state(true) == :ok
status = AprsIsMock.get_status()
assert status.connected == true
assert status.connected_at != nil
# Simulate disconnected state
assert AprsIsMock.simulate_connection_state(false) == :ok
status = AprsIsMock.get_status()
assert status.connected == false
assert status.connected_at == nil
end
end
describe "network isolation verification" do
test "no external network calls should be made during test runs" do
# This test verifies that no actual TCP connections are attempted
# We can do this by checking that :gen_tcp.connect is not called
# with real APRS server addresses
# Common APRS-IS servers that should never be contacted in tests
forbidden_servers = [
"rotate.aprs2.net",
"dallas.aprs2.net",
"seattle.aprs2.net",
"chicago.aprs2.net",
"atlanta.aprs2.net"
]
# Verify these are not in the current configuration
current_server = Application.get_env(:aprsme, :aprsme_is_server)
if current_server do
server_str = to_string(current_server)
refute Enum.any?(forbidden_servers, fn forbidden ->
String.contains?(server_str, forbidden)
end),
"Test environment should not be configured with real APRS servers"
end
end
test "test environment marker is properly set" do
# Verify we're definitely in test environment
assert Mix.env() == :test
assert Application.get_env(:aprsme, :env) == :test
end
end
end