aprs.me/test/aprsme_web/controllers/page_controller_test.exs

97 lines
3.7 KiB
Elixir

defmodule AprsmeWeb.PageControllerTest do
# Mutates :aprsme, :health_status; must not run in parallel with other tests
# that read it (the HealthCheck plug, for example).
use AprsmeWeb.ConnCase, async: false
setup do
original = Application.get_env(:aprsme, :health_status)
on_exit(fn -> Application.put_env(:aprsme, :health_status, original || :healthy) end)
:ok
end
describe "health/2 controller action" do
# Call the action directly; the /health endpoint is otherwise served by
# the HealthCheck plug as text/plain.
test "returns 200 with ok status when app is healthy and DB is up" do
Application.put_env(:aprsme, :health_status, :healthy)
base = Phoenix.Controller.put_format(Phoenix.ConnTest.build_conn(), "json")
result = AprsmeWeb.PageController.health(base, %{})
assert result.status == 200
body = Jason.decode!(result.resp_body)
assert body["status"] == "ok"
assert body["database"] == "connected"
assert is_binary(body["version"])
end
test "returns 503 draining when app is draining" do
Application.put_env(:aprsme, :health_status, :draining)
base = Phoenix.Controller.put_format(Phoenix.ConnTest.build_conn(), "json")
result = AprsmeWeb.PageController.health(base, %{})
assert result.status == 503
body = Jason.decode!(result.resp_body)
assert body["status"] == "draining"
assert body["message"] =~ "draining"
end
end
describe "GET /ready" do
test "returns 200 with ready status and version", %{conn: conn} do
conn = get(conn, "/ready")
assert conn.status == 200
body = json_response(conn, 200)
assert body["status"] == "ready"
assert is_binary(body["version"])
end
end
describe "GET /sitemap.xml" do
test "returns an XML urlset with known paths", %{conn: conn} do
conn = get(conn, "/sitemap.xml")
assert conn.status == 200
xml = conn.resp_body
assert xml =~ ~s(<?xml version="1.0" encoding="UTF-8"?>)
assert xml =~ "<urlset"
assert xml =~ "/about"
assert xml =~ "/status"
end
end
describe "GET /.well-known/api-catalog" do
test "returns an RFC 9264-style linkset", %{conn: conn} do
conn = get(conn, "/.well-known/api-catalog")
assert conn.status == 200
body = Jason.decode!(conn.resp_body)
assert is_list(body["linkset"])
anchors = Enum.map(body["linkset"], & &1["anchor"])
assert Enum.any?(anchors, &String.contains?(&1, "/api/v1"))
assert Enum.any?(anchors, &String.contains?(&1, "/mobile/websocket"))
end
end
describe "GET /status.json (status_json/2)" do
test "returns application + aprs_is sections", %{conn: conn} do
conn = get(conn, "/status.json")
assert conn.status == 200
body = json_response(conn, 200)
assert Map.has_key?(body, "aprs_is")
assert Map.has_key?(body, "application")
assert is_binary(body["application"]["version"])
end
end
describe "uptime formatting (via format_uptime/1 inside status_json)" do
# The private format_uptime/1 helper has four branches based on duration.
# These test cases hit each branch by sending the status_json action
# through the controller (which calls LeaderElection.get_cluster_aprs_status
# and then formats the uptime_seconds value returned).
test "formats zero uptime as 'Not connected'" do
conn = Phoenix.ConnTest.build_conn()
# Call the action directly; the real status is "Not connected" when the
# app isn't actually running an APRS connection in the test environment.
result = AprsmeWeb.PageController.status_json(conn, %{})
body = Jason.decode!(result.resp_body)
assert is_binary(body["aprs_is"]["uptime_display"])
end
end
end