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  }