Skip to content

Commit 086afef

Browse files
authored
test(kubernetes): provider registry tests (#371)
Required tests prior to refactoring Provider and Manager Signed-off-by: Marc Nuri <[email protected]>
1 parent 672b8a5 commit 086afef

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package kubernetes
2+
3+
import (
4+
"testing"
5+
6+
"github.com/containers/kubernetes-mcp-server/pkg/config"
7+
"github.com/stretchr/testify/suite"
8+
)
9+
10+
type ProviderRegistryTestSuite struct {
11+
BaseProviderSuite
12+
}
13+
14+
func (s *ProviderRegistryTestSuite) TestRegisterProvider() {
15+
s.Run("With no pre-existing provider, registers the provider", func() {
16+
RegisterProvider("test-strategy", func(m *Manager, cfg *config.StaticConfig) (ManagerProvider, error) {
17+
return nil, nil
18+
})
19+
_, exists := providerFactories["test-strategy"]
20+
s.True(exists, "Provider should be registered")
21+
})
22+
s.Run("With pre-existing provider, panics", func() {
23+
RegisterProvider("test-pre-existent", func(m *Manager, cfg *config.StaticConfig) (ManagerProvider, error) {
24+
return nil, nil
25+
})
26+
s.Panics(func() {
27+
RegisterProvider("test-pre-existent", func(m *Manager, cfg *config.StaticConfig) (ManagerProvider, error) {
28+
return nil, nil
29+
})
30+
}, "Registering a provider with an existing strategy should panic")
31+
})
32+
}
33+
34+
func (s *ProviderRegistryTestSuite) TestGetRegisteredStrategies() {
35+
s.Run("With no registered providers, returns empty list", func() {
36+
providerFactories = make(map[string]ProviderFactory)
37+
strategies := GetRegisteredStrategies()
38+
s.Empty(strategies, "No strategies should be registered")
39+
})
40+
s.Run("With multiple registered providers, returns sorted list", func() {
41+
providerFactories = make(map[string]ProviderFactory)
42+
RegisterProvider("foo-strategy", func(m *Manager, cfg *config.StaticConfig) (ManagerProvider, error) {
43+
return nil, nil
44+
})
45+
RegisterProvider("bar-strategy", func(m *Manager, cfg *config.StaticConfig) (ManagerProvider, error) {
46+
return nil, nil
47+
})
48+
strategies := GetRegisteredStrategies()
49+
expected := []string{"bar-strategy", "foo-strategy"}
50+
s.Equal(expected, strategies, "Strategies should be sorted alphabetically")
51+
})
52+
}
53+
54+
func TestProviderRegistry(t *testing.T) {
55+
suite.Run(t, new(ProviderRegistryTestSuite))
56+
}

pkg/kubernetes/provider_test.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package kubernetes
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/containers/kubernetes-mcp-server/internal/test"
8+
"github.com/containers/kubernetes-mcp-server/pkg/config"
9+
"github.com/stretchr/testify/suite"
10+
"k8s.io/client-go/rest"
11+
)
12+
13+
type BaseProviderSuite struct {
14+
suite.Suite
15+
originalProviderFactories map[string]ProviderFactory
16+
}
17+
18+
func (s *BaseProviderSuite) SetupTest() {
19+
s.originalProviderFactories = make(map[string]ProviderFactory)
20+
for k, v := range providerFactories {
21+
s.originalProviderFactories[k] = v
22+
}
23+
}
24+
25+
func (s *BaseProviderSuite) TearDownTest() {
26+
providerFactories = make(map[string]ProviderFactory)
27+
for k, v := range s.originalProviderFactories {
28+
providerFactories[k] = v
29+
}
30+
}
31+
32+
type ProviderTestSuite struct {
33+
BaseProviderSuite
34+
}
35+
36+
func (s *ProviderTestSuite) TestNewManagerProviderInCluster() {
37+
originalIsInClusterConfig := InClusterConfig
38+
s.T().Cleanup(func() {
39+
InClusterConfig = originalIsInClusterConfig
40+
})
41+
InClusterConfig = func() (*rest.Config, error) {
42+
return &rest.Config{}, nil
43+
}
44+
s.Run("With no cluster_provider_strategy, returns single-cluster provider", func() {
45+
cfg := test.Must(config.ReadToml([]byte{}))
46+
provider, err := NewManagerProvider(cfg)
47+
s.Require().NoError(err, "Expected no error for in-cluster provider")
48+
s.NotNil(provider, "Expected provider instance")
49+
s.IsType(&singleClusterProvider{}, provider, "Expected singleClusterProvider type")
50+
})
51+
s.Run("With configured in-cluster cluster_provider_strategy, returns single-cluster provider", func() {
52+
cfg := test.Must(config.ReadToml([]byte(`
53+
cluster_provider_strategy = "in-cluster"
54+
`)))
55+
provider, err := NewManagerProvider(cfg)
56+
s.Require().NoError(err, "Expected no error for single-cluster strategy")
57+
s.NotNil(provider, "Expected provider instance")
58+
s.IsType(&singleClusterProvider{}, provider, "Expected singleClusterProvider type")
59+
})
60+
s.Run("With configured kubeconfig cluster_provider_strategy, returns error", func() {
61+
cfg := test.Must(config.ReadToml([]byte(`
62+
cluster_provider_strategy = "kubeconfig"
63+
`)))
64+
provider, err := NewManagerProvider(cfg)
65+
s.Require().Error(err, "Expected error for kubeconfig strategy")
66+
s.ErrorContains(err, "kubeconfig ClusterProviderStrategy is invalid for in-cluster deployments")
67+
s.Nilf(provider, "Expected no provider instance, got %v", provider)
68+
})
69+
s.Run("With configured non-existent cluster_provider_strategy, returns error", func() {
70+
cfg := test.Must(config.ReadToml([]byte(`
71+
cluster_provider_strategy = "i-do-not-exist"
72+
`)))
73+
provider, err := NewManagerProvider(cfg)
74+
s.Require().Error(err, "Expected error for non-existent strategy")
75+
s.ErrorContains(err, "no provider registered for strategy 'i-do-not-exist'")
76+
s.Nilf(provider, "Expected no provider instance, got %v", provider)
77+
})
78+
}
79+
80+
func (s *ProviderTestSuite) TestNewManagerProviderLocal() {
81+
mockServer := test.NewMockServer()
82+
s.T().Cleanup(mockServer.Close)
83+
kubeconfigPath := strings.ReplaceAll(mockServer.KubeconfigFile(s.T()), `\`, `\\`)
84+
s.Run("With no cluster_provider_strategy, returns kubeconfig provider", func() {
85+
cfg := test.Must(config.ReadToml([]byte(`
86+
kubeconfig = "` + kubeconfigPath + `"
87+
`)))
88+
provider, err := NewManagerProvider(cfg)
89+
s.Require().NoError(err, "Expected no error for kubeconfig provider")
90+
s.NotNil(provider, "Expected provider instance")
91+
s.IsType(&kubeConfigClusterProvider{}, provider, "Expected kubeConfigClusterProvider type")
92+
})
93+
s.Run("With configured kubeconfig cluster_provider_strategy, returns kubeconfig provider", func() {
94+
cfg := test.Must(config.ReadToml([]byte(`
95+
kubeconfig = "` + kubeconfigPath + `"
96+
cluster_provider_strategy = "kubeconfig"
97+
`)))
98+
provider, err := NewManagerProvider(cfg)
99+
s.Require().NoError(err, "Expected no error for kubeconfig provider")
100+
s.NotNil(provider, "Expected provider instance")
101+
s.IsType(&kubeConfigClusterProvider{}, provider, "Expected kubeConfigClusterProvider type")
102+
})
103+
s.Run("With configured in-cluster cluster_provider_strategy, returns error", func() {
104+
cfg := test.Must(config.ReadToml([]byte(`
105+
kubeconfig = "` + kubeconfigPath + `"
106+
cluster_provider_strategy = "in-cluster"
107+
`)))
108+
provider, err := NewManagerProvider(cfg)
109+
s.Require().Error(err, "Expected error for in-cluster strategy")
110+
s.ErrorContains(err, "server must be deployed in cluster for the in-cluster ClusterProviderStrategy")
111+
s.Nilf(provider, "Expected no provider instance, got %v", provider)
112+
})
113+
s.Run("With configured non-existent cluster_provider_strategy, returns error", func() {
114+
cfg := test.Must(config.ReadToml([]byte(`
115+
kubeconfig = "` + kubeconfigPath + `"
116+
cluster_provider_strategy = "i-do-not-exist"
117+
`)))
118+
provider, err := NewManagerProvider(cfg)
119+
s.Require().Error(err, "Expected error for non-existent strategy")
120+
s.ErrorContains(err, "no provider registered for strategy 'i-do-not-exist'")
121+
s.Nilf(provider, "Expected no provider instance, got %v", provider)
122+
})
123+
}
124+
125+
func TestProvider(t *testing.T) {
126+
suite.Run(t, new(ProviderTestSuite))
127+
}

0 commit comments

Comments
 (0)