|  | 
|  | 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