98 lines
2.6 KiB
Elixir
98 lines
2.6 KiB
Elixir
defmodule Parrhesia.Web.RouterTest do
|
|
use ExUnit.Case, async: false
|
|
|
|
import Plug.Conn
|
|
import Plug.Test
|
|
|
|
alias Ecto.Adapters.SQL.Sandbox
|
|
alias Parrhesia.Protocol.EventValidator
|
|
alias Parrhesia.Repo
|
|
alias Parrhesia.Web.Router
|
|
|
|
setup do
|
|
:ok = Sandbox.checkout(Repo)
|
|
:ok
|
|
end
|
|
|
|
test "GET /health returns ok" do
|
|
conn = conn(:get, "/health") |> Router.call([])
|
|
|
|
assert conn.status == 200
|
|
assert conn.resp_body == "ok"
|
|
end
|
|
|
|
test "GET /ready returns ready" do
|
|
conn = conn(:get, "/ready") |> Router.call([])
|
|
|
|
assert conn.status == 200
|
|
assert conn.resp_body == "ready"
|
|
end
|
|
|
|
test "GET /relay with nostr accept header returns NIP-11 document" do
|
|
conn =
|
|
conn(:get, "/relay")
|
|
|> put_req_header("accept", "application/nostr+json")
|
|
|> Router.call([])
|
|
|
|
assert conn.status == 200
|
|
assert get_resp_header(conn, "content-type") == ["application/nostr+json; charset=utf-8"]
|
|
|
|
body = JSON.decode!(conn.resp_body)
|
|
|
|
assert body["name"] == "Parrhesia"
|
|
assert 11 in body["supported_nips"]
|
|
end
|
|
|
|
test "GET /metrics returns prometheus payload" do
|
|
conn = conn(:get, "/metrics") |> Router.call([])
|
|
|
|
assert conn.status == 200
|
|
assert get_resp_header(conn, "content-type") == ["text/plain; charset=utf-8"]
|
|
end
|
|
|
|
test "POST /management requires authorization" do
|
|
conn =
|
|
conn(:post, "/management", JSON.encode!(%{"method" => "ping", "params" => %{}}))
|
|
|> put_req_header("content-type", "application/json")
|
|
|> Router.call([])
|
|
|
|
assert conn.status == 401
|
|
assert JSON.decode!(conn.resp_body) == %{"ok" => false, "error" => "auth-required"}
|
|
end
|
|
|
|
test "POST /management accepts valid NIP-98 header" do
|
|
management_url = "http://www.example.com/management"
|
|
auth_event = nip98_event("POST", management_url)
|
|
|
|
authorization = "Nostr " <> Base.encode64(JSON.encode!(auth_event))
|
|
|
|
conn =
|
|
conn(:post, "/management", JSON.encode!(%{"method" => "ping", "params" => %{}}))
|
|
|> put_req_header("content-type", "application/json")
|
|
|> put_req_header("authorization", authorization)
|
|
|> Router.call([])
|
|
|
|
assert conn.status == 200
|
|
|
|
assert JSON.decode!(conn.resp_body) == %{
|
|
"ok" => true,
|
|
"result" => %{"status" => "ok"}
|
|
}
|
|
end
|
|
|
|
defp nip98_event(method, url) do
|
|
now = System.system_time(:second)
|
|
|
|
base = %{
|
|
"pubkey" => String.duplicate("a", 64),
|
|
"created_at" => now,
|
|
"kind" => 27_235,
|
|
"tags" => [["method", method], ["u", url]],
|
|
"content" => "",
|
|
"sig" => String.duplicate("b", 128)
|
|
}
|
|
|
|
Map.put(base, "id", EventValidator.compute_id(base))
|
|
end
|
|
end
|