@@ -7,10 +7,14 @@ import (
77 "testing"
88 "time"
99
10+ "dario.cat/mergo"
1011 "github.com/stackrox/roxie/internal/deployer"
12+ "github.com/stackrox/roxie/internal/logger"
1113 "github.com/stackrox/roxie/internal/types"
14+ "github.com/stackrox/roxie/internal/xdg"
1215 "github.com/stretchr/testify/assert"
1316 "github.com/stretchr/testify/require"
17+ "gopkg.in/yaml.v3"
1418)
1519
1620func TestNewDeployCmd_Flags (t * testing.T ) {
@@ -205,3 +209,95 @@ central:
205209 })
206210 }
207211}
212+
213+ func TestApplyUserDefaults (t * testing.T ) {
214+ log := logger .New ()
215+
216+ tests := []struct {
217+ name string
218+ config deployer.Config
219+ user deployer.Config
220+ expected deployer.Config
221+ }{
222+ {
223+ name : "no config file leaves config unchanged" ,
224+ },
225+ {
226+ name : "fills empty fields from user defaults" ,
227+ config : deployer.Config {},
228+ user : deployer.Config {
229+ Roxie : deployer.RoxieConfig {Version : "4.5.0" },
230+ Operator : deployer.OperatorConfig {DeployViaOlm : true },
231+ },
232+ expected : deployer.Config {
233+ Roxie : deployer.RoxieConfig {Version : "4.5.0" },
234+ Operator : deployer.OperatorConfig {DeployViaOlm : true },
235+ },
236+ },
237+ {
238+ name : "user config overrides config defaults" ,
239+ config : deployer.Config {
240+ Roxie : deployer.RoxieConfig {
241+ Version : "4.9.2" ,
242+ },
243+ },
244+ user : deployer.Config {
245+ Roxie : deployer.RoxieConfig {
246+ Version : "4.5.0" ,
247+ },
248+ Operator : deployer.OperatorConfig {
249+ DeployViaOlm : true ,
250+ },
251+ Central : deployer.CentralConfig {
252+ Namespace : "custom-namespace" ,
253+ },
254+ },
255+ expected : deployer.Config {
256+ Roxie : deployer.RoxieConfig {
257+ Version : "4.5.0" ,
258+ },
259+ Operator : deployer.OperatorConfig {
260+ DeployViaOlm : true ,
261+ },
262+ Central : deployer.CentralConfig {
263+ Namespace : "custom-namespace" ,
264+ },
265+ },
266+ },
267+ }
268+
269+ for _ , tt := range tests {
270+ t .Run (tt .name , func (t * testing.T ) {
271+ t .Setenv ("HOME" , t .TempDir ())
272+
273+ if ! reflect .DeepEqual (tt .user , deployer.Config {}) {
274+ configPath , err := xdg .UserConfigPath ()
275+ require .NoError (t , err )
276+ require .NoError (t , os .MkdirAll (filepath .Dir (configPath ), 0o755 ))
277+ data , err := yaml .Marshal (tt .user )
278+ require .NoError (t , err )
279+ require .NoError (t , os .WriteFile (configPath , data , 0o644 ))
280+ }
281+
282+ cfg := deployer .NewConfig ()
283+ require .NoError (t , mergo .Merge (& cfg , & tt .config , mergo .WithOverride , mergo .WithoutDereference ))
284+ require .NoError (t , tryApplyUserDefaults (log , & cfg ))
285+
286+ expected := deployer .NewConfig ()
287+ require .NoError (t , mergo .Merge (& expected , & tt .expected , mergo .WithOverride , mergo .WithoutDereference ))
288+
289+ assert .True (t , reflect .DeepEqual (expected , cfg ), "expected %+v, got %+v" , expected , cfg )
290+ })
291+ }
292+
293+ t .Run ("returns error on invalid yaml" , func (t * testing.T ) {
294+ t .Setenv ("HOME" , t .TempDir ())
295+ configPath , err := xdg .UserConfigPath ()
296+ require .NoError (t , err )
297+ require .NoError (t , os .MkdirAll (filepath .Dir (configPath ), 0o755 ))
298+ require .NoError (t , os .WriteFile (configPath , []byte (`invalid: [yaml` ), 0o644 ))
299+
300+ cfg := deployer .NewConfig ()
301+ assert .Error (t , tryApplyUserDefaults (log , & cfg ))
302+ })
303+ }
0 commit comments