2019-11-13 15:34:04 +02:00
|
|
|
package helper
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/SAP/jenkins-library/pkg/config"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func configOpenFileMock(name string) (io.ReadCloser, error) {
|
|
|
|
meta1 := `metadata:
|
|
|
|
name: testStep
|
|
|
|
description: Test description
|
|
|
|
longDescription: |
|
|
|
|
Long Test description
|
|
|
|
spec:
|
|
|
|
inputs:
|
|
|
|
params:
|
|
|
|
- name: param0
|
|
|
|
type: string
|
|
|
|
description: param0 description
|
|
|
|
default: val0
|
|
|
|
scope:
|
|
|
|
- GENERAL
|
|
|
|
- PARAMETERS
|
|
|
|
mandatory: true
|
|
|
|
- name: param1
|
|
|
|
type: string
|
|
|
|
description: param1 description
|
|
|
|
scope:
|
|
|
|
- PARAMETERS
|
|
|
|
- name: param2
|
|
|
|
type: string
|
|
|
|
description: param1 description
|
|
|
|
scope:
|
|
|
|
- PARAMETERS
|
|
|
|
mandatory: true
|
|
|
|
`
|
|
|
|
var r string
|
|
|
|
switch name {
|
|
|
|
case "test.yaml":
|
|
|
|
r = meta1
|
|
|
|
default:
|
|
|
|
r = ""
|
|
|
|
}
|
|
|
|
return ioutil.NopCloser(strings.NewReader(r)), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var files map[string][]byte
|
|
|
|
|
|
|
|
func writeFileMock(filename string, data []byte, perm os.FileMode) error {
|
|
|
|
if files == nil {
|
|
|
|
files = make(map[string][]byte)
|
|
|
|
}
|
|
|
|
files[filename] = data
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestProcessMetaFiles(t *testing.T) {
|
|
|
|
|
|
|
|
ProcessMetaFiles([]string{"test.yaml"}, configOpenFileMock, writeFileMock, "", DocuHelperData{IsGenerateDocu: false})
|
|
|
|
|
|
|
|
t.Run("step code", func(t *testing.T) {
|
|
|
|
goldenFilePath := filepath.Join("testdata", t.Name()+"_generated.golden")
|
|
|
|
expected, err := ioutil.ReadFile(goldenFilePath)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed reading %v", goldenFilePath)
|
|
|
|
}
|
|
|
|
assert.Equal(t, expected, files["cmd/testStep_generated.go"])
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("test code", func(t *testing.T) {
|
|
|
|
goldenFilePath := filepath.Join("testdata", t.Name()+"_generated.golden")
|
|
|
|
expected, err := ioutil.ReadFile(goldenFilePath)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed reading %v", goldenFilePath)
|
|
|
|
}
|
|
|
|
assert.Equal(t, expected, files["cmd/testStep_generated_test.go"])
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSetDefaultParameters(t *testing.T) {
|
|
|
|
t.Run("success case", func(t *testing.T) {
|
|
|
|
stepData := config.StepData{
|
|
|
|
Spec: config.StepSpec{
|
|
|
|
Inputs: config.StepInputs{
|
|
|
|
Parameters: []config.StepParameters{
|
|
|
|
{Name: "param0", Scope: []string{"GENERAL"}, Type: "string", Default: "val0"},
|
|
|
|
{Name: "param1", Scope: []string{"STEPS"}, Type: "string"},
|
|
|
|
{Name: "param2", Scope: []string{"STAGES"}, Type: "bool", Default: true},
|
|
|
|
{Name: "param3", Scope: []string{"PARAMETERS"}, Type: "bool"},
|
|
|
|
{Name: "param4", Scope: []string{"ENV"}, Type: "[]string", Default: []string{"val4_1", "val4_2"}},
|
|
|
|
{Name: "param5", Scope: []string{"ENV"}, Type: "[]string"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
expected := []string{
|
|
|
|
"\"val0\"",
|
|
|
|
"os.Getenv(\"PIPER_param1\")",
|
|
|
|
"true",
|
|
|
|
"false",
|
|
|
|
"[]string{\"val4_1\", \"val4_2\"}",
|
|
|
|
"[]string{}",
|
|
|
|
}
|
|
|
|
|
|
|
|
osImport, err := setDefaultParameters(&stepData)
|
|
|
|
|
|
|
|
assert.NoError(t, err, "error occured but none expected")
|
|
|
|
|
|
|
|
assert.Equal(t, true, osImport, "import of os package required")
|
|
|
|
|
|
|
|
for k, v := range expected {
|
|
|
|
assert.Equal(t, v, stepData.Spec.Inputs.Parameters[k].Default, fmt.Sprintf("default not correct for parameter %v", k))
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("error case", func(t *testing.T) {
|
|
|
|
stepData := []config.StepData{
|
|
|
|
{
|
|
|
|
Spec: config.StepSpec{
|
|
|
|
Inputs: config.StepInputs{
|
|
|
|
Parameters: []config.StepParameters{
|
|
|
|
{Name: "param0", Scope: []string{"GENERAL"}, Type: "int", Default: 10},
|
|
|
|
{Name: "param1", Scope: []string{"GENERAL"}, Type: "int"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Spec: config.StepSpec{
|
|
|
|
Inputs: config.StepInputs{
|
|
|
|
Parameters: []config.StepParameters{
|
|
|
|
{Name: "param1", Scope: []string{"GENERAL"}, Type: "int"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for k, v := range stepData {
|
|
|
|
_, err := setDefaultParameters(&v)
|
|
|
|
assert.Error(t, err, fmt.Sprintf("error expected but none occured for parameter %v", k))
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetStepInfo(t *testing.T) {
|
|
|
|
|
|
|
|
stepData := config.StepData{
|
|
|
|
Metadata: config.StepMetadata{
|
|
|
|
Name: "testStep",
|
|
|
|
Description: "Test description",
|
|
|
|
LongDescription: "Long Test description",
|
|
|
|
},
|
|
|
|
Spec: config.StepSpec{
|
|
|
|
Inputs: config.StepInputs{
|
|
|
|
Parameters: []config.StepParameters{
|
|
|
|
{Name: "param0", Scope: []string{"GENERAL"}, Type: "string", Default: "test"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
myStepInfo := getStepInfo(&stepData, true, "")
|
|
|
|
|
|
|
|
assert.Equal(t, "testStep", myStepInfo.StepName, "StepName incorrect")
|
|
|
|
assert.Equal(t, "TestStepCommand", myStepInfo.CobraCmdFuncName, "CobraCmdFuncName incorrect")
|
|
|
|
assert.Equal(t, "createTestStepCmd", myStepInfo.CreateCmdVar, "CreateCmdVar incorrect")
|
|
|
|
assert.Equal(t, "Test description", myStepInfo.Short, "Short incorrect")
|
|
|
|
assert.Equal(t, "Long Test description", myStepInfo.Long, "Long incorrect")
|
|
|
|
assert.Equal(t, stepData.Spec.Inputs.Parameters, myStepInfo.Metadata, "Metadata incorrect")
|
|
|
|
assert.Equal(t, "addTestStepFlags", myStepInfo.FlagsFunc, "FlagsFunc incorrect")
|
|
|
|
assert.Equal(t, "addTestStepFlags", myStepInfo.FlagsFunc, "FlagsFunc incorrect")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLongName(t *testing.T) {
|
|
|
|
tt := []struct {
|
|
|
|
input string
|
|
|
|
expected string
|
|
|
|
}{
|
|
|
|
{input: "my long name with no ticks", expected: "my long name with no ticks"},
|
|
|
|
{input: "my long name with `ticks`", expected: "my long name with ` + \"`\" + `ticks` + \"`\" + `"},
|
|
|
|
}
|
|
|
|
|
|
|
|
for k, v := range tt {
|
|
|
|
assert.Equal(t, v.expected, longName(v.input), fmt.Sprintf("wrong long name for run %v", k))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGolangName(t *testing.T) {
|
|
|
|
tt := []struct {
|
|
|
|
input string
|
|
|
|
expected string
|
|
|
|
}{
|
|
|
|
{input: "testApi", expected: "TestAPI"},
|
|
|
|
{input: "apiTest", expected: "APITest"},
|
|
|
|
{input: "testUrl", expected: "TestURL"},
|
|
|
|
{input: "testId", expected: "TestID"},
|
|
|
|
{input: "testJson", expected: "TestJSON"},
|
|
|
|
{input: "jsonTest", expected: "JSONTest"},
|
|
|
|
}
|
|
|
|
|
|
|
|
for k, v := range tt {
|
|
|
|
assert.Equal(t, v.expected, golangName(v.input), fmt.Sprintf("wrong golang name for run %v", k))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFlagType(t *testing.T) {
|
|
|
|
tt := []struct {
|
|
|
|
input string
|
|
|
|
expected string
|
|
|
|
}{
|
|
|
|
{input: "bool", expected: "BoolVar"},
|
|
|
|
{input: "string", expected: "StringVar"},
|
|
|
|
{input: "[]string", expected: "StringSliceVar"},
|
|
|
|
}
|
|
|
|
|
|
|
|
for k, v := range tt {
|
|
|
|
assert.Equal(t, v.expected, flagType(v.input), fmt.Sprintf("wrong flag type for run %v", k))
|
|
|
|
}
|
|
|
|
}
|