54 lines
1.4 KiB
Elixir
54 lines
1.4 KiB
Elixir
defmodule Exdns.HttpCodecTest do
|
|
use ExUnit.Case, async: true
|
|
|
|
alias Exdns.DnsPacket.ResourceRecord
|
|
alias Exdns.DnsPacket.RRData.Types
|
|
alias Exdns.HttpCodec
|
|
|
|
test "decode_records uses zone name when record name is missing" do
|
|
zone = ["example", "com"]
|
|
|
|
payload = %{
|
|
"records" => [
|
|
%{"type" => "A", "rdata" => %{"address" => "1.2.3.4"}}
|
|
]
|
|
}
|
|
|
|
assert {:ok, [rr]} = HttpCodec.decode_records(payload, zone)
|
|
assert rr.name == zone
|
|
assert rr.rdata == %Types.A{address: {1, 2, 3, 4}}
|
|
end
|
|
|
|
test "decode_records handles @ and *" do
|
|
zone = ["example", "com"]
|
|
|
|
payload = %{
|
|
"records" => [
|
|
%{"name" => "@", "type" => "A", "rdata" => %{"address" => "1.2.3.4"}},
|
|
%{"name" => "*", "type" => "A", "rdata" => %{"address" => "5.6.7.8"}}
|
|
]
|
|
}
|
|
|
|
assert {:ok, records} = HttpCodec.decode_records(payload, zone)
|
|
assert Enum.at(records, 0).name == zone
|
|
assert Enum.at(records, 1).name == ["*" | zone]
|
|
end
|
|
|
|
test "encode_records returns string names" do
|
|
records = [
|
|
%ResourceRecord{
|
|
name: ["www", "example", "com"],
|
|
type: :txt,
|
|
class: 1,
|
|
ttl: 0,
|
|
rdata: %Types.TXT{strings: ["hello"]}
|
|
}
|
|
]
|
|
|
|
[encoded] = HttpCodec.encode_records(records)
|
|
assert encoded["name"] == "www.example.com"
|
|
assert encoded["type"] == "txt"
|
|
assert encoded["rdata"]["strings"] == ["hello"]
|
|
end
|
|
end
|