github.com/kubeshop/testkube@v1.17.23/pkg/tcl/testworkflowstcl/testworkflowresolver/config_test.go (about) 1 // Copyright 2024 Testkube. 2 // 3 // Licensed as a Testkube Pro file under the Testkube Community 4 // License (the "License"); you may not use this file except in compliance with 5 // the License. You may obtain a copy of the License at 6 // 7 // https://github.com/kubeshop/testkube/blob/main/licenses/TCL.txt 8 9 package testworkflowresolver 10 11 import ( 12 "testing" 13 14 "github.com/stretchr/testify/assert" 15 "k8s.io/apimachinery/pkg/util/intstr" 16 17 testworkflowsv1 "github.com/kubeshop/testkube-operator/api/testworkflows/v1" 18 "github.com/kubeshop/testkube/internal/common" 19 ) 20 21 func TestApplyConfigTestWorkflow(t *testing.T) { 22 cfg := map[string]intstr.IntOrString{ 23 "foo": {Type: intstr.Int, IntVal: 30}, 24 "bar": {Type: intstr.String, StrVal: "some value"}, 25 "baz": {Type: intstr.String, StrVal: "some {{ 30 }} value"}, 26 "foobar": {Type: intstr.String, StrVal: "some {{ unknown(300) }} value"}, 27 } 28 want := &testworkflowsv1.TestWorkflow{ 29 Description: "{{some description here }}", 30 Spec: testworkflowsv1.TestWorkflowSpec{ 31 TestWorkflowSpecBase: testworkflowsv1.TestWorkflowSpecBase{ 32 Pod: &testworkflowsv1.PodConfig{ 33 ServiceAccountName: "abra 30", 34 Labels: map[string]string{ 35 "some value-key": "some 30 value", 36 "other": "{{value}}", 37 }, 38 }, 39 }, 40 Steps: []testworkflowsv1.Step{ 41 { 42 StepBase: testworkflowsv1.StepBase{ 43 Container: &testworkflowsv1.ContainerConfig{ 44 WorkingDir: common.Ptr("some {{unknown(300)}} value {{another(500)}}"), 45 }, 46 }, 47 }, 48 }, 49 }, 50 } 51 got, err := ApplyWorkflowConfig(&testworkflowsv1.TestWorkflow{ 52 Description: "{{some description here }}", 53 Spec: testworkflowsv1.TestWorkflowSpec{ 54 TestWorkflowSpecBase: testworkflowsv1.TestWorkflowSpecBase{ 55 Pod: &testworkflowsv1.PodConfig{ 56 ServiceAccountName: "abra {{config.foo}}", 57 Labels: map[string]string{ 58 "{{config.bar}}-key": "{{config.baz}}", 59 "other": "{{value}}", 60 }, 61 }, 62 }, 63 Steps: []testworkflowsv1.Step{ 64 { 65 StepBase: testworkflowsv1.StepBase{ 66 Container: &testworkflowsv1.ContainerConfig{ 67 WorkingDir: common.Ptr("{{config.foobar}} {{another(500)}}"), 68 }, 69 }, 70 }, 71 }, 72 }, 73 }, cfg) 74 75 assert.NoError(t, err) 76 assert.Equal(t, want, got) 77 } 78 79 func TestApplyMissingConfig(t *testing.T) { 80 cfg := map[string]intstr.IntOrString{ 81 "foo": {Type: intstr.Int, IntVal: 30}, 82 "bar": {Type: intstr.String, StrVal: "some value"}, 83 "foobar": {Type: intstr.String, StrVal: "some {{ unknown(300) }} value"}, 84 } 85 _, err := ApplyWorkflowConfig(&testworkflowsv1.TestWorkflow{ 86 Description: "{{some description here }}", 87 Spec: testworkflowsv1.TestWorkflowSpec{ 88 TestWorkflowSpecBase: testworkflowsv1.TestWorkflowSpecBase{ 89 Pod: &testworkflowsv1.PodConfig{ 90 ServiceAccountName: "abra {{config.foo}}", 91 Labels: map[string]string{ 92 "{{config.bar}}-key": "{{config.baz}}", 93 }, 94 }, 95 }, 96 Steps: []testworkflowsv1.Step{ 97 { 98 StepBase: testworkflowsv1.StepBase{ 99 Container: &testworkflowsv1.ContainerConfig{ 100 WorkingDir: common.Ptr("{{config.foobar}} {{another(500)}}"), 101 }, 102 }, 103 }, 104 }, 105 }, 106 }, cfg) 107 108 assert.Error(t, err) 109 assert.Contains(t, err.Error(), "Spec: TestWorkflowSpecBase: Pod: Labels: {{config.bar}}-key") 110 assert.Contains(t, err.Error(), "error while accessing config.baz: unknown variable") 111 } 112 113 func TestApplyConfigDefaults(t *testing.T) { 114 cfg := map[string]intstr.IntOrString{ 115 "foo": {Type: intstr.Int, IntVal: 30}, 116 "bar": {Type: intstr.String, StrVal: "some value"}, 117 "foobar": {Type: intstr.String, StrVal: "some {{ unknown(300) }} value"}, 118 } 119 want := &testworkflowsv1.TestWorkflow{ 120 Description: "{{some description here }}", 121 Spec: testworkflowsv1.TestWorkflowSpec{ 122 TestWorkflowSpecBase: testworkflowsv1.TestWorkflowSpecBase{ 123 Config: map[string]testworkflowsv1.ParameterSchema{ 124 "baz": {Default: &intstr.IntOrString{Type: intstr.String, StrVal: "something"}}, 125 }, 126 Pod: &testworkflowsv1.PodConfig{ 127 ServiceAccountName: "abra 30", 128 Labels: map[string]string{ 129 "some value-key": "something", 130 }, 131 }, 132 }, 133 Steps: []testworkflowsv1.Step{ 134 { 135 StepBase: testworkflowsv1.StepBase{ 136 Container: &testworkflowsv1.ContainerConfig{ 137 WorkingDir: common.Ptr("some {{unknown(300)}} value {{another(500)}}"), 138 }, 139 }, 140 }, 141 }, 142 }, 143 } 144 got, err := ApplyWorkflowConfig(&testworkflowsv1.TestWorkflow{ 145 Description: "{{some description here }}", 146 Spec: testworkflowsv1.TestWorkflowSpec{ 147 TestWorkflowSpecBase: testworkflowsv1.TestWorkflowSpecBase{ 148 Config: map[string]testworkflowsv1.ParameterSchema{ 149 "baz": {Default: &intstr.IntOrString{Type: intstr.String, StrVal: "something"}}, 150 }, 151 Pod: &testworkflowsv1.PodConfig{ 152 ServiceAccountName: "abra {{config.foo}}", 153 Labels: map[string]string{ 154 "{{config.bar}}-key": "{{config.baz}}", 155 }, 156 }, 157 }, 158 Steps: []testworkflowsv1.Step{ 159 { 160 StepBase: testworkflowsv1.StepBase{ 161 Container: &testworkflowsv1.ContainerConfig{ 162 WorkingDir: common.Ptr("{{config.foobar}} {{another(500)}}"), 163 }, 164 }, 165 }, 166 }, 167 }, 168 }, cfg) 169 170 assert.NoError(t, err) 171 assert.Equal(t, want, got) 172 } 173 174 func TestInvalidInteger(t *testing.T) { 175 cfg := map[string]intstr.IntOrString{ 176 "foo": {Type: intstr.String, StrVal: "some value"}, 177 } 178 _, err := ApplyWorkflowConfig(&testworkflowsv1.TestWorkflow{ 179 Description: "{{some description here }}", 180 Spec: testworkflowsv1.TestWorkflowSpec{ 181 TestWorkflowSpecBase: testworkflowsv1.TestWorkflowSpecBase{ 182 Config: map[string]testworkflowsv1.ParameterSchema{ 183 "foo": {Type: testworkflowsv1.ParameterTypeInteger}, 184 }, 185 Pod: &testworkflowsv1.PodConfig{ 186 ServiceAccountName: "{{config.foo}}", 187 }, 188 }, 189 }, 190 }, cfg) 191 192 assert.Error(t, err) 193 assert.Contains(t, err.Error(), "config.foo: error") 194 assert.Contains(t, err.Error(), "error while converting value to number") 195 } 196 197 func TestApplyConfigTestWorkflowTemplate(t *testing.T) { 198 cfg := map[string]intstr.IntOrString{ 199 "foo": {Type: intstr.Int, IntVal: 30}, 200 "bar": {Type: intstr.String, StrVal: "some value"}, 201 "baz": {Type: intstr.String, StrVal: "some {{ 30 }} value"}, 202 "foobar": {Type: intstr.String, StrVal: "some {{ unknown(300) }} value"}, 203 } 204 want := &testworkflowsv1.TestWorkflowTemplate{ 205 Description: "{{some description here }}", 206 Spec: testworkflowsv1.TestWorkflowTemplateSpec{ 207 TestWorkflowSpecBase: testworkflowsv1.TestWorkflowSpecBase{ 208 Pod: &testworkflowsv1.PodConfig{ 209 ServiceAccountName: "abra 30", 210 Labels: map[string]string{ 211 "some value-key": "some 30 value", 212 }, 213 }, 214 }, 215 Steps: []testworkflowsv1.IndependentStep{ 216 { 217 StepBase: testworkflowsv1.StepBase{ 218 Container: &testworkflowsv1.ContainerConfig{ 219 WorkingDir: common.Ptr("some {{unknown(300)}} value {{another(500)}}"), 220 }, 221 }, 222 }, 223 }, 224 }, 225 } 226 got, err := ApplyWorkflowTemplateConfig(&testworkflowsv1.TestWorkflowTemplate{ 227 Description: "{{some description here }}", 228 Spec: testworkflowsv1.TestWorkflowTemplateSpec{ 229 TestWorkflowSpecBase: testworkflowsv1.TestWorkflowSpecBase{ 230 Pod: &testworkflowsv1.PodConfig{ 231 ServiceAccountName: "abra {{config.foo}}", 232 Labels: map[string]string{ 233 "{{config.bar}}-key": "{{config.baz}}", 234 }, 235 }, 236 }, 237 Steps: []testworkflowsv1.IndependentStep{ 238 { 239 StepBase: testworkflowsv1.StepBase{ 240 Container: &testworkflowsv1.ContainerConfig{ 241 WorkingDir: common.Ptr("{{config.foobar}} {{another(500)}}"), 242 }, 243 }, 244 }, 245 }, 246 }, 247 }, cfg) 248 249 assert.NoError(t, err) 250 assert.Equal(t, want, got) 251 }