github.com/nais/knorten@v0.0.0-20240104110906-55926958e361/pkg/helm/application_test.go (about)

     1  package helm
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  func Test_parseTeamValue(t *testing.T) {
     9  	type args struct {
    10  		key    string
    11  		value  any
    12  		values map[string]any
    13  	}
    14  	tests := []struct {
    15  		name string
    16  		args args
    17  		want any
    18  	}{
    19  		{
    20  			name: "Simple test",
    21  			args: args{
    22  				key:    "webserver.name",
    23  				value:  "flowtheair",
    24  				values: map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag"}},
    25  			},
    26  			want: map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag", "name": "flowtheair"}},
    27  		},
    28  		{
    29  			name: "Quoted value",
    30  			args: args{
    31  				key:    "ingress.web.path",
    32  				value:  `"/*"`,
    33  				values: map[string]any{"ingress": map[string]any{"web": map[string]any{}}},
    34  			},
    35  			want: map[string]any{"ingress": map[string]any{"web": map[string]any{"path": "/*"}}},
    36  		},
    37  		{
    38  			name: "Quoted keys and value",
    39  			args: args{
    40  				key:    "ingress.web.annotations.kubernetes\\.io/ingress\\.allow-http",
    41  				value:  `"true"`,
    42  				values: map[string]any{},
    43  			},
    44  			want: map[string]any{"ingress": map[string]any{"web": map[string]any{"annotations": map[string]any{"kubernetes.io/ingress.allow-http": "true"}}}},
    45  		},
    46  		{
    47  			name: "Handle omitted values",
    48  			args: args{
    49  				key:    "fernetKey,omit",
    50  				value:  "secret-password",
    51  				values: map[string]any{},
    52  			},
    53  			want: map[string]any{},
    54  		},
    55  	}
    56  	for _, tt := range tests {
    57  		t.Run(tt.name, func(t *testing.T) {
    58  			_, err := parseTeamValue(tt.args.key, tt.args.value, tt.args.values)
    59  			if err != nil {
    60  				t.Error(err)
    61  			}
    62  			if !reflect.DeepEqual(tt.args.values, tt.want) {
    63  				t.Errorf("parse() = %v, want %v", tt.args.values, tt.want)
    64  			}
    65  		})
    66  	}
    67  }
    68  
    69  func Test_mergeMap(t *testing.T) {
    70  	type args struct {
    71  		base   map[string]any
    72  		custom map[string]any
    73  	}
    74  	tests := []struct {
    75  		name string
    76  		args args
    77  		want map[string]any
    78  	}{
    79  		{
    80  			name: "Simple test",
    81  			args: args{
    82  				base:   map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag"}},
    83  				custom: map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag2", "name": "flowtheair"}},
    84  			},
    85  			want: map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag2", "name": "flowtheair"}},
    86  		},
    87  		{
    88  			name: "With slice",
    89  			args: args{
    90  				base:   map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag", "myslice": []any{"one", "two"}, "scheduler": "1234"}},
    91  				custom: map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag2", "name": "flowtheair"}},
    92  			},
    93  			want: map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag2", "name": "flowtheair", "myslice": []any{"one", "two"}, "scheduler": "1234"}},
    94  		},
    95  		{
    96  			name: "Nested test",
    97  			args: args{
    98  				base:   map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag"}, "scheduler": map[string]any{"image": "ghcr.io/org/repository", "values": []any{"1", "2"}}},
    99  				custom: map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag2", "slice": []any{"12"}}, "scheduler": map[string]any{"values": []any{"3", "4"}}},
   100  			},
   101  			want: map[string]any{"webserver": map[string]any{"image": "ghcr.io/org/repo:tag2", "slice": []any{"12"}}, "scheduler": map[string]any{"image": "ghcr.io/org/repository", "values": []any{"3", "4"}}},
   102  		},
   103  		{
   104  			name: "Test creating none existing paths in base",
   105  			args: args{
   106  				base:   map[string]any{"scheduler": "value"},
   107  				custom: map[string]any{"webserver": map[string]any{"newkey": "value"}},
   108  			},
   109  			want: map[string]any{"scheduler": "value", "webserver": map[string]any{"newkey": "value"}},
   110  		},
   111  	}
   112  	for _, tt := range tests {
   113  		t.Run(tt.name, func(t *testing.T) {
   114  			mergeMaps(tt.args.base, tt.args.custom)
   115  			if !reflect.DeepEqual(tt.args.base, tt.want) {
   116  				t.Errorf("parse() = %v, want %v", tt.args.base, tt.want)
   117  			}
   118  		})
   119  	}
   120  }
   121  
   122  func Test_SetChartValue(t *testing.T) {
   123  	type args struct {
   124  		keys  []string
   125  		value string
   126  		chart map[string]interface{}
   127  	}
   128  	tests := []struct {
   129  		name string
   130  		args args
   131  		want map[string]interface{}
   132  	}{
   133  		{
   134  			name: "Simple test",
   135  			args: args{
   136  				keys:  []string{"singleuser", "image", "name"},
   137  				value: "navikt/jupyter",
   138  				chart: map[string]any{"singleuser": map[string]any{"image": map[string]any{"name": "jupyter"}}},
   139  			},
   140  			want: map[string]any{"singleuser": map[string]any{"image": map[string]any{"name": "navikt/jupyter"}}},
   141  		},
   142  		{
   143  			name: "No missing values",
   144  			args: args{
   145  				keys:  []string{"singleuser", "image", "name"},
   146  				value: "navikt/jupyter",
   147  				chart: map[string]any{"singleuser": map[string]any{"image": map[string]any{"name": "jupyter", "tag": "v1"}}},
   148  			},
   149  			want: map[string]any{"singleuser": map[string]any{"image": map[string]any{"name": "navikt/jupyter", "tag": "v1"}}},
   150  		},
   151  		{
   152  			name: "Missing nested path in chart values",
   153  			args: args{
   154  				keys:  []string{"hub", "config", "AzureAdOAuthenticator", "tenant_id"},
   155  				value: "id",
   156  				chart: map[string]any{"hub": map[string]any{"config": map[string]any{"Jupyterhub": map[string]any{"authenticator_class": "dummy"}}}},
   157  			},
   158  			want: map[string]any{"hub": map[string]any{"config": map[string]any{"Jupyterhub": map[string]any{"authenticator_class": "dummy"}, "AzureAdOAuthenticator": map[string]any{"tenant_id": "id"}}}},
   159  		},
   160  	}
   161  	for _, tt := range tests {
   162  		t.Run(tt.name, func(t *testing.T) {
   163  			SetChartValue(tt.args.keys, tt.args.value, tt.args.chart)
   164  			if !reflect.DeepEqual(tt.args.chart, tt.want) {
   165  				t.Errorf("setChartValue() = %v, want %v", tt.args.chart, tt.want)
   166  			}
   167  		})
   168  	}
   169  }
   170  
   171  func Test_parseKey(t *testing.T) {
   172  	tests := []struct {
   173  		name     string
   174  		key      string
   175  		wantKey  string
   176  		wantOpts []string
   177  	}{
   178  		{
   179  			name:     "Key without options",
   180  			key:      "someHelmKey",
   181  			wantKey:  "someHelmKey",
   182  			wantOpts: []string{},
   183  		},
   184  		{
   185  			name:     "Key with options",
   186  			key:      "noKey,omit",
   187  			wantKey:  "noKey",
   188  			wantOpts: []string{"omit"},
   189  		},
   190  	}
   191  	for _, tt := range tests {
   192  		t.Run(tt.name, func(t *testing.T) {
   193  			key, opts := parseKey(tt.key)
   194  			if key != tt.wantKey {
   195  				t.Errorf("parseKey() key = %v, want %v", key, tt.wantKey)
   196  			}
   197  			if !reflect.DeepEqual(opts, tt.wantOpts) {
   198  				t.Errorf("parseKey() opts = %v, want %v", opts, tt.wantOpts)
   199  			}
   200  		})
   201  	}
   202  }