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  }