github.com/fluffy-bunny/viperEx@v0.0.32/surgical-update-dynamic-array_test.go (about) 1 package viperEx 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "testing" 8 9 "github.com/jinzhu/copier" 10 "github.com/spf13/viper" 11 "github.com/stretchr/testify/require" 12 ) 13 14 var ( 15 ConfigDefaultJSON = []byte(` 16 { 17 "nest": {} 18 } 19 `) 20 stemEgg = `{ 21 "name": "in-environment", 22 "weight": 0, 23 "somestrings": [ 24 "in-environment","in-environment", "in-environment" 25 ], 26 "somevalues": [{ 27 "value": "in-environment" 28 }, { 29 "value": "in-environment" 30 }] 31 }` 32 ) 33 34 type ( 35 DynamicNest struct { 36 Eggs []*Egg `json:"eggs"` 37 } 38 DynamicConfig struct { 39 Nest *DynamicNest `json:"nest"` 40 } 41 ) 42 43 func TestViperExEnvUpdate_dynamic_nest(t *testing.T) { 44 const numEggs = 3 45 var egg = &Egg{} 46 err := json.Unmarshal([]byte(stemEgg), egg) 47 require.NoError(t, err) 48 var dynamicConfig = &DynamicConfig{} 49 err = json.Unmarshal([]byte(ConfigDefaultJSON), dynamicConfig) 50 require.NoError(t, err) 51 for i := 0; i < numEggs; i++ { 52 newEgg := &Egg{} 53 copier.Copy(&newEgg, egg) 54 dynamicConfig.Nest.Eggs = append(dynamicConfig.Nest.Eggs, newEgg) 55 } 56 finalJSON, err := json.Marshal(dynamicConfig) 57 require.NoError(t, err) 58 59 myViper := viper.NewWithOptions(viper.KeyDelimiter(keyDelim)) 60 myViper.SetConfigType("json") 61 myViper.AutomaticEnv() 62 myViper.ReadConfig(bytes.NewBuffer(finalJSON)) 63 64 allSettings := myViper.AllSettings() 65 fmt.Println(PrettyJSON(allSettings)) 66 67 myViperEx, err := New(allSettings, func(ve *ViperEx) error { 68 ve.KeyDelimiter = keyDelim 69 return nil 70 }) 71 72 envs := map[string]string{ 73 "nest__eggs__0__name": "name0", 74 "nest__eggs__0__weight": "1", 75 "nest__eggs__0__somestrings__0": "name0_somestring0", 76 "nest__eggs__0__somestrings__1": "name0_somestring1", 77 "nest__eggs__0__somestrings__2": "name0_somestring2", 78 "nest__eggs__0__SomeValues__0__Value": "name0_somevalue0", 79 "nest__eggs__0__SomeValues__1__Value": "name0_somevalue1", 80 81 "nest__eggs__1__name": "name1", 82 "nest__eggs__1__weight": "2", 83 "nest__eggs__1__somestrings__0": "name1_somestring0", 84 "nest__eggs__1__somestrings__1": "name1_somestring1", 85 "nest__eggs__1__somestrings__2": "name1_somestring2", 86 "nest__eggs__1__SomeValues__0__Value": "name1_somevalue0", 87 "nest__eggs__1__SomeValues__1__Value": "name1_somevalue1", 88 89 "nest__eggs__2__name": "name2", 90 "nest__eggs__2__weight": "3", 91 "nest__eggs__2__somestrings__0": "name2_somestring0", 92 "nest__eggs__2__somestrings__1": "name2_somestring1", 93 "nest__eggs__2__somestrings__2": "name2_somestring2", 94 "nest__eggs__2__SomeValues__0__Value": "name2_somevalue0", 95 "nest__eggs__2__SomeValues__1__Value": "name2_somevalue1", 96 } 97 for k, v := range envs { 98 t.Setenv(k, v) 99 } 100 err = myViperEx.UpdateFromEnv() 101 require.NoError(t, err) 102 103 settings := &DynamicConfig{} 104 err = myViperEx.Unmarshal(&settings) 105 fmt.Println(PrettyJSON(allSettings)) 106 107 for idx, egg := range settings.Nest.Eggs { 108 require.Equal(t, fmt.Sprintf("name%d", idx), egg.Name, "egg name") 109 require.Equal(t, int32(idx+1), egg.Weight, "egg weight") 110 for ii, ss := range egg.SomeStrings { 111 require.Equal(t, fmt.Sprintf("name%d_somestring%d", idx, ii), ss, "egg somestring") 112 } 113 for ii, sv := range egg.SomeValues { 114 require.Equal(t, fmt.Sprintf("name%d_somevalue%d", idx, ii), sv.Value, "egg somevalue") 115 } 116 } 117 }