The header says "also in VIEW" for every zone of the same name in another view, linked or not, in the view's colour, keeping the open tab where the other zone has it. The zone API gains in_views. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
2.5 KiB
Go
52 lines
2.5 KiB
Go
package server
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// The DNSSEC page says where each zone's DS record goes.
|
|
func TestDNSSECWhereDSGoes(t *testing.T) {
|
|
e := newAPIEnv(t)
|
|
e.do("POST", "/views", e.token, map[string]any{"name": "internal", "match_clients": []string{"10.0.0.0/8"}}, 201)
|
|
e.do("POST", "/views", e.token, map[string]any{"name": "external"}, 201)
|
|
zone := func(name, view string) {
|
|
e.do("POST", "/zones", e.token, map[string]any{"name": name, "view": view, "nameservers": []string{"ns1.example.net."}}, 201)
|
|
}
|
|
zone("adbraun.lol", "external")
|
|
zone("lab.adbraun.lol", "external")
|
|
zone("dev.adbraun.lol", "internal") // its parent only in external
|
|
zone("sub.example.com", "external")
|
|
zone("10.0.10.0/24", "internal")
|
|
zone("home.lan", "internal")
|
|
for _, c := range []struct{ zone, at, place, parent string }{
|
|
{"adbraun.lol?view=external", "registrar", "at your registrar", ""},
|
|
{"lab.adbraun.lol?view=external", "parent_zone", "in the parent zone adbraun.lol", "adbraun.lol."},
|
|
{"dev.adbraun.lol?view=internal", "parent_zone", "in the parent zone adbraun.lol (view external)", "adbraun.lol."},
|
|
{"sub.example.com?view=external", "parent", "in its parent zone (most likely example.com)", ""},
|
|
{"10.0.10.in-addr.arpa?view=internal", "reverse", "your ISP", ""},
|
|
{"home.lan?view=internal", "none", "", ""},
|
|
} {
|
|
r := e.do("GET", "/zones/"+strings.Replace(c.zone, "?", "/dnssec?", 1), e.token, nil, 200)
|
|
place, _ := r["ds_place"].(string)
|
|
parent, _ := r["parent_zone"].(string)
|
|
if r["ds_at"] != c.at || !strings.Contains(place, c.place) || (c.place == "" && place != "") || parent != c.parent {
|
|
t.Errorf("%s: ds_at %v, ds_place %q, parent_zone %q", c.zone, r["ds_at"], place, parent)
|
|
}
|
|
}
|
|
}
|
|
|
|
// A zone lists the zones of its name in the other views.
|
|
func TestZoneInViews(t *testing.T) {
|
|
e := newAPIEnv(t)
|
|
e.do("POST", "/views", e.token, map[string]any{"name": "internal", "match_clients": []string{"10.0.0.0/8"}}, 201)
|
|
e.do("POST", "/views", e.token, map[string]any{"name": "external"}, 201)
|
|
e.do("POST", "/zones", e.token, map[string]any{"name": "adbraun.lol", "view": "internal", "nameservers": []string{"ns1.example.net."}}, 201)
|
|
e.do("POST", "/zones", e.token, map[string]any{"name": "adbraun.lol", "view": "external", "nameservers": []string{"ns1.example.net."}}, 201)
|
|
z := e.do("GET", "/zones/adbraun.lol?view=internal", e.token, nil, 200)
|
|
in, _ := z["in_views"].([]any)
|
|
if len(in) != 1 || in[0].(map[string]any)["view"] != "external" || in[0].(map[string]any)["type"] != "primary" {
|
|
t.Errorf("in_views = %v", z["in_views"])
|
|
}
|
|
}
|