fp-lab4/test/http/router_test.exs
2026-01-13 18:26:26 +03:00

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