1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-03-03 15:02:35 +02:00

added some tests, fixed CodeClimat findings

This commit is contained in:
Sascha Vornheder 2019-11-14 13:59:31 +01:00
parent 1a609e5418
commit e763194779
3 changed files with 240 additions and 26 deletions

View File

@ -81,8 +81,10 @@ func generateStepDocumentation(stepData config.StepData, docuHelperData DocuHelp
//create the file path for the template and open it.
docTemplateFilePath := fmt.Sprintf("%v%v.md", docuHelperData.DocTemplatePath, stepData.Metadata.Name)
docTemplate, err := docuHelperData.OpenDocTemplateFile(docTemplateFilePath)
defer docTemplate.Close()
if docTemplate != nil {
defer docTemplate.Close()
}
//check if there is an error during opening the template (true : skip docu generation for this meta data file)
if err != nil {
return fmt.Errorf("error occured: %v", err)
@ -316,34 +318,58 @@ func appendSecretsToParameters(stepData *config.StepData) {
}
}
func getDocuContextDefaults(m *config.StepData) map[string]string {
func getDocuContextDefaults(step *config.StepData) map[string]string {
var result map[string]string = make(map[string]string)
//creates the context defaults for containers
addContainerContent(step, result)
//creates the context defaults for sidecars
addSidecarContent(step, result)
//creates the context defaults for resources
addStashContent(step, result)
return result
}
func addContainerContent(m *config.StepData, result map[string]string) {
//creates the context defaults for containers
if len(m.Spec.Containers) > 0 {
keys := []string{}
resources := map[string][]string{}
bEmptyKey := true
for _, container := range m.Spec.Containers {
key := ""
if len(container.Conditions) > 0 {
key = fmt.Sprintf("%v=%v", container.Conditions[0].Params[0].Name, container.Conditions[0].Params[0].Value)
}
if len(container.Command) > 0 {
keys = append(keys, key+"_containerCommand")
if bEmptyKey || len(key) > 0 {
if len(container.Command) > 0 {
keys = append(keys, key+"_containerCommand")
}
if m.Metadata.Name == "dockerExecuteOnKubernetes" {
keys = append(keys, key+"_containerName")
}
keys = append(keys, key+"_containerShell")
keys = append(keys, key+"_dockerEnvVars")
keys = append(keys, key+"_dockerImage")
keys = append(keys, key+"_dockerName")
keys = append(keys, key+"_dockerPullImage")
keys = append(keys, key+"_dockerWorkspace")
}
if m.Metadata.Name == "dockerExecuteOnKubernetes" {
keys = append(keys, key+"_containerName")
if len(container.Conditions) == 0 {
bEmptyKey = false
}
keys = append(keys, key+"_containerShell")
keys = append(keys, key+"_dockerEnvVars")
keys = append(keys, key+"_dockerImage")
keys = append(keys, key+"_dockerName")
keys = append(keys, key+"_dockerPullImage")
keys = append(keys, key+"_dockerWorkspace")
workingDir := ifThenElse(len(container.WorkingDir) > 0, container.WorkingDir, "\\<empty\\>")
resources[key+"_containerShell"] = append(resources[key+"_containerShell"], container.Shell)
if len(container.Shell) > 0 {
resources[key+"_containerShell"] = append(resources[key+"_containerShell"], container.Shell)
}
resources[key+"_dockerName"] = append(resources[key+"_dockerName"], container.Name)
//Only for Step: dockerExecuteOnKubernetes
@ -358,7 +384,6 @@ func getDocuContextDefaults(m *config.StepData) map[string]string {
if len(container.ImagePullPolicy) > 0 {
resources[key+"_dockerPullImage"] = []string{fmt.Sprintf("%v", container.ImagePullPolicy != "Never")}
}
//Different when key is set (Param.Name + Param.Value)
if len(key) > 0 {
resources[key+"_dockerEnvVars"] = append(resources[key+"_dockerEnvVars"], fmt.Sprintf("%v:\\[%v\\]", key, strings.Join(envVarsAsStringSlice(container.EnvVars), "")))
@ -369,8 +394,6 @@ func getDocuContextDefaults(m *config.StepData) map[string]string {
resources[key+"_dockerImage"] = append(resources[key+"_dockerImage"], container.Image)
resources[key+"_dockerWorkspace"] = append(resources[key+"_dockerWorkspace"], workingDir)
}
// Ready command not relevant for main runtime container so far
//p[] = container.ReadyCommand
}
for _, key := range keys {
@ -384,7 +407,8 @@ func getDocuContextDefaults(m *config.StepData) map[string]string {
}
}
}
}
func addSidecarContent(m *config.StepData, result map[string]string) {
//creates the context defaults for sidecars
if len(m.Spec.Sidecars) > 0 {
if len(m.Spec.Sidecars[0].Command) > 0 {
@ -400,12 +424,9 @@ func getDocuContextDefaults(m *config.StepData) map[string]string {
result["sidecarWorkspace"] = m.Spec.Sidecars[0].WorkingDir
}
// not filled for now since this is not relevant in Kubernetes case
//p["dockerOptions"] = container.
//p["dockerVolumeBind"] = container.
//root["containerPortMappings"] = m.Spec.Sidecars[0].
//root["sidecarOptions"] = m.Spec.Sidecars[0].
//root["sidecarVolumeBind"] = m.Spec.Sidecars[0].
}
func addStashContent(m *config.StepData, result map[string]string) {
//creates the context defaults for resources
if len(m.Spec.Inputs.Resources) > 0 {
@ -437,8 +458,6 @@ func getDocuContextDefaults(m *config.StepData) map[string]string {
}
}
}
return result
}
func envVarsAsStringSlice(envVars []config.EnvVar) []string {

View File

@ -88,6 +88,63 @@ func configOpenDocTemplateFileMock(docTemplateFilePath string) (io.ReadCloser, e
}
}
var stepData config.StepData = config.StepData{
Spec: config.StepSpec{
Inputs: config.StepInputs{
Parameters: []config.StepParameters{
{Name: "param0", Scope: []string{"GENERAL"}, Type: "string", Default: "val0"},
},
Resources: []config.StepResources{
{Name: "resource0", Type: "stash", Description: "val0"},
{Name: "resource1", Type: "stash", Description: "val1"},
{Name: "resource2", Type: "stash", Description: "val2"},
},
},
Containers: []config.Container{
{Name: "container0", Image: "image", WorkingDir: "workingdir", Shell: "shell",
EnvVars: []config.EnvVar{
{"envar.name0", "envar.value0"},
},
},
{Name: "container1", Image: "image", WorkingDir: "workingdir",
EnvVars: []config.EnvVar{
{"envar.name1", "envar.value1"},
},
},
{Name: "container2a", Command: []string{"command"}, ImagePullPolicy: "pullpolicy", Image: "image", WorkingDir: "workingdir",
EnvVars: []config.EnvVar{
{"envar.name2a", "envar.value2a"}},
Conditions: []config.Condition{
{Params: []config.Param{
{"param.name2a", "param.value2a"},
}},
},
},
{Name: "container2b", Image: "image", WorkingDir: "workingdir",
EnvVars: []config.EnvVar{
{"envar.name2b", "envar.value2b"},
},
Conditions: []config.Condition{
{Params: []config.Param{
{"param.name2b", "param.value2b"},
}},
},
},
},
Sidecars: []config.Container{
{Name: "sidecar0", Command: []string{"command"}, ImagePullPolicy: "pullpolicy", Image: "image", WorkingDir: "workingdir", ReadyCommand: "readycommand",
EnvVars: []config.EnvVar{
{"envar.name3", "envar.value3"}},
Conditions: []config.Condition{
{Params: []config.Param{
{"param.name0", "param.value0"},
}},
},
},
},
},
}
var resultDocumentContent string
func docFileWriterMock(docTemplateFilePath string, data []byte, perm os.FileMode) error {
@ -124,3 +181,138 @@ func TestGenerateStepDocumentationError(t *testing.T) {
assert.Error(t, err, fmt.Sprintf("Error occured: %v\n", err))
})
}
func TestReadAndAdjustTemplate(t *testing.T) {
t.Run("Success Case", func(t *testing.T) {
tmpl, _ := configOpenDocTemplateFileMock("testStep.md")
content := readAndAdjustTemplate(tmpl)
cases := []struct {
x, y string
}{
{"{{docGenStepName .}}", "${docGenStepName}"},
{"{{docGenConfiguration .}}", "${docGenConfiguration}"},
{"{{docGenParameters .}}", "${docGenParameters}"},
{"{{docGenDescription .}}", "${docGenDescription}"},
{"", "${docJenkinsPluginDependencies}"},
}
for _, c := range cases {
if len(c.x) > 0 {
assert.Contains(t, content, c.x)
}
if len(c.y) > 0 {
assert.NotContains(t, content, c.y)
}
}
})
}
func TestAddContainerContent(t *testing.T) {
t.Run("Success Case", func(t *testing.T) {
var m map[string]string = make(map[string]string)
addContainerContent(&stepData, m)
assert.Equal(t, 7, len(m))
cases := []struct {
x, want string
}{
{"containerCommand", "command"},
{"containerShell", "shell"},
{"dockerEnvVars", "envar.name0=envar.value0, envar.name1=envar.value1 <br>param.name2a=param.value2a:\\[envar.name2a=envar.value2a\\] <br>param.name2b=param.value2b:\\[envar.name2b=envar.value2b\\]"},
{"dockerImage", "image, image <br>param.name2a=param.value2a:image <br>param.name2b=param.value2b:image"},
{"dockerName", "container0, container1 <br>container2a <br>container2b <br>"},
{"dockerPullImage", "true"},
{"dockerWorkspace", "workingdir, workingdir <br>param.name2a=param.value2a:workingdir <br>param.name2b=param.value2b:workingdir"},
}
for _, c := range cases {
assert.Contains(t, m, c.x)
assert.True(t, len(m[c.x]) > 0)
assert.True(t, strings.Contains(m[c.x], c.want), fmt.Sprintf("%v:%v", c.x, m[c.x]))
}
})
}
func TestAddSidecarContent(t *testing.T) {
t.Run("Success Case", func(t *testing.T) {
var m map[string]string = make(map[string]string)
addSidecarContent(&stepData, m)
assert.Equal(t, 7, len(m))
cases := []struct {
x, want string
}{
{"sidecarCommand", "command"},
{"sidecarEnvVars", "envar.name3=envar.value3"},
{"sidecarImage", "image"},
{"sidecarName", "sidecar0"},
{"sidecarPullImage", "true"},
{"sidecarReadyCommand", "readycommand"},
{"sidecarWorkspace", "workingdir"},
}
for _, c := range cases {
assert.Contains(t, m, c.x)
assert.True(t, len(m[c.x]) > 0)
assert.Equal(t, c.want, m[c.x], fmt.Sprintf("%v:%v", c.x, m[c.x]))
}
})
}
func TestAddStashContent(t *testing.T) {
t.Run("Success Case", func(t *testing.T) {
var m map[string]string = make(map[string]string)
addStashContent(&stepData, m)
assert.Equal(t, 1, len(m))
cases := []struct {
x, want string
}{
{"stashContent", "resource0, resource1, resource2"},
}
for _, c := range cases {
assert.Contains(t, m, c.x)
assert.True(t, len(m[c.x]) > 0)
assert.True(t, strings.Contains(m[c.x], c.want), fmt.Sprintf("%v:%v", c.x, m[c.x]))
}
})
}
func TestGetDocuContextDefaults(t *testing.T) {
t.Run("Success Case", func(t *testing.T) {
m := getDocuContextDefaults(&stepData)
assert.Equal(t, 15, len(m))
cases := []struct {
x, want string
}{
{"stashContent", "resource0, resource1, resource2"},
{"sidecarCommand", "command"},
{"sidecarEnvVars", "envar.name3=envar.value3"},
{"sidecarImage", "image"},
{"sidecarName", "sidecar0"},
{"sidecarPullImage", "true"},
{"sidecarReadyCommand", "readycommand"},
{"sidecarWorkspace", "workingdir"},
{"containerCommand", "command"},
{"containerShell", "shell"},
{"dockerEnvVars", "envar.name0=envar.value0, envar.name1=envar.value1 <br>param.name2a=param.value2a:\\[envar.name2a=envar.value2a\\] <br>param.name2b=param.value2b:\\[envar.name2b=envar.value2b\\]"},
{"dockerImage", "image, image <br>param.name2a=param.value2a:image <br>param.name2b=param.value2b:image"},
{"dockerName", "container0, container1 <br>container2a <br>container2b <br>"},
{"dockerPullImage", "true"},
{"dockerWorkspace", "workingdir, workingdir <br>param.name2a=param.value2a:workingdir <br>param.name2b=param.value2b:workingdir"},
}
for _, c := range cases {
assert.Contains(t, m, c.x)
assert.True(t, len(m[c.x]) > 0)
assert.True(t, strings.Contains(m[c.x], c.want), fmt.Sprintf("%v:%v", c.x, m[c.x]))
}
})
}

View File

@ -150,7 +150,10 @@ func ProcessMetaFiles(metadataFiles []string, openFile func(s string) (io.ReadCl
err = writeFile(fmt.Sprintf("cmd/%v_generated_test.go", stepData.Metadata.Name), test, 0644)
checkError(err)
} else {
generateStepDocumentation(stepData, docuHelperData)
err = generateStepDocumentation(stepData, docuHelperData)
if err != nil {
fmt.Printf("%v\n", err)
}
}
}
return nil