feat(model): нейтральная модель Record с нормализацией и Equal

This commit is contained in:
2026-07-03 12:22:38 +07:00
parent c738d05241
commit dd91c93bda
4 changed files with 171 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
package model
import "testing"
func TestManaged(t *testing.T) {
managed := []RecordType{A, AAAA, CNAME, MX, TXT, SRV}
for _, rt := range managed {
if !rt.Managed() {
t.Errorf("%s should be managed", rt)
}
}
for _, rt := range []RecordType{NS, SOA} {
if rt.Managed() {
t.Errorf("%s should be read-only", rt)
}
}
}
func TestKeyNormalizesName(t *testing.T) {
r1 := Record{Type: A, Name: "www.Example.com"}
r2 := Record{Type: A, Name: "www.example.com."}
if r1.Key() != r2.Key() {
t.Fatalf("keys differ: %q vs %q", r1.Key(), r2.Key())
}
if r1.Key() != "A www.example.com." {
t.Fatalf("unexpected key %q", r1.Key())
}
}
func TestEqualMXPriorityAndOrder(t *testing.T) {
a := Record{Type: MX, Name: "example.com.", TTL: 3600, Values: []string{"10 mx1.example.com.", "20 mx2.Example.com."}}
b := Record{Type: MX, Name: "example.com.", TTL: 3600, Values: []string{"20 mx2.example.com.", "10 mx1.example.com."}}
if !a.Equal(b) {
t.Fatal("MX records equal regardless of order and target case")
}
c := Record{Type: MX, Name: "example.com.", TTL: 3600, Values: []string{"30 mx1.example.com."}}
if a.Equal(c) {
t.Fatal("different priority must not be equal")
}
}
func TestEqualTXTCaseSensitive(t *testing.T) {
a := Record{Type: TXT, Name: "example.com.", TTL: 60, Values: []string{"v=DKIM1; p=AbC"}}
b := Record{Type: TXT, Name: "example.com.", TTL: 60, Values: []string{"v=DKIM1; p=abc"}}
if a.Equal(b) {
t.Fatal("TXT is case-sensitive")
}
}
func TestEqualTTLMatters(t *testing.T) {
a := Record{Type: A, Name: "example.com.", TTL: 300, Values: []string{"1.2.3.4"}}
b := Record{Type: A, Name: "example.com.", TTL: 600, Values: []string{"1.2.3.4"}}
if a.Equal(b) {
t.Fatal("different TTL must not be equal")
}
}