From 8bce44a1d50c5754f38dba3e41ee65a3475e336a Mon Sep 17 00:00:00 2001
From: Martin Schurz <Martin.Schurz@telekom.de>
Date: Wed, 13 Dec 2023 19:28:09 +0100
Subject: [PATCH] fix: add tests for resource

Signed-off-by: Martin Schurz <Martin.Schurz@telekom.de>
---
 .../test/templates/cronjob_test.go            | 79 +++++++++++++++++++
 .../test/templates/deployment_test.go         | 65 +++++++++++++++
 2 files changed, 144 insertions(+)

diff --git a/assets/auto-deploy-app/test/templates/cronjob_test.go b/assets/auto-deploy-app/test/templates/cronjob_test.go
index 389bba2..a9517a6 100644
--- a/assets/auto-deploy-app/test/templates/cronjob_test.go
+++ b/assets/auto-deploy-app/test/templates/cronjob_test.go
@@ -11,6 +11,7 @@ import (
 	"github.com/stretchr/testify/require"
 	batchV1beta1 "k8s.io/api/batch/v1beta1"
 	coreV1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/resource"
 )
 
 func TestCronjobMeta(t *testing.T) {
@@ -519,6 +520,84 @@ func TestCronjobTolerations(t *testing.T) {
 	}
 }
 
+func TestCronjobResources(t *testing.T) {
+	for _, tc := range []struct {
+		CaseName string
+		Values   map[string]string
+		Release  string
+
+		EoxpectedNodeSelector map[string]string
+		ExpectedResources     coreV1.ResourceRequirements
+	}{
+		{
+			CaseName: "default",
+			Release:  "production",
+			Values: map[string]string{
+				"cronjobs.job1.command[0]": "echo",
+				"cronjobs.job1.args[0]":    "hello",
+			},
+
+			ExpectedResources: coreV1.ResourceRequirements{
+				Limits:   coreV1.ResourceList(nil),
+				Requests: coreV1.ResourceList{},
+			},
+		},
+		{
+			CaseName: "added resources",
+			Release:  "production",
+			Values: map[string]string{
+				"cronjobs.job1.command[0]": "echo",
+				"cronjobs.job1.args[0]":    "hello",
+				"resources.limits.cpu":      "500m",
+				"resources.limits.memory":   "4Gi",
+				"resources.requests.cpu":    "200m",
+				"resources.requests.memory": "2Gi",
+			},
+
+			ExpectedResources: coreV1.ResourceRequirements{
+				Limits:   coreV1.ResourceList{
+					"cpu": resource.MustParse("500m"),
+					"memory": resource.MustParse("4Gi"),},
+				Requests: coreV1.ResourceList{
+					"cpu": resource.MustParse("200m"),
+					"memory": resource.MustParse("2Gi"),
+				},
+			},
+		},
+	} {
+		t.Run(tc.CaseName, func(t *testing.T) {
+			namespaceName := "minimal-ruby-app-" + strings.ToLower(random.UniqueId())
+
+			values := map[string]string{
+				"gitlab.app": "auto-devops-examples/minimal-ruby-app",
+				"gitlab.env": "prod",
+			}
+
+			mergeStringMap(values, tc.Values)
+
+			options := &helm.Options{
+				ValuesFiles:    []string{},
+				SetValues:      values,
+				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName),
+			}
+
+			output, err := helm.RenderTemplateE(t, options, helmChartPath, tc.Release, []string{"templates/cronjob.yaml"})
+
+			if err != nil {
+				t.Error(err)
+				return
+			}
+
+			var cronjobs batchV1beta1.CronJobList
+			helm.UnmarshalK8SYaml(t, output, &cronjobs)
+
+			for _, cronjob := range cronjobs.Items {
+				require.Equal(t, tc.ExpectedResources, cronjob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Resources )
+			}
+		})
+	}
+}
+
 func TestCronjobTemplateWithVolumeMounts(t *testing.T) {
 	releaseName := "cronjob-with-volume-mounts-test"
 	templates := []string{"templates/cronjob.yaml"}
diff --git a/assets/auto-deploy-app/test/templates/deployment_test.go b/assets/auto-deploy-app/test/templates/deployment_test.go
index d807ce0..1ccdf2a 100644
--- a/assets/auto-deploy-app/test/templates/deployment_test.go
+++ b/assets/auto-deploy-app/test/templates/deployment_test.go
@@ -13,6 +13,7 @@ import (
 	coreV1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
+	"k8s.io/apimachinery/pkg/api/resource"
 )
 
 func TestDeploymentTemplate(t *testing.T) {
@@ -892,6 +893,70 @@ func TestDeploymentTemplate(t *testing.T) {
 		})
 	}
 
+	// resources
+	for _, tc := range []struct {
+		CaseName string
+		Values   map[string]string
+		Release  string
+
+		EoxpectedNodeSelector map[string]string
+		ExpectedResources     coreV1.ResourceRequirements
+	}{
+		{
+			CaseName: "default",
+			Release:  "production",
+			Values: map[string]string{},
+
+			ExpectedResources: coreV1.ResourceRequirements{
+				Limits:   coreV1.ResourceList(nil),
+				Requests: coreV1.ResourceList{},
+			},
+		},
+		{
+			CaseName: "added resources",
+			Release:  "production",
+			Values: map[string]string{
+				"resources.limits.cpu":      "500m",
+				"resources.limits.memory":   "4Gi",
+				"resources.requests.cpu":    "200m",
+				"resources.requests.memory": "2Gi",
+			},
+
+			ExpectedResources: coreV1.ResourceRequirements{
+				Limits:   coreV1.ResourceList{
+					"cpu": resource.MustParse("500m"),
+					"memory": resource.MustParse("4Gi"),},
+				Requests: coreV1.ResourceList{
+					"cpu": resource.MustParse("200m"),
+					"memory": resource.MustParse("2Gi"),
+				},
+			},
+		},
+	} {
+		t.Run(tc.CaseName, func(t *testing.T) {
+			namespaceName := "minimal-ruby-app-" + strings.ToLower(random.UniqueId())
+
+			values := map[string]string{
+				"gitlab.app": "auto-devops-examples/minimal-ruby-app",
+				"gitlab.env": "prod",
+			}
+
+			mergeStringMap(values, tc.Values)
+
+			options := &helm.Options{
+				SetValues:      values,
+				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName),
+			}
+
+			output := helm.RenderTemplate(t, options, helmChartPath, tc.Release, []string{"templates/deployment.yaml"})
+
+			var deployment appsV1.Deployment
+			helm.UnmarshalK8SYaml(t, output, &deployment)
+
+			require.Equal(t, tc.ExpectedResources, deployment.Spec.Template.Spec.Containers[0].Resources )
+		})
+	}
+
 	// Test Deployment selector
 	for _, tc := range []struct {
 		CaseName string
-- 
GitLab