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() assert xml =~ "