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 }