mirror of
https://github.com/kubescape/kubescape.git
synced 2026-04-15 06:58:11 +00:00
133 lines
4.0 KiB
Go
133 lines
4.0 KiB
Go
package cautils
|
|
|
|
import (
|
|
_ "embed"
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/kubescape/opa-utils/objectsenvelopes/localworkload"
|
|
"github.com/stretchr/testify/suite"
|
|
)
|
|
|
|
type HelmChartTestSuite struct {
|
|
suite.Suite
|
|
helmChartPath string
|
|
expectedFiles []string
|
|
expectedDefaultValues map[string]interface{}
|
|
}
|
|
|
|
func TestHelmChartTestSuite(t *testing.T) {
|
|
suite.Run(t, new(HelmChartTestSuite))
|
|
}
|
|
|
|
func (s *HelmChartTestSuite) SetupSuite() {
|
|
o, _ := os.Getwd()
|
|
|
|
s.helmChartPath = filepath.Join(filepath.Dir(o), "..", "examples", "helm_chart")
|
|
|
|
s.expectedFiles = []string{
|
|
filepath.Join(s.helmChartPath, "templates", "clusterrolebinding.yaml"),
|
|
filepath.Join(s.helmChartPath, "templates", "clusterrole.yaml"),
|
|
filepath.Join(s.helmChartPath, "templates", "serviceaccount.yaml"),
|
|
filepath.Join(s.helmChartPath, "templates", "rolebinding.yaml"),
|
|
filepath.Join(s.helmChartPath, "templates", "role.yaml"),
|
|
filepath.Join(s.helmChartPath, "templates", "cronjob.yaml"),
|
|
}
|
|
|
|
var obj interface{}
|
|
file, _ := os.ReadFile(filepath.Join("testdata", "helm_expected_default_values.json"))
|
|
_ = json.Unmarshal([]byte(file), &obj)
|
|
s.expectedDefaultValues = obj.(map[string]interface{})
|
|
}
|
|
|
|
func (s *HelmChartTestSuite) TestInvalidHelmDirectory() {
|
|
_, err := NewHelmChart("/invalid_path")
|
|
s.Error(err)
|
|
}
|
|
|
|
func (s *HelmChartTestSuite) TestValidHelmDirectory() {
|
|
chart, err := NewHelmChart(s.helmChartPath)
|
|
s.NoError(err)
|
|
s.NotNil(chart)
|
|
}
|
|
|
|
func (s *HelmChartTestSuite) TestGetName() {
|
|
chart, _ := NewHelmChart(s.helmChartPath)
|
|
s.Equal("kubescape", chart.GetName())
|
|
}
|
|
|
|
func (s *HelmChartTestSuite) TestGetDefaultValues() {
|
|
chart, _ := NewHelmChart(s.helmChartPath)
|
|
|
|
values := chart.GetDefaultValues()
|
|
|
|
valuesJson, _ := json.Marshal(values)
|
|
expectedValuesJson, _ := json.Marshal(s.expectedDefaultValues)
|
|
|
|
s.JSONEq(string(valuesJson), string(expectedValuesJson))
|
|
}
|
|
|
|
func (s *HelmChartTestSuite) TestGetWorkloadsWithOverride() {
|
|
chart, err := NewHelmChart(s.helmChartPath)
|
|
s.NoError(err, "Expected a valid helm chart")
|
|
|
|
values := chart.GetDefaultValues()
|
|
|
|
// Default pullPolicy value = Always
|
|
pullPolicyValue := values["image"].(map[string]interface{})["pullPolicy"].(string)
|
|
s.Equal(pullPolicyValue, "Always")
|
|
|
|
// Override default value
|
|
values["image"].(map[string]interface{})["pullPolicy"] = "Never"
|
|
|
|
fileToWorkloads, errs := chart.GetWorkloads(values)
|
|
s.Len(errs, 0)
|
|
|
|
s.Lenf(fileToWorkloads, len(s.expectedFiles), "Expected %d files", len(s.expectedFiles))
|
|
|
|
for _, expectedFile := range s.expectedFiles {
|
|
s.Contains(fileToWorkloads, expectedFile)
|
|
s.FileExists(expectedFile)
|
|
s.GreaterOrEqualf(len(fileToWorkloads[expectedFile]), 1, "Expected at least one workload in %q", expectedFile)
|
|
|
|
for i := range fileToWorkloads[expectedFile] {
|
|
pathInWorkload := fileToWorkloads[expectedFile][i].(*localworkload.LocalWorkload).GetPath()
|
|
s.Equal(pathInWorkload, expectedFile, "Expected GetPath() to return a valid path on workload")
|
|
}
|
|
|
|
if strings.Contains(expectedFile, "cronjob.yaml") {
|
|
jsonBytes, _ := json.Marshal(fileToWorkloads[expectedFile][0].GetObject())
|
|
s.Contains(string(jsonBytes), "\"imagePullPolicy\":\"Never\"", "Expected to overriden value of imagePullPolicy to be 'Never'")
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *HelmChartTestSuite) TestGetWorkloadsMissingValue() {
|
|
chart, _ := NewHelmChart(s.helmChartPath)
|
|
|
|
values := chart.GetDefaultValues()
|
|
delete(values, "image")
|
|
|
|
fileToWorkloads, errs := chart.GetWorkloads(values)
|
|
s.Nil(fileToWorkloads)
|
|
s.Len(errs, 1, "Expected an error due to missing value")
|
|
|
|
expectedErrMsg := "<.Values.image.repository>: nil pointer"
|
|
s.Containsf(errs[0].Error(), expectedErrMsg, "expected error containing %q, got %q", expectedErrMsg, errs[0])
|
|
}
|
|
|
|
func (s *HelmChartTestSuite) TestIsHelmDirectory() {
|
|
ok, err := IsHelmDirectory(s.helmChartPath)
|
|
s.True(ok)
|
|
s.NoError(err)
|
|
|
|
o, _ := os.Getwd()
|
|
nonHelmDir := filepath.Join(filepath.Dir(o), "../examples/online-boutique")
|
|
ok, err = IsHelmDirectory(nonHelmDir)
|
|
s.False(ok)
|
|
s.Contains(err.Error(), "no Chart.yaml exists in directory")
|
|
}
|