feat: provider interface + registry — factory pattern for multi-cloud

This commit is contained in:
2026-07-28 15:59:08 +08:00
parent 984fdfdb79
commit 11dd8bf0fc
3 changed files with 230 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
package provider
import (
"context"
"testing"
)
type mockProvider struct {
name string
}
func (m *mockProvider) Name() string { return m.name }
func (m *mockProvider) DisplayName() string { return "Mock" }
func (m *mockProvider) ValidateAuth(ctx context.Context) error { return nil }
func (m *mockProvider) Server() ServerService { return nil }
func (m *mockProvider) Domain() DomainService { return nil }
func (m *mockProvider) Storage() StorageService { return nil }
func (m *mockProvider) CDN() CDNService { return nil }
func (m *mockProvider) Billing() BillingService { return nil }
func TestRegistryRegisterAndNew(t *testing.T) {
Register("mock", func(cfg ProviderConfig) (Provider, error) {
return &mockProvider{name: "mock"}, nil
})
p, err := New("mock", ProviderConfig{})
if err != nil {
t.Fatalf("New() error: %v", err)
}
if p.Name() != "mock" {
t.Errorf("Name() = %q, want %q", p.Name(), "mock")
}
}
func TestRegistryUnknown(t *testing.T) {
_, err := New("unknown", ProviderConfig{})
if err == nil {
t.Error("expected error for unknown provider")
}
}
func TestRegistryList(t *testing.T) {
Register("list-test", func(cfg ProviderConfig) (Provider, error) {
return &mockProvider{name: "list-test"}, nil
})
names := List()
found := false
for _, n := range names {
if n == "list-test" {
found = true
break
}
}
if !found {
t.Errorf("List() should contain 'list-test', got %v", names)
}
}