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