1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/cmd/terraformExecute_test.go
Jk1484 ffc931aad1
feat(golangBuild): use 'unit' build tag to include tests during test execution (#4345)
* Added unit tag as argument. Added description to runTests command. Changed code generator to have unit build tag in generated unit test files.

* Added unit build tag to all unit test files.

* added to new unit test unit build tag

* Update verify-go.yml

* small fix

---------

Co-authored-by: Muhammadali Nazarov <Muhammadali.Nazarov@acronis.com>
Co-authored-by: Christopher Fenner <26137398+CCFenner@users.noreply.github.com>
2023-05-03 21:02:11 +05:00

162 lines
4.3 KiB
Go

//go:build unit
// +build unit
package cmd
import (
"fmt"
"github.com/SAP/jenkins-library/pkg/mock"
"github.com/stretchr/testify/assert"
"testing"
)
type terraformExecuteMockUtils struct {
*mock.ExecMockRunner
*mock.FilesMock
}
func newTerraformExecuteTestsUtils() terraformExecuteMockUtils {
utils := terraformExecuteMockUtils{
ExecMockRunner: &mock.ExecMockRunner{},
FilesMock: &mock.FilesMock{},
}
return utils
}
func TestRunTerraformExecute(t *testing.T) {
t.Parallel()
tt := []struct {
terraformExecuteOptions
expectedArgs []string
expectedEnvVars []string
}{
{
terraformExecuteOptions{
Command: "apply",
}, []string{"apply", "-auto-approve", "-no-color"}, []string{},
},
{
terraformExecuteOptions{
Command: "apply",
TerraformSecrets: "/tmp/test",
}, []string{"apply", "-auto-approve", "-var-file=/tmp/test", "-no-color"}, []string{},
},
{
terraformExecuteOptions{
Command: "plan",
}, []string{"plan", "-no-color"}, []string{},
},
{
terraformExecuteOptions{
Command: "plan",
TerraformSecrets: "/tmp/test",
}, []string{"plan", "-var-file=/tmp/test", "-no-color"}, []string{},
},
{
terraformExecuteOptions{
Command: "plan",
TerraformSecrets: "/tmp/test",
AdditionalArgs: []string{"-arg1"},
}, []string{"plan", "-var-file=/tmp/test", "-no-color", "-arg1"}, []string{},
},
{
terraformExecuteOptions{
Command: "apply",
TerraformSecrets: "/tmp/test",
AdditionalArgs: []string{"-arg1"},
}, []string{"apply", "-auto-approve", "-var-file=/tmp/test", "-no-color", "-arg1"}, []string{},
},
{
terraformExecuteOptions{
Command: "apply",
TerraformSecrets: "/tmp/test",
AdditionalArgs: []string{"-arg1"},
GlobalOptions: []string{"-chgdir=src"},
}, []string{"-chgdir=src", "apply", "-auto-approve", "-var-file=/tmp/test", "-no-color", "-arg1"}, []string{},
},
{
terraformExecuteOptions{
Command: "apply",
Init: true,
}, []string{"apply", "-auto-approve", "-no-color"}, []string{},
},
{
terraformExecuteOptions{
Command: "apply",
GlobalOptions: []string{"-chgdir=src"},
Init: true,
}, []string{"-chgdir=src", "apply", "-auto-approve", "-no-color"}, []string{},
},
{
terraformExecuteOptions{
Command: "apply",
CliConfigFile: ".pipeline/.terraformrc",
}, []string{"apply", "-auto-approve", "-no-color"}, []string{"TF_CLI_CONFIG_FILE=.pipeline/.terraformrc"},
},
{
terraformExecuteOptions{
Command: "plan",
Workspace: "any-workspace",
}, []string{"plan", "-no-color"}, []string{"TF_WORKSPACE=any-workspace"},
},
}
for i, test := range tt {
t.Run(fmt.Sprintf("That arguments are correct %d", i), func(t *testing.T) {
t.Parallel()
// init
config := test.terraformExecuteOptions
utils := newTerraformExecuteTestsUtils()
utils.StdoutReturn = map[string]string{}
utils.StdoutReturn["terraform output -json"] = "{}"
utils.StdoutReturn["terraform -chgdir=src output -json"] = "{}"
runner := utils.ExecMockRunner
// test
err := runTerraformExecute(&config, nil, utils, &terraformExecuteCommonPipelineEnvironment{})
// assert
assert.NoError(t, err)
if config.Init {
assert.Equal(t, mock.ExecCall{Exec: "terraform", Params: append(config.GlobalOptions, "init", "-no-color")}, utils.Calls[0])
assert.Equal(t, mock.ExecCall{Exec: "terraform", Params: test.expectedArgs}, utils.Calls[1])
} else {
assert.Equal(t, mock.ExecCall{Exec: "terraform", Params: test.expectedArgs}, utils.Calls[0])
}
assert.Subset(t, runner.Env, test.expectedEnvVars)
})
}
t.Run("Outputs get injected into CPE", func(t *testing.T) {
t.Parallel()
cpe := terraformExecuteCommonPipelineEnvironment{}
config := terraformExecuteOptions{
Command: "plan",
}
utils := newTerraformExecuteTestsUtils()
utils.StdoutReturn = map[string]string{}
utils.StdoutReturn["terraform output -json"] = `{
"sample_var": {
"sensitive": true,
"value": "a secret value",
"type": "string"
}
}
`
// test
err := runTerraformExecute(&config, nil, utils, &cpe)
// assert
assert.NoError(t, err)
assert.Equal(t, 1, len(cpe.custom.terraformOutputs))
assert.Equal(t, "a secret value", cpe.custom.terraformOutputs["sample_var"])
})
}