Skip to content

Commit b66719e

Browse files
committed
test(config): add provider config tests
Signed-off-by: Marc Nuri <[email protected]>
1 parent 86628bb commit b66719e

File tree

2 files changed

+173
-12
lines changed

2 files changed

+173
-12
lines changed

pkg/config/config_test.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,25 @@ import (
1111
"github.com/stretchr/testify/suite"
1212
)
1313

14-
type ConfigSuite struct {
14+
type BaseConfigSuite struct {
1515
suite.Suite
1616
}
1717

18+
func (s *BaseConfigSuite) writeConfig(content string) string {
19+
s.T().Helper()
20+
tempDir := s.T().TempDir()
21+
path := filepath.Join(tempDir, "config.toml")
22+
err := os.WriteFile(path, []byte(content), 0644)
23+
if err != nil {
24+
s.T().Fatalf("Failed to write config file %s: %v", path, err)
25+
}
26+
return path
27+
}
28+
29+
type ConfigSuite struct {
30+
BaseConfigSuite
31+
}
32+
1833
func (s *ConfigSuite) TestReadConfigMissingFile() {
1934
config, err := Read("non-existent-config.toml")
2035
s.Run("returns error for missing file", func() {
@@ -159,17 +174,6 @@ func (s *ConfigSuite) TestReadConfigValidPreservesDefaultsForMissingFields() {
159174
})
160175
}
161176

162-
func (s *ConfigSuite) writeConfig(content string) string {
163-
s.T().Helper()
164-
tempDir := s.T().TempDir()
165-
path := filepath.Join(tempDir, "config.toml")
166-
err := os.WriteFile(path, []byte(content), 0644)
167-
if err != nil {
168-
s.T().Fatalf("Failed to write config file %s: %v", path, err)
169-
}
170-
return path
171-
}
172-
173177
func TestConfig(t *testing.T) {
174178
suite.Run(t, new(ConfigSuite))
175179
}

pkg/config/provider_config_test.go

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package config
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/BurntSushi/toml"
8+
"github.com/stretchr/testify/suite"
9+
)
10+
11+
type ProviderConfigSuite struct {
12+
BaseConfigSuite
13+
originalProviderConfigParsers map[string]ProviderConfigParser
14+
}
15+
16+
func (s *ProviderConfigSuite) SetupTest() {
17+
s.originalProviderConfigParsers = make(map[string]ProviderConfigParser)
18+
for k, v := range providerConfigParsers {
19+
s.originalProviderConfigParsers[k] = v
20+
}
21+
}
22+
23+
func (s *ProviderConfigSuite) TearDownTest() {
24+
providerConfigParsers = make(map[string]ProviderConfigParser)
25+
for k, v := range s.originalProviderConfigParsers {
26+
providerConfigParsers[k] = v
27+
}
28+
}
29+
30+
type ProviderConfigForTest struct {
31+
BoolProp bool `toml:"bool_prop"`
32+
StrProp string `toml:"str_prop"`
33+
IntProp int `toml:"int_prop"`
34+
}
35+
36+
var _ ProviderConfig = (*ProviderConfigForTest)(nil)
37+
38+
func (p *ProviderConfigForTest) Validate() error {
39+
if p.StrProp == "force-error" {
40+
return errors.New("validation error forced by test")
41+
}
42+
return nil
43+
}
44+
45+
func providerConfigForTestParser(primitive toml.Primitive, md toml.MetaData) (ProviderConfig, error) {
46+
var providerConfigForTest ProviderConfigForTest
47+
if err := md.PrimitiveDecode(primitive, &providerConfigForTest); err != nil {
48+
return nil, err
49+
}
50+
return &providerConfigForTest, nil
51+
}
52+
53+
func (s *ProviderConfigSuite) TestRegisterProviderConfig() {
54+
s.Run("panics when registering duplicate provider config parser", func() {
55+
s.Panics(func() {
56+
RegisterProviderConfig("test", providerConfigForTestParser)
57+
RegisterProviderConfig("test", providerConfigForTestParser)
58+
}, "Expected panic when registering duplicate provider config parser")
59+
})
60+
}
61+
62+
func (s *ProviderConfigSuite) TestReadConfigValid() {
63+
RegisterProviderConfig("test", providerConfigForTestParser)
64+
validConfigPath := s.writeConfig(`
65+
cluster_provider_strategy = "test"
66+
[cluster_provider_configs.test]
67+
bool_prop = true
68+
str_prop = "a string"
69+
int_prop = 42
70+
`)
71+
72+
config, err := Read(validConfigPath)
73+
s.Run("returns no error for valid file with registered provider config", func() {
74+
s.Require().NoError(err, "Expected no error for valid file, got %v", err)
75+
})
76+
s.Run("returns config for valid file with registered provider config", func() {
77+
s.Require().NotNil(config, "Expected non-nil config for valid file")
78+
})
79+
s.Run("parses provider config correctly", func() {
80+
providerConfig, ok := config.GetProviderConfig("test")
81+
s.Require().True(ok, "Expected to find provider config for strategy 'test'")
82+
s.Require().NotNil(providerConfig, "Expected non-nil provider config for strategy 'test'")
83+
testProviderConfig, ok := providerConfig.(*ProviderConfigForTest)
84+
s.Require().True(ok, "Expected provider config to be of type *ProviderConfigForTest")
85+
s.Equal(true, testProviderConfig.BoolProp, "Expected BoolProp to be true")
86+
s.Equal("a string", testProviderConfig.StrProp, "Expected StrProp to be 'a string'")
87+
s.Equal(42, testProviderConfig.IntProp, "Expected IntProp to be 42")
88+
})
89+
}
90+
91+
func (s *ProviderConfigSuite) TestReadConfigInvalidProviderConfig() {
92+
RegisterProviderConfig("test", providerConfigForTestParser)
93+
invalidConfigPath := s.writeConfig(`
94+
cluster_provider_strategy = "test"
95+
[cluster_provider_configs.test]
96+
bool_prop = true
97+
str_prop = "force-error"
98+
int_prop = 42
99+
`)
100+
101+
config, err := Read(invalidConfigPath)
102+
s.Run("returns error for invalid provider config", func() {
103+
s.Require().NotNil(err, "Expected error for invalid provider config, got nil")
104+
s.ErrorContains(err, "validation error forced by test", "Expected validation error from provider config")
105+
})
106+
s.Run("returns nil config for invalid provider config", func() {
107+
s.Nil(config, "Expected nil config for invalid provider config")
108+
})
109+
}
110+
111+
func (s *ProviderConfigSuite) TestReadConfigUnregisteredProviderConfig() {
112+
invalidConfigPath := s.writeConfig(`
113+
cluster_provider_strategy = "unregistered"
114+
[cluster_provider_configs.unregistered]
115+
bool_prop = true
116+
str_prop = "a string"
117+
int_prop = 42
118+
`)
119+
120+
config, err := Read(invalidConfigPath)
121+
s.Run("returns no error for unregistered provider config", func() {
122+
s.Require().NoError(err, "Expected no error for unregistered provider config, got %v", err)
123+
})
124+
s.Run("returns config for unregistered provider config", func() {
125+
s.Require().NotNil(config, "Expected non-nil config for unregistered provider config")
126+
})
127+
s.Run("does not parse unregistered provider config", func() {
128+
_, ok := config.GetProviderConfig("unregistered")
129+
s.Require().False(ok, "Expected no provider config for unregistered strategy")
130+
})
131+
}
132+
133+
func (s *ProviderConfigSuite) TestReadConfigParserError() {
134+
RegisterProviderConfig("test", func(primitive toml.Primitive, md toml.MetaData) (ProviderConfig, error) {
135+
return nil, errors.New("parser error forced by test")
136+
})
137+
invalidConfigPath := s.writeConfig(`
138+
cluster_provider_strategy = "test"
139+
[cluster_provider_configs.test]
140+
bool_prop = true
141+
str_prop = "a string"
142+
int_prop = 42
143+
`)
144+
145+
config, err := Read(invalidConfigPath)
146+
s.Run("returns error for provider config parser error", func() {
147+
s.Require().NotNil(err, "Expected error for provider config parser error, got nil")
148+
s.ErrorContains(err, "parser error forced by test", "Expected parser error from provider config")
149+
})
150+
s.Run("returns nil config for provider config parser error", func() {
151+
s.Nil(config, "Expected nil config for provider config parser error")
152+
})
153+
}
154+
155+
func TestProviderConfig(t *testing.T) {
156+
suite.Run(t, new(ProviderConfigSuite))
157+
}

0 commit comments

Comments
 (0)