github.com/coryb/figtree@v1.0.2-0.20230811213450-d30f28e27093/marshal_test.go (about)

     1  package figtree
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"os"
     7  	"testing"
     8  
     9  	yaml "gopkg.in/yaml.v3"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func yamlMarshal(opts interface{}) (string, error) {
    16  	buf := &bytes.Buffer{}
    17  	enc := yaml.NewEncoder(buf)
    18  	enc.SetIndent(2)
    19  	err := enc.Encode(opts)
    20  	return buf.String(), err
    21  }
    22  
    23  func TestOptionsMarshalYAML(t *testing.T) {
    24  	opts := TestOptions{}
    25  	require.NoError(t, os.Chdir("d1/d2/d3"))
    26  	t.Cleanup(func() {
    27  		_ = os.Chdir("../../..")
    28  	})
    29  	fig := newFigTreeFromEnv()
    30  	err := fig.LoadAllConfigs("figtree.yml", &opts)
    31  	assert.NoError(t, err)
    32  
    33  	StringifyValue = true
    34  	defer func() {
    35  		StringifyValue = false
    36  	}()
    37  	got, err := yamlMarshal(&opts)
    38  	assert.NoError(t, err)
    39  
    40  	expected := `str1: d3str1val1
    41  arr1:
    42    - d3arr1val1
    43    - d3arr1val2
    44    - dupval
    45    - "211"
    46    - d2arr1val2
    47    - d1arr1val1
    48    - d1arr1val2
    49  map1:
    50    dup: d3dupval
    51    key0: d1map1val0
    52    key1: "211"
    53    key2: d3map1val2
    54    key3: d3map1val3
    55  int1: 333
    56  float1: 3.33
    57  bool1: true
    58  `
    59  	assert.Equal(t, expected, got)
    60  }
    61  
    62  func TestOptionsMarshalJSON(t *testing.T) {
    63  	opts := TestOptions{}
    64  	require.NoError(t, os.Chdir("d1/d2/d3"))
    65  	t.Cleanup(func() {
    66  		_ = os.Chdir("../../..")
    67  	})
    68  	fig := newFigTreeFromEnv()
    69  	err := fig.LoadAllConfigs("figtree.yml", &opts)
    70  	assert.NoError(t, err)
    71  
    72  	StringifyValue = true
    73  	defer func() {
    74  		StringifyValue = false
    75  	}()
    76  	got, err := json.Marshal(&opts)
    77  	assert.NoError(t, err)
    78  	// note that "leave-empty" is serialized even though "omitempty" tag is set
    79  	// this is because json always assumes structs are not empty and there
    80  	// is no interface to override this behavior
    81  	expected := `{"str1":"d3str1val1","leave-empty":"","arr1":["d3arr1val1","d3arr1val2","dupval","211","d2arr1val2","d1arr1val1","d1arr1val2"],"map1":{"dup":"d3dupval","key0":"d1map1val0","key1":"211","key2":"d3map1val2","key3":"d3map1val3"},"int1":333,"float1":3.33,"bool1":true}`
    82  	assert.Equal(t, expected, string(got))
    83  }