github.com/doitroot/helm@v3.0.0-beta.3+incompatible/pkg/chartutil/values_test.go (about) 1 /* 2 Copyright The Helm Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package chartutil 18 19 import ( 20 "bytes" 21 "fmt" 22 "testing" 23 "text/template" 24 25 "helm.sh/helm/pkg/chart" 26 ) 27 28 func TestReadValues(t *testing.T) { 29 doc := `# Test YAML parse 30 poet: "Coleridge" 31 title: "Rime of the Ancient Mariner" 32 stanza: 33 - "at" 34 - "length" 35 - "did" 36 - cross 37 - an 38 - Albatross 39 40 mariner: 41 with: "crossbow" 42 shot: "ALBATROSS" 43 44 water: 45 water: 46 where: "everywhere" 47 nor: "any drop to drink" 48 temperature: 1234567890 49 ` 50 51 data, err := ReadValues([]byte(doc)) 52 if err != nil { 53 t.Fatalf("Error parsing bytes: %s", err) 54 } 55 matchValues(t, data) 56 57 tests := []string{`poet: "Coleridge"`, "# Just a comment", ""} 58 59 for _, tt := range tests { 60 data, err = ReadValues([]byte(tt)) 61 if err != nil { 62 t.Fatalf("Error parsing bytes (%s): %s", tt, err) 63 } 64 if data == nil { 65 t.Errorf(`YAML string "%s" gave a nil map`, tt) 66 } 67 } 68 } 69 70 func TestToRenderValues(t *testing.T) { 71 72 chartValues := map[string]interface{}{ 73 "name": "al Rashid", 74 "where": map[string]interface{}{ 75 "city": "Basrah", 76 "title": "caliph", 77 }, 78 } 79 80 overideValues := map[string]interface{}{ 81 "name": "Haroun", 82 "where": map[string]interface{}{ 83 "city": "Baghdad", 84 "date": "809 CE", 85 }, 86 } 87 88 c := &chart.Chart{ 89 Metadata: &chart.Metadata{Name: "test"}, 90 Templates: []*chart.File{}, 91 Values: chartValues, 92 Files: []*chart.File{ 93 {Name: "scheherazade/shahryar.txt", Data: []byte("1,001 Nights")}, 94 }, 95 } 96 c.AddDependency(&chart.Chart{ 97 Metadata: &chart.Metadata{Name: "where"}, 98 }) 99 100 o := ReleaseOptions{ 101 Name: "Seven Voyages", 102 IsInstall: true, 103 } 104 105 res, err := ToRenderValues(c, overideValues, o, nil) 106 if err != nil { 107 t.Fatal(err) 108 } 109 110 // Ensure that the top-level values are all set. 111 if name := res["Chart"].(*chart.Metadata).Name; name != "test" { 112 t.Errorf("Expected chart name 'test', got %q", name) 113 } 114 relmap := res["Release"].(map[string]interface{}) 115 if name := relmap["Name"]; name.(string) != "Seven Voyages" { 116 t.Errorf("Expected release name 'Seven Voyages', got %q", name) 117 } 118 if relmap["IsUpgrade"].(bool) { 119 t.Error("Expected upgrade to be false.") 120 } 121 if !relmap["IsInstall"].(bool) { 122 t.Errorf("Expected install to be true.") 123 } 124 if !res["Capabilities"].(*Capabilities).APIVersions.Has("v1") { 125 t.Error("Expected Capabilities to have v1 as an API") 126 } 127 if res["Capabilities"].(*Capabilities).KubeVersion.Major != "1" { 128 t.Error("Expected Capabilities to have a Kube version") 129 } 130 131 vals := res["Values"].(Values) 132 if vals["name"] != "Haroun" { 133 t.Errorf("Expected 'Haroun', got %q (%v)", vals["name"], vals) 134 } 135 where := vals["where"].(map[string]interface{}) 136 expects := map[string]string{ 137 "city": "Baghdad", 138 "date": "809 CE", 139 "title": "caliph", 140 } 141 for field, expect := range expects { 142 if got := where[field]; got != expect { 143 t.Errorf("Expected %q, got %q (%v)", expect, got, where) 144 } 145 } 146 } 147 148 func TestReadValuesFile(t *testing.T) { 149 data, err := ReadValuesFile("./testdata/coleridge.yaml") 150 if err != nil { 151 t.Fatalf("Error reading YAML file: %s", err) 152 } 153 matchValues(t, data) 154 } 155 156 func ExampleValues() { 157 doc := ` 158 title: "Moby Dick" 159 chapter: 160 one: 161 title: "Loomings" 162 two: 163 title: "The Carpet-Bag" 164 three: 165 title: "The Spouter Inn" 166 ` 167 d, err := ReadValues([]byte(doc)) 168 if err != nil { 169 panic(err) 170 } 171 ch1, err := d.Table("chapter.one") 172 if err != nil { 173 panic("could not find chapter one") 174 } 175 fmt.Print(ch1["title"]) 176 // Output: 177 // Loomings 178 } 179 180 func TestTable(t *testing.T) { 181 doc := ` 182 title: "Moby Dick" 183 chapter: 184 one: 185 title: "Loomings" 186 two: 187 title: "The Carpet-Bag" 188 three: 189 title: "The Spouter Inn" 190 ` 191 d, err := ReadValues([]byte(doc)) 192 if err != nil { 193 t.Fatalf("Failed to parse the White Whale: %s", err) 194 } 195 196 if _, err := d.Table("title"); err == nil { 197 t.Fatalf("Title is not a table.") 198 } 199 200 if _, err := d.Table("chapter"); err != nil { 201 t.Fatalf("Failed to get the chapter table: %s\n%v", err, d) 202 } 203 204 if v, err := d.Table("chapter.one"); err != nil { 205 t.Errorf("Failed to get chapter.one: %s", err) 206 } else if v["title"] != "Loomings" { 207 t.Errorf("Unexpected title: %s", v["title"]) 208 } 209 210 if _, err := d.Table("chapter.three"); err != nil { 211 t.Errorf("Chapter three is missing: %s\n%v", err, d) 212 } 213 214 if _, err := d.Table("chapter.OneHundredThirtySix"); err == nil { 215 t.Errorf("I think you mean 'Epilogue'") 216 } 217 } 218 219 func matchValues(t *testing.T, data map[string]interface{}) { 220 if data["poet"] != "Coleridge" { 221 t.Errorf("Unexpected poet: %s", data["poet"]) 222 } 223 224 if o, err := ttpl("{{len .stanza}}", data); err != nil { 225 t.Errorf("len stanza: %s", err) 226 } else if o != "6" { 227 t.Errorf("Expected 6, got %s", o) 228 } 229 230 if o, err := ttpl("{{.mariner.shot}}", data); err != nil { 231 t.Errorf(".mariner.shot: %s", err) 232 } else if o != "ALBATROSS" { 233 t.Errorf("Expected that mariner shot ALBATROSS") 234 } 235 236 if o, err := ttpl("{{.water.water.where}}", data); err != nil { 237 t.Errorf(".water.water.where: %s", err) 238 } else if o != "everywhere" { 239 t.Errorf("Expected water water everywhere") 240 } 241 242 if o, err := ttpl("{{.water.water.temperature}}", data); err != nil { 243 t.Errorf(".water.water.temperature: %s", err) 244 } else if o != "1234567890" { 245 t.Errorf("Expected water water temperature: 1234567890, got: %s", o) 246 } 247 } 248 249 func ttpl(tpl string, v map[string]interface{}) (string, error) { 250 var b bytes.Buffer 251 tt := template.Must(template.New("t").Parse(tpl)) 252 err := tt.Execute(&b, v) 253 return b.String(), err 254 } 255 256 func TestPathValue(t *testing.T) { 257 doc := ` 258 title: "Moby Dick" 259 chapter: 260 one: 261 title: "Loomings" 262 two: 263 title: "The Carpet-Bag" 264 three: 265 title: "The Spouter Inn" 266 ` 267 d, err := ReadValues([]byte(doc)) 268 if err != nil { 269 t.Fatalf("Failed to parse the White Whale: %s", err) 270 } 271 272 if v, err := d.PathValue("chapter.one.title"); err != nil { 273 t.Errorf("Got error instead of title: %s\n%v", err, d) 274 } else if v != "Loomings" { 275 t.Errorf("No error but got wrong value for title: %s\n%v", err, d) 276 } 277 if _, err := d.PathValue("chapter.one.doesntexist"); err == nil { 278 t.Errorf("Non-existent key should return error: %s\n%v", err, d) 279 } 280 if _, err := d.PathValue("chapter.doesntexist.one"); err == nil { 281 t.Errorf("Non-existent key in middle of path should return error: %s\n%v", err, d) 282 } 283 if _, err := d.PathValue(""); err == nil { 284 t.Error("Asking for the value from an empty path should yield an error") 285 } 286 if v, err := d.PathValue("title"); err == nil { 287 if v != "Moby Dick" { 288 t.Errorf("Failed to return values for root key title") 289 } 290 } 291 }