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  }