github.com/hairyhenderson/templater@v3.5.0+incompatible/data/datasource_merge_test.go (about)

     1  package data
     2  
     3  import (
     4  	"net/url"
     5  	"testing"
     6  
     7  	"github.com/spf13/afero"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  func TestReadMerge(t *testing.T) {
    13  	jsonContent := `{"hello": "world"}`
    14  	yamlContent := "hello: earth\ngoodnight: moon\n"
    15  	arrayContent := `["hello", "world"]`
    16  
    17  	mergedContent := "goodnight: moon\nhello: world\n"
    18  
    19  	fs := afero.NewMemMapFs()
    20  
    21  	_ = fs.Mkdir("/tmp", 0777)
    22  	f, _ := fs.Create("/tmp/jsonfile.json")
    23  	_, _ = f.WriteString(jsonContent)
    24  	f, _ = fs.Create("/tmp/array.json")
    25  	_, _ = f.WriteString(arrayContent)
    26  	f, _ = fs.Create("/tmp/yamlfile.yaml")
    27  	_, _ = f.WriteString(yamlContent)
    28  	f, _ = fs.Create("/tmp/textfile.txt")
    29  	_, _ = f.WriteString(`plain text...`)
    30  
    31  	source := &Source{Alias: "foo", URL: mustParseURL("merge:file:///tmp/jsonfile.json|file:///tmp/yamlfile.yaml")}
    32  	source.fs = fs
    33  	d := &Data{
    34  		Sources: map[string]*Source{
    35  			"foo":       source,
    36  			"bar":       {Alias: "bar", URL: mustParseURL("file:///tmp/jsonfile.json")},
    37  			"baz":       {Alias: "baz", URL: mustParseURL("file:///tmp/yamlfile.yaml")},
    38  			"text":      {Alias: "text", URL: mustParseURL("file:///tmp/textfile.txt")},
    39  			"badscheme": {Alias: "badscheme", URL: mustParseURL("bad:///scheme.json")},
    40  			"badtype":   {Alias: "badtype", URL: mustParseURL("file:///tmp/textfile.txt?type=foo/bar")},
    41  			"array":     {Alias: "array", URL: mustParseURL("file:///tmp/array.json?type=" + url.QueryEscape(jsonArrayMimetype))},
    42  		},
    43  	}
    44  
    45  	actual, err := d.readMerge(source)
    46  	assert.NoError(t, err)
    47  	assert.Equal(t, mergedContent, string(actual))
    48  
    49  	source.URL = mustParseURL("merge:bar|baz")
    50  	actual, err = d.readMerge(source)
    51  	assert.NoError(t, err)
    52  	assert.Equal(t, mergedContent, string(actual))
    53  
    54  	source.URL = mustParseURL("merge:file:///tmp/jsonfile.json")
    55  	_, err = d.readMerge(source)
    56  	assert.Error(t, err)
    57  
    58  	source.URL = mustParseURL("merge:bogusalias|file:///tmp/jsonfile.json")
    59  	_, err = d.readMerge(source)
    60  	assert.Error(t, err)
    61  
    62  	source.URL = mustParseURL("merge:file:///tmp/jsonfile.json|badscheme")
    63  	_, err = d.readMerge(source)
    64  	assert.Error(t, err)
    65  
    66  	source.URL = mustParseURL("merge:file:///tmp/jsonfile.json|badtype")
    67  	_, err = d.readMerge(source)
    68  	assert.Error(t, err)
    69  
    70  	source.URL = mustParseURL("merge:file:///tmp/jsonfile.json|array")
    71  	_, err = d.readMerge(source)
    72  	assert.Error(t, err)
    73  }
    74  
    75  func TestMergeData(t *testing.T) {
    76  	def := map[string]interface{}{
    77  		"f": true,
    78  		"t": false,
    79  		"z": "def",
    80  	}
    81  	out, err := mergeData([]map[string]interface{}{def})
    82  	assert.NoError(t, err)
    83  	assert.Equal(t, "f: true\nt: false\nz: def\n", string(out))
    84  
    85  	over := map[string]interface{}{
    86  		"f": false,
    87  		"t": true,
    88  		"z": "over",
    89  	}
    90  	out, err = mergeData([]map[string]interface{}{over, def})
    91  	assert.NoError(t, err)
    92  	assert.Equal(t, "f: false\nt: true\nz: over\n", string(out))
    93  
    94  	over = map[string]interface{}{
    95  		"f": false,
    96  		"t": true,
    97  		"z": "over",
    98  		"m": map[string]interface{}{
    99  			"a": "aaa",
   100  		},
   101  	}
   102  	out, err = mergeData([]map[string]interface{}{over, def})
   103  	assert.NoError(t, err)
   104  	assert.Equal(t, "f: false\nm:\n  a: aaa\nt: true\nz: over\n", string(out))
   105  
   106  	uber := map[string]interface{}{
   107  		"z": "über",
   108  	}
   109  	out, err = mergeData([]map[string]interface{}{uber, over, def})
   110  	assert.NoError(t, err)
   111  	assert.Equal(t, "f: false\nm:\n  a: aaa\nt: true\nz: über\n", string(out))
   112  
   113  	uber = map[string]interface{}{
   114  		"m": "notamap",
   115  		"z": map[string]interface{}{
   116  			"b": "bbb",
   117  		},
   118  	}
   119  	out, err = mergeData([]map[string]interface{}{uber, over, def})
   120  	assert.NoError(t, err)
   121  	assert.Equal(t, "f: false\nm: notamap\nt: true\nz:\n  b: bbb\n", string(out))
   122  
   123  	uber = map[string]interface{}{
   124  		"m": map[string]interface{}{
   125  			"b": "bbb",
   126  		},
   127  	}
   128  	out, err = mergeData([]map[string]interface{}{uber, over, def})
   129  	assert.NoError(t, err)
   130  	assert.Equal(t, "f: false\nm:\n  a: aaa\n  b: bbb\nt: true\nz: over\n", string(out))
   131  }