Scert/backend/internal/domain/domain_test.go
xuans 73511d6fcb 统一多级域名泛域名生成与预览
集中处理泛域名识别、生成、编辑回显和多级子域名预览,补充前后端测试覆盖。
2026-10-16 02:41:16 +08:00

107 lines
3.8 KiB
Go

package domain
import "testing"
func TestNewDomainTypes(t *testing.T) {
tests := []struct {
name string
domainName string
certificateType CertificateType
wantError bool
}{
{name: "单域名", domainName: "Example.COM", certificateType: CertificateSingle},
{name: "泛域名", domainName: "*.example.com", certificateType: CertificateWildcard},
{name: "泛域名缺少前缀", domainName: "example.com", certificateType: CertificateWildcard, wantError: true},
{name: "单域名使用泛域名", domainName: "*.example.com", certificateType: CertificateSingle, wantError: true},
{name: "非法证书类型", domainName: "example.com", certificateType: CertificateType("invalid"), wantError: true},
}
for _, item := range tests {
t.Run(item.name, func(t *testing.T) {
result, err := NewDomain(item.domainName, item.certificateType, nil)
if item.wantError {
if err == nil {
t.Fatal("预期返回错误,实际未返回")
}
return
}
if err != nil {
t.Fatalf("创建域名失败:%v", err)
}
if result.Name == "" || len(result.SANs) != 1 || result.SANs[0] != result.Name {
t.Fatalf("域名规范化结果不正确:%+v", result)
}
if !result.AutoRenew || result.ACMEEnvironment != ACMEEnvironmentStaging {
t.Fatalf("默认域名选项不正确:%+v", result)
}
})
}
}
func TestNewDomainSANIncludesPrimaryAndDeduplicates(t *testing.T) {
result, err := NewDomain("Example.com", CertificateSAN, []string{"www.example.com", "EXAMPLE.COM", "www.example.com"})
if err != nil {
t.Fatalf("创建 SAN 域名失败:%v", err)
}
if len(result.SANs) != 2 {
t.Fatalf("SAN 去重结果不正确:%v", result.SANs)
}
if result.SANs[0] != "example.com" || result.SANs[1] != "www.example.com" {
t.Fatalf("SAN 未自动包含主域名或顺序异常:%v", result.SANs)
}
}
func TestNewDomainSANValidation(t *testing.T) {
if _, err := NewDomain("example.com", CertificateSAN, []string{"example.com"}); err == nil {
t.Fatal("仅包含主域名的 SAN 配置未被拒绝")
}
if _, err := NewDomain("example.com", CertificateSAN, []string{"bad_domain"}); err == nil {
t.Fatal("非法 SAN 域名未被拒绝")
}
}
func TestNewDomainSANAllowsWildcardIdentifier(t *testing.T) {
result, err := NewDomain("x.x.x.com", CertificateSAN, []string{"*.x.x.x.com"})
if err != nil {
t.Fatalf("多级域名与对应泛域名的 SAN 配置不应失败:%v", err)
}
if len(result.SANs) != 2 || result.SANs[0] != "x.x.x.com" || result.SANs[1] != "*.x.x.x.com" {
t.Fatalf("SAN 域名顺序或内容不正确:%v", result.SANs)
}
}
func TestNewDomainOptionsValidation(t *testing.T) {
item, err := NewDomainWithOptions("example.com", CertificateSingle, nil, false, ACMEEnvironmentProduction, "cloudflare")
if err != nil {
t.Fatalf("带选项创建域名失败:%v", err)
}
if item.AutoRenew || item.ACMEEnvironment != ACMEEnvironmentProduction || item.DNSProvider != "cloudflare" {
t.Fatalf("域名选项保存不正确:%+v", item)
}
if _, err := NewDomainWithOptions("example.com", CertificateSingle, nil, true, "invalid", ""); err == nil {
t.Fatal("非法 ACME 环境未被拒绝")
}
}
func TestWildcardNamePreservesMultiLevelDomain(t *testing.T) {
for _, item := range []struct {
input string
want string
}{
{input: "x.x.com", want: "*.x.x.com"},
{input: " X.X.X.COM ", want: "*.x.x.x.com"},
} {
got, err := WildcardName(item.input)
if err != nil {
t.Fatalf("WildcardName(%q) failed: %v", item.input, err)
}
if got != item.want {
t.Fatalf("WildcardName(%q) = %q, want %q", item.input, got, item.want)
}
}
for _, input := range []string{"*.x.x.com", "bad_domain"} {
if _, err := WildcardName(input); err == nil {
t.Fatalf("WildcardName(%q) should reject invalid base domain", input)
}
}
}