Files
ayatori/internal/database/domain/credential/target_test.go
T
panxiao81 7834cab97f
Verify / test (pull_request) Successful in 13m29s
Verify / lint (pull_request) Successful in 14m13s
Verify / database-integration (pull_request) Successful in 15m48s
refactor: 集中显式注入并归位凭据领域规则
2026-09-27 19:16:48 +00:00

53 lines
2.6 KiB
Go

package credential_test
import (
"testing"
"git.ddupan.top/panxiao81/ayatori/internal/database/domain/binding"
credential "git.ddupan.top/panxiao81/ayatori/internal/database/domain/credential"
)
const (
targetTestApplication = "sampleapp"
targetTestInstance = "test-instance"
)
func TestPreparationTarget(t *testing.T) {
for _, test := range []struct {
name string
change func(*credential.Target)
want credential.Phase
}{
{"完整绑定", func(*credential.Target) {}, credential.Pending},
{"单向绑定", func(target *credential.Target) { target.Tenant.Database = nil }, credential.Unavailable},
{"旧租户身份", func(target *credential.Target) { target.Tenant.Identity.UID = "new" }, credential.Conflict},
{"旧实例身份", func(target *credential.Target) { target.Instance.Identity.UID = "new" }, credential.Conflict},
{"资源删除", func(target *credential.Target) { target.Database.Deleting = true }, credential.Stopped},
{"申请删除", func(target *credential.Target) { target.Tenant.Deleting = true }, credential.Stopped},
{"Released", func(target *credential.Target) { target.Database.Phase = "Released" }, credential.Stopped},
{"缺少保护", func(target *credential.Target) { target.DatabaseProtected = false }, credential.Stopped},
{"实例未就绪", func(target *credential.Target) { target.Instance.Ready = false }, credential.Unavailable},
{"目标变化", func(target *credential.Target) { target.Database.LoginRole = "other" }, credential.Conflict},
} {
t.Run(test.name, func(t *testing.T) {
tenantID := binding.TenantIdentity{Namespace: "apps", Name: targetTestApplication, UID: "tenant"}
databaseID := binding.Identity{Name: binding.DynamicDatabaseName(tenantID.UID), UID: "database"}
target := credential.Target{
Database: binding.Database{Identity: databaseID, Tenant: &tenantID, Instance: targetTestInstance, InstanceUID: "instance-id", Name: targetTestApplication, LoginRole: targetTestApplication, Source: "Provision"},
Tenant: &binding.Tenant{Identity: tenantID, Database: &databaseID, Phase: binding.Bound, Request: binding.Request{Provision: &binding.ProvisionRequest{Instance: targetTestInstance}}},
Instance: &credential.Instance{Identity: binding.Identity{Name: targetTestInstance, UID: "instance-id"}, Ready: true},
DatabaseProtected: true, TenantProtected: true,
}
test.change(&target)
issue := target.Check()
if test.want == credential.Pending {
if issue != nil {
t.Fatalf("有效绑定被拒绝: %s", issue.Message)
}
} else if issue == nil || issue.Phase != test.want {
t.Fatal("领域资格判定不符")
}
})
}
}