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 }