diff --git a/antd-elixir/lib/antd/client.ex b/antd-elixir/lib/antd/client.ex index e5e9e74..26e9023 100644 --- a/antd-elixir/lib/antd/client.ex +++ b/antd-elixir/lib/antd/client.ex @@ -73,7 +73,17 @@ defmodule Antd.Client do def health(%__MODULE__{} = client) do case do_json(client, :get, "/health", nil) do {:ok, body} -> - {:ok, %Antd.HealthStatus{ok: body["status"] == "ok", network: body["network"]}} + {:ok, + %Antd.HealthStatus{ + ok: body["status"] == "ok", + network: body["network"], + version: Map.get(body, "version", ""), + evm_network: Map.get(body, "evm_network", ""), + uptime_seconds: Map.get(body, "uptime_seconds", 0), + build_commit: Map.get(body, "build_commit", ""), + payment_token_address: Map.get(body, "payment_token_address", ""), + payment_vault_address: Map.get(body, "payment_vault_address", "") + }} {:error, _} = err -> err diff --git a/antd-elixir/lib/antd/grpc_client.ex b/antd-elixir/lib/antd/grpc_client.ex index edf481d..802614a 100644 --- a/antd-elixir/lib/antd/grpc_client.ex +++ b/antd-elixir/lib/antd/grpc_client.ex @@ -92,7 +92,17 @@ defmodule Antd.GrpcClient do case Antd.V1.HealthService.Stub.check(channel, req) do {:ok, resp} -> - {:ok, %Antd.HealthStatus{ok: resp.status == "ok", network: resp.network}} + {:ok, + %Antd.HealthStatus{ + ok: resp.status == "ok", + network: resp.network, + version: resp.version, + evm_network: resp.evm_network, + uptime_seconds: resp.uptime_seconds, + build_commit: resp.build_commit, + payment_token_address: resp.payment_token_address, + payment_vault_address: resp.payment_vault_address + }} {:error, rpc_error} -> {:error, translate_error(rpc_error)} diff --git a/antd-elixir/lib/antd/models.ex b/antd-elixir/lib/antd/models.ex index 4644ef8..949a920 100644 --- a/antd-elixir/lib/antd/models.ex +++ b/antd-elixir/lib/antd/models.ex @@ -1,12 +1,32 @@ defmodule Antd.HealthStatus do - @moduledoc "Result of a health check." + @moduledoc """ + Result of a health check. + + The diagnostic fields (`:version`, `:evm_network`, `:uptime_seconds`, + `:build_commit`, `:payment_token_address`, `:payment_vault_address`) were + added in antd 0.4.0. They default to `""` / `0` so existing struct + constructions and pre-0.4.0 daemon responses both still work. + """ @enforce_keys [:ok, :network] - defstruct [:ok, :network] + defstruct ok: nil, + network: nil, + version: "", + evm_network: "", + uptime_seconds: 0, + build_commit: "", + payment_token_address: "", + payment_vault_address: "" @type t :: %__MODULE__{ ok: boolean(), - network: String.t() + network: String.t(), + version: String.t(), + evm_network: String.t(), + uptime_seconds: non_neg_integer(), + build_commit: String.t(), + payment_token_address: String.t(), + payment_vault_address: String.t() } end diff --git a/antd-elixir/test/antd/client_test.exs b/antd-elixir/test/antd/client_test.exs index e665e70..09f16bd 100644 --- a/antd-elixir/test/antd/client_test.exs +++ b/antd-elixir/test/antd/client_test.exs @@ -11,14 +11,58 @@ defmodule Antd.ClientTest do # Health # --------------------------------------------------------------------------- - test "health/1 returns health status", %{bypass: bypass, client: client} do + test "health/1 returns health status with all diagnostic fields", + %{bypass: bypass, client: client} do Bypass.expect_once(bypass, "GET", "/health", fn conn -> conn |> Plug.Conn.put_resp_content_type("application/json") - |> Plug.Conn.resp(200, Jason.encode!(%{status: "ok", network: "local"})) + |> Plug.Conn.resp( + 200, + Jason.encode!(%{ + status: "ok", + network: "local", + version: "0.4.0", + evm_network: "local", + uptime_seconds: 42, + build_commit: "abcdef123456", + payment_token_address: "0xtoken", + payment_vault_address: "0xvault" + }) + ) end) - assert {:ok, %Antd.HealthStatus{ok: true, network: "local"}} = Antd.Client.health(client) + assert {:ok, + %Antd.HealthStatus{ + ok: true, + network: "local", + version: "0.4.0", + evm_network: "local", + uptime_seconds: 42, + build_commit: "abcdef123456", + payment_token_address: "0xtoken", + payment_vault_address: "0xvault" + }} = Antd.Client.health(client) + end + + test "health/1 defaults diagnostic fields when daemon is pre-0.4.0", + %{bypass: bypass, client: client} do + # Older daemons reply with just status + network; the struct defaults + # populate the diagnostic fields with empty / 0 instead of nil. + Bypass.expect_once(bypass, "GET", "/health", fn conn -> + conn + |> Plug.Conn.put_resp_content_type("application/json") + |> Plug.Conn.resp(200, Jason.encode!(%{status: "ok", network: "default"})) + end) + + assert {:ok, + %Antd.HealthStatus{ + ok: true, + network: "default", + version: "", + evm_network: "", + uptime_seconds: 0, + build_commit: "" + }} = Antd.Client.health(client) end # ---------------------------------------------------------------------------