github.com/koderover/helm@v2.17.0+incompatible/pkg/helm/fake_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 helm 18 19 import ( 20 "fmt" 21 "reflect" 22 "testing" 23 24 "k8s.io/helm/pkg/proto/hapi/chart" 25 "k8s.io/helm/pkg/proto/hapi/release" 26 rls "k8s.io/helm/pkg/proto/hapi/services" 27 ) 28 29 const ( 30 cmInputTemplate = `kind: ConfigMap 31 apiVersion: v1 32 metadata: 33 name: example 34 data: 35 Release: 36 {{.Release | toYaml | indent 4}} 37 ` 38 cmOutputTemplate = ` 39 --- 40 # Source: installChart/templates/cm.yaml 41 kind: ConfigMap 42 apiVersion: v1 43 metadata: 44 name: example 45 data: 46 Release: 47 IsInstall: %t 48 IsUpgrade: %t 49 Name: new-release 50 Namespace: default 51 Revision: %d 52 Service: Tiller 53 Time: 54 seconds: 242085845 55 56 ` 57 ) 58 59 var installChart *chart.Chart 60 61 func init() { 62 installChart = &chart.Chart{ 63 Metadata: &chart.Metadata{Name: "installChart"}, 64 Templates: []*chart.Template{ 65 {Name: "templates/cm.yaml", Data: []byte(cmInputTemplate)}, 66 }, 67 } 68 } 69 70 func releaseWithChart(opts *MockReleaseOptions) *release.Release { 71 if opts.Chart == nil { 72 opts.Chart = installChart 73 } 74 return ReleaseMock(opts) 75 } 76 77 func withManifest(r *release.Release, isUpgrade bool) *release.Release { 78 r.Manifest = fmt.Sprintf(cmOutputTemplate, !isUpgrade, isUpgrade, r.Version) 79 return r 80 } 81 82 func TestFakeClient_ReleaseStatus(t *testing.T) { 83 releasePresent := ReleaseMock(&MockReleaseOptions{Name: "release-present"}) 84 releaseNotPresent := ReleaseMock(&MockReleaseOptions{Name: "release-not-present"}) 85 86 type fields struct { 87 Rels []*release.Release 88 } 89 type args struct { 90 rlsName string 91 opts []StatusOption 92 } 93 tests := []struct { 94 name string 95 fields fields 96 args args 97 want *rls.GetReleaseStatusResponse 98 wantErr bool 99 }{ 100 { 101 name: "Get a single release that exists", 102 fields: fields{ 103 Rels: []*release.Release{ 104 releasePresent, 105 }, 106 }, 107 args: args{ 108 rlsName: releasePresent.Name, 109 opts: nil, 110 }, 111 want: &rls.GetReleaseStatusResponse{ 112 Name: releasePresent.Name, 113 Info: releasePresent.Info, 114 Namespace: releasePresent.Namespace, 115 }, 116 117 wantErr: false, 118 }, 119 { 120 name: "Get a release that does not exist", 121 fields: fields{ 122 Rels: []*release.Release{ 123 releasePresent, 124 }, 125 }, 126 args: args{ 127 rlsName: releaseNotPresent.Name, 128 opts: nil, 129 }, 130 want: nil, 131 wantErr: true, 132 }, 133 { 134 name: "Get a single release that exists from list", 135 fields: fields{ 136 Rels: []*release.Release{ 137 ReleaseMock(&MockReleaseOptions{Name: "angry-dolphin", Namespace: "default"}), 138 ReleaseMock(&MockReleaseOptions{Name: "trepid-tapir", Namespace: "default"}), 139 releasePresent, 140 }, 141 }, 142 args: args{ 143 rlsName: releasePresent.Name, 144 opts: nil, 145 }, 146 want: &rls.GetReleaseStatusResponse{ 147 Name: releasePresent.Name, 148 Info: releasePresent.Info, 149 Namespace: releasePresent.Namespace, 150 }, 151 152 wantErr: false, 153 }, 154 } 155 156 for _, tt := range tests { 157 t.Run(tt.name, func(t *testing.T) { 158 c := &FakeClient{ 159 Rels: tt.fields.Rels, 160 } 161 got, err := c.ReleaseStatus(tt.args.rlsName, tt.args.opts...) 162 if (err != nil) != tt.wantErr { 163 t.Errorf("FakeClient.ReleaseStatus() error = %v, wantErr %v", err, tt.wantErr) 164 return 165 } 166 if !reflect.DeepEqual(got, tt.want) { 167 t.Errorf("FakeClient.ReleaseStatus() = %v, want %v", got, tt.want) 168 } 169 }) 170 } 171 } 172 173 func TestFakeClient_InstallReleaseFromChart(t *testing.T) { 174 type fields struct { 175 Rels []*release.Release 176 RenderManifests bool 177 } 178 type args struct { 179 ns string 180 opts []InstallOption 181 } 182 tests := []struct { 183 name string 184 fields fields 185 args args 186 want *rls.InstallReleaseResponse 187 relsAfter []*release.Release 188 wantErr bool 189 }{ 190 { 191 name: "Add release to an empty list.", 192 fields: fields{ 193 Rels: []*release.Release{}, 194 }, 195 args: args{ 196 ns: "default", 197 opts: []InstallOption{ReleaseName("new-release")}, 198 }, 199 want: &rls.InstallReleaseResponse{ 200 Release: releaseWithChart(&MockReleaseOptions{Name: "new-release"}), 201 }, 202 relsAfter: []*release.Release{ 203 releaseWithChart(&MockReleaseOptions{Name: "new-release"}), 204 }, 205 wantErr: false, 206 }, 207 { 208 name: "Add release with description.", 209 fields: fields{ 210 Rels: []*release.Release{}, 211 }, 212 args: args{ 213 ns: "default", 214 opts: []InstallOption{ReleaseName("new-release"), InstallDescription("foo-bar")}, 215 }, 216 want: &rls.InstallReleaseResponse{ 217 Release: releaseWithChart(&MockReleaseOptions{Name: "new-release", Description: "foo-bar"}), 218 }, 219 relsAfter: []*release.Release{ 220 releaseWithChart(&MockReleaseOptions{Name: "new-release", Description: "foo-bar"}), 221 }, 222 wantErr: false, 223 }, 224 { 225 name: "Try to add a release where the name already exists.", 226 fields: fields{ 227 Rels: []*release.Release{ 228 releaseWithChart(&MockReleaseOptions{Name: "new-release"}), 229 }, 230 }, 231 args: args{ 232 ns: "default", 233 opts: []InstallOption{ReleaseName("new-release")}, 234 }, 235 relsAfter: []*release.Release{ 236 releaseWithChart(&MockReleaseOptions{Name: "new-release"}), 237 }, 238 want: nil, 239 wantErr: true, 240 }, 241 { 242 name: "Render the given chart.", 243 fields: fields{ 244 Rels: []*release.Release{}, 245 RenderManifests: true, 246 }, 247 args: args{ 248 ns: "default", 249 opts: []InstallOption{ReleaseName("new-release")}, 250 }, 251 want: &rls.InstallReleaseResponse{ 252 Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release"}), false), 253 }, 254 relsAfter: []*release.Release{ 255 withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release"}), false), 256 }, 257 wantErr: false, 258 }, 259 } 260 for _, tt := range tests { 261 t.Run(tt.name, func(t *testing.T) { 262 c := &FakeClient{ 263 Rels: tt.fields.Rels, 264 RenderManifests: tt.fields.RenderManifests, 265 } 266 got, err := c.InstallReleaseFromChart(installChart, tt.args.ns, tt.args.opts...) 267 if (err != nil) != tt.wantErr { 268 t.Errorf("FakeClient.InstallReleaseFromChart() error = %v, wantErr %v", err, tt.wantErr) 269 return 270 } 271 if !reflect.DeepEqual(got, tt.want) { 272 t.Errorf("FakeClient.InstallReleaseFromChart() = %v, want %v", got, tt.want) 273 } 274 if !reflect.DeepEqual(c.Rels, tt.relsAfter) { 275 t.Errorf("FakeClient.InstallReleaseFromChart() rels = %v, expected %v", got, tt.relsAfter) 276 } 277 }) 278 } 279 } 280 281 func TestFakeClient_DeleteRelease(t *testing.T) { 282 type fields struct { 283 Rels []*release.Release 284 } 285 type args struct { 286 rlsName string 287 opts []DeleteOption 288 } 289 tests := []struct { 290 name string 291 fields fields 292 args args 293 want *rls.UninstallReleaseResponse 294 relsAfter []*release.Release 295 wantErr bool 296 }{ 297 { 298 name: "Delete a release that exists.", 299 fields: fields{ 300 Rels: []*release.Release{ 301 ReleaseMock(&MockReleaseOptions{Name: "angry-dolphin"}), 302 ReleaseMock(&MockReleaseOptions{Name: "trepid-tapir"}), 303 }, 304 }, 305 args: args{ 306 rlsName: "trepid-tapir", 307 opts: []DeleteOption{}, 308 }, 309 relsAfter: []*release.Release{ 310 ReleaseMock(&MockReleaseOptions{Name: "angry-dolphin"}), 311 }, 312 want: &rls.UninstallReleaseResponse{ 313 Release: ReleaseMock(&MockReleaseOptions{Name: "trepid-tapir"}), 314 }, 315 wantErr: false, 316 }, 317 { 318 name: "Delete a release that does not exist.", 319 fields: fields{ 320 Rels: []*release.Release{ 321 ReleaseMock(&MockReleaseOptions{Name: "angry-dolphin"}), 322 ReleaseMock(&MockReleaseOptions{Name: "trepid-tapir"}), 323 }, 324 }, 325 args: args{ 326 rlsName: "release-that-does-not-exists", 327 opts: []DeleteOption{}, 328 }, 329 relsAfter: []*release.Release{ 330 ReleaseMock(&MockReleaseOptions{Name: "angry-dolphin"}), 331 ReleaseMock(&MockReleaseOptions{Name: "trepid-tapir"}), 332 }, 333 want: nil, 334 wantErr: true, 335 }, 336 { 337 name: "Delete when only 1 item exists.", 338 fields: fields{ 339 Rels: []*release.Release{ 340 ReleaseMock(&MockReleaseOptions{Name: "trepid-tapir"}), 341 }, 342 }, 343 args: args{ 344 rlsName: "trepid-tapir", 345 opts: []DeleteOption{}, 346 }, 347 relsAfter: []*release.Release{}, 348 want: &rls.UninstallReleaseResponse{ 349 Release: ReleaseMock(&MockReleaseOptions{Name: "trepid-tapir"}), 350 }, 351 wantErr: false, 352 }, 353 } 354 for _, tt := range tests { 355 t.Run(tt.name, func(t *testing.T) { 356 c := &FakeClient{ 357 Rels: tt.fields.Rels, 358 } 359 got, err := c.DeleteRelease(tt.args.rlsName, tt.args.opts...) 360 if (err != nil) != tt.wantErr { 361 t.Errorf("FakeClient.DeleteRelease() error = %v, wantErr %v", err, tt.wantErr) 362 return 363 } 364 if !reflect.DeepEqual(got, tt.want) { 365 t.Errorf("FakeClient.DeleteRelease() = %v, want %v", got, tt.want) 366 } 367 368 if !reflect.DeepEqual(c.Rels, tt.relsAfter) { 369 t.Errorf("FakeClient.InstallReleaseFromChart() rels = %v, expected %v", c.Rels, tt.relsAfter) 370 } 371 }) 372 } 373 } 374 375 func TestFakeClient_UpdateReleaseFromChart(t *testing.T) { 376 type fields struct { 377 Rels []*release.Release 378 RenderManifests bool 379 } 380 type args struct { 381 release string 382 opts []UpdateOption 383 } 384 tests := []struct { 385 name string 386 fields fields 387 args args 388 want *rls.UpdateReleaseResponse 389 relsAfter []*release.Release 390 wantErr bool 391 }{ 392 { 393 name: "Update release.", 394 fields: fields{ 395 Rels: []*release.Release{ 396 releaseWithChart(&MockReleaseOptions{Name: "new-release"}), 397 }, 398 }, 399 args: args{ 400 release: "new-release", 401 opts: []UpdateOption{}, 402 }, 403 want: &rls.UpdateReleaseResponse{ 404 Release: releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), 405 }, 406 relsAfter: []*release.Release{ 407 releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), 408 }, 409 }, 410 { 411 name: "Update and render given chart.", 412 fields: fields{ 413 Rels: []*release.Release{ 414 releaseWithChart(&MockReleaseOptions{Name: "new-release"}), 415 }, 416 RenderManifests: true, 417 }, 418 args: args{ 419 release: "new-release", 420 opts: []UpdateOption{}, 421 }, 422 want: &rls.UpdateReleaseResponse{ 423 Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), true), 424 }, 425 relsAfter: []*release.Release{ 426 withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), true), 427 }, 428 wantErr: false, 429 }, 430 } 431 for _, tt := range tests { 432 t.Run(tt.name, func(t *testing.T) { 433 c := &FakeClient{ 434 Rels: tt.fields.Rels, 435 RenderManifests: tt.fields.RenderManifests, 436 } 437 got, err := c.UpdateReleaseFromChart(tt.args.release, installChart, tt.args.opts...) 438 if (err != nil) != tt.wantErr { 439 t.Errorf("FakeClient.UpdateReleaseFromChart() error = %v, wantErr %v", err, tt.wantErr) 440 return 441 } 442 if !reflect.DeepEqual(got, tt.want) { 443 t.Errorf("FakeClient.UpdateReleaseFromChart() =\n%v\nwant\n%v", got, tt.want) 444 } 445 if !reflect.DeepEqual(c.Rels, tt.relsAfter) { 446 t.Errorf("FakeClient.UpdateReleaseFromChart() rels =\n%v\nwant\n%v", c.Rels, tt.relsAfter) 447 } 448 }) 449 } 450 } 451 452 func TestFakeClient_ReleaseHistory(t *testing.T) { 453 relName := "angry-dolphin" 454 rels := []*release.Release{ 455 ReleaseMock(&MockReleaseOptions{Name: relName, Version: 1}), 456 ReleaseMock(&MockReleaseOptions{Name: relName, Version: 2}), 457 ReleaseMock(&MockReleaseOptions{Name: relName, Version: 3}), 458 ReleaseMock(&MockReleaseOptions{Name: relName, Version: 4}), 459 } 460 461 type fields struct { 462 Rels []*release.Release 463 } 464 type args struct { 465 rlsName string 466 opts []HistoryOption 467 } 468 tests := []struct { 469 name string 470 fields fields 471 args args 472 want *rls.GetHistoryResponse 473 wantErr bool 474 }{ 475 { 476 name: "Get all revisions of a release", 477 fields: fields{ 478 Rels: rels, 479 }, 480 args: args{ 481 rlsName: relName, 482 opts: nil, 483 }, 484 want: &rls.GetHistoryResponse{ 485 Releases: rels, 486 }, 487 wantErr: false, 488 }, 489 { 490 name: "Get only 2 revisions of a release", 491 fields: fields{ 492 Rels: rels, 493 }, 494 args: args{ 495 rlsName: relName, 496 opts: []HistoryOption{ 497 WithMaxHistory(2), 498 }, 499 }, 500 want: &rls.GetHistoryResponse{ 501 Releases: rels[:2], 502 }, 503 wantErr: false, 504 }, 505 } 506 507 for _, tt := range tests { 508 t.Run(tt.name, func(t *testing.T) { 509 c := &FakeClient{ 510 Rels: tt.fields.Rels, 511 } 512 got, err := c.ReleaseHistory(tt.args.rlsName, tt.args.opts...) 513 if (err != nil) != tt.wantErr { 514 t.Errorf("FakeClient.ReleaseHistory() error = %v, wantErr %v", err, tt.wantErr) 515 return 516 } 517 if !reflect.DeepEqual(got, tt.want) { 518 t.Errorf("FakeClient.ReleaseHistory() = %v, want %v", got, tt.want) 519 } 520 }) 521 } 522 }