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  }