96 lines
2.5 KiB
Elixir
96 lines
2.5 KiB
Elixir
defmodule Exdns.HttpRouterTest do
|
|
use ExUnit.Case, async: false
|
|
import Plug.Conn
|
|
import Plug.Test
|
|
|
|
alias Exdns.HttpRouter
|
|
alias Exdns.ZoneServer
|
|
|
|
setup do
|
|
unless Process.whereis(ZoneServer) do
|
|
start_supervised!({ZoneServer, []})
|
|
end
|
|
|
|
tmp_dir =
|
|
Path.join(System.tmp_dir!(), "exdns_http_zones_#{System.unique_integer([:positive])}")
|
|
|
|
Application.put_env(:exdns, :zones_dir, tmp_dir)
|
|
on_exit(fn -> File.rm_rf(tmp_dir) end)
|
|
|
|
:ok
|
|
end
|
|
|
|
test "rejects unauthorized requests" do
|
|
conn = conn(:get, "/zones")
|
|
conn = HttpRouter.call(conn, auth_token: "secret")
|
|
assert conn.status == 401
|
|
end
|
|
|
|
test "creates and fetches zone with valid token" do
|
|
body =
|
|
Jason.encode!(%{
|
|
"records" => [
|
|
%{"type" => "A", "rdata" => %{"address" => "1.2.3.4"}}
|
|
]
|
|
})
|
|
|
|
conn =
|
|
conn(:post, "/zones/example.com", body)
|
|
|> put_req_header("content-type", "application/json")
|
|
|> put_req_header("authorization", "Bearer secret")
|
|
|
|
conn = HttpRouter.call(conn, auth_token: "secret")
|
|
assert conn.status == 201
|
|
|
|
conn =
|
|
conn(:get, "/zones/example.com")
|
|
|> put_req_header("authorization", "Bearer secret")
|
|
|
|
conn = HttpRouter.call(conn, auth_token: "secret")
|
|
assert conn.status == 200
|
|
|
|
{:ok, data} = Jason.decode(conn.resp_body)
|
|
assert %{"records" => [_ | _]} = data
|
|
|
|
ZoneServer.delete(["example", "com"])
|
|
end
|
|
|
|
test "deletes records from zone" do
|
|
body =
|
|
Jason.encode!(%{
|
|
"records" => [
|
|
%{"type" => "A", "rdata" => %{"address" => "1.2.3.4"}}
|
|
]
|
|
})
|
|
|
|
conn =
|
|
conn(:post, "/zones/example.com", body)
|
|
|> put_req_header("content-type", "application/json")
|
|
|> put_req_header("authorization", "Bearer secret")
|
|
|
|
conn = HttpRouter.call(conn, auth_token: "secret")
|
|
assert conn.status == 201
|
|
|
|
conn =
|
|
conn(:delete, "/zones/example.com/records", body)
|
|
|> put_req_header("content-type", "application/json")
|
|
|> put_req_header("authorization", "Bearer secret")
|
|
|
|
conn = HttpRouter.call(conn, auth_token: "secret")
|
|
assert conn.status == 200
|
|
|
|
conn =
|
|
conn(:get, "/zones/example.com")
|
|
|> put_req_header("authorization", "Bearer secret")
|
|
|
|
conn = HttpRouter.call(conn, auth_token: "secret")
|
|
{:ok, data} = Jason.decode(conn.resp_body)
|
|
|
|
assert Enum.all?(data["records"], fn record ->
|
|
record["type"] != "a" or record["rdata"]["address"] != "1.2.3.4"
|
|
end)
|
|
|
|
ZoneServer.delete(["example", "com"])
|
|
end
|
|
end
|