59 lines
2.4 KiB
Elixir
59 lines
2.4 KiB
Elixir
defmodule ToweropsWeb.HealthControllerTest do
|
|
use ToweropsWeb.ConnCase, async: true
|
|
|
|
describe "GET /health" do
|
|
test "returns ok with database and redis connectivity check", %{conn: conn} do
|
|
conn = get(conn, ~p"/health")
|
|
|
|
response = json_response(conn, 200)
|
|
|
|
assert response["status"] == "ok"
|
|
assert response["database"] == "connected"
|
|
# Redis may be "connected" or "not_configured" depending on environment
|
|
assert response["redis"] in ["connected", "not_configured"]
|
|
assert response["version"] == "0.1.0"
|
|
|
|
assert get_resp_header(conn, "content-type") == ["application/json; charset=utf-8"]
|
|
end
|
|
end
|
|
|
|
describe "GET /health/time" do
|
|
test "returns server time from multiple sources", %{conn: conn} do
|
|
conn = get(conn, ~p"/health/time")
|
|
|
|
response = json_response(conn, 200)
|
|
|
|
# Verify all expected fields are present
|
|
assert Map.has_key?(response, "system_time")
|
|
assert Map.has_key?(response, "system_time_iso")
|
|
assert Map.has_key?(response, "os_time")
|
|
assert Map.has_key?(response, "os_time_iso")
|
|
assert Map.has_key?(response, "datetime_now")
|
|
assert Map.has_key?(response, "datetime_now_iso")
|
|
assert Map.has_key?(response, "time_sources_agree")
|
|
|
|
# Verify types
|
|
assert is_integer(response["system_time"])
|
|
assert is_binary(response["system_time_iso"])
|
|
assert is_integer(response["os_time"])
|
|
assert is_binary(response["os_time_iso"])
|
|
assert is_integer(response["datetime_now"])
|
|
assert is_binary(response["datetime_now_iso"])
|
|
assert is_boolean(response["time_sources_agree"])
|
|
|
|
# Verify ISO 8601 format
|
|
assert String.match?(response["system_time_iso"], ~r/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/)
|
|
assert String.match?(response["os_time_iso"], ~r/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/)
|
|
assert String.match?(response["datetime_now_iso"], ~r/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/)
|
|
|
|
# Verify all times are within a reasonable range (within 5 seconds of each other)
|
|
time_diff_1 = abs(response["system_time"] - response["os_time"])
|
|
time_diff_2 = abs(response["system_time"] - response["datetime_now"])
|
|
|
|
assert time_diff_1 <= 5, "system_time and os_time should be within 5 seconds"
|
|
assert time_diff_2 <= 5, "system_time and datetime_now should be within 5 seconds"
|
|
|
|
assert get_resp_header(conn, "content-type") == ["application/json; charset=utf-8"]
|
|
end
|
|
end
|
|
end
|