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