coder/cli/templatevariables_test.go

179 lines
5.0 KiB
Go

package cli_test
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
"github.com/coder/coder/v2/cli"
"github.com/coder/coder/v2/codersdk"
)
func TestDiscoverVarsFiles(t *testing.T) {
t.Parallel()
// Given
tempDir, err := os.MkdirTemp(os.TempDir(), "test-discover-vars-files-*")
require.NoError(t, err)
t.Cleanup(func() {
_ = os.RemoveAll(tempDir)
})
testFiles := []string{
"terraform.tfvars", // ok
"terraform.tfvars.json", // ok
"aaa.tf", // not Terraform vars
"bbb.tf", // not Terraform vars
"example.auto.tfvars", // ok
"example.auto.tfvars.bak", // not Terraform vars
"example.auto.tfvars.json", // ok
"example.auto.tfvars.json.bak", // not Terraform vars
"other_file.txt", // not Terraform vars
"random_file1.tfvars", // should be .auto.tfvars, otherwise ignored
"random_file2.tf", // not Terraform vars
"random_file2.tfvars.json", // should be .auto.tfvars.json, otherwise ignored
"random_file3.auto.tfvars", // ok
"random_file3.tf", // not Terraform vars
"random_file4.auto.tfvars.json", // ok
}
for _, file := range testFiles {
filePath := filepath.Join(tempDir, file)
err := os.WriteFile(filePath, []byte(""), 0o600)
require.NoError(t, err)
}
// When
found, err := cli.DiscoverVarsFiles(tempDir)
require.NoError(t, err)
// Then
expected := []string{
filepath.Join(tempDir, "terraform.tfvars"),
filepath.Join(tempDir, "terraform.tfvars.json"),
filepath.Join(tempDir, "example.auto.tfvars"),
filepath.Join(tempDir, "example.auto.tfvars.json"),
filepath.Join(tempDir, "random_file3.auto.tfvars"),
filepath.Join(tempDir, "random_file4.auto.tfvars.json"),
}
require.EqualValues(t, expected, found)
}
func TestParseVariableValuesFromVarsFiles(t *testing.T) {
t.Parallel()
// Given
const (
hclFilename1 = "file1.tfvars"
hclFilename2 = "file2.tfvars"
jsonFilename3 = "file3.tfvars.json"
jsonFilename4 = "file4.tfvars.json"
hclContent1 = `region = "us-east-1"
cores = 2`
hclContent2 = `region = "us-west-2"
go_image = ["1.19","1.20","1.21"]`
jsonContent3 = `{"cat": "foobar", "cores": 3}`
jsonContent4 = `{"dog": 4, "go_image": "[\"1.19\",\"1.20\"]"}`
)
// Prepare the .tfvars files
tempDir, err := os.MkdirTemp(os.TempDir(), "test-parse-variable-values-from-vars-files-*")
require.NoError(t, err)
t.Cleanup(func() {
_ = os.RemoveAll(tempDir)
})
err = os.WriteFile(filepath.Join(tempDir, hclFilename1), []byte(hclContent1), 0o600)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(tempDir, hclFilename2), []byte(hclContent2), 0o600)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(tempDir, jsonFilename3), []byte(jsonContent3), 0o600)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(tempDir, jsonFilename4), []byte(jsonContent4), 0o600)
require.NoError(t, err)
// When
actual, err := cli.ParseUserVariableValues([]string{
filepath.Join(tempDir, hclFilename1),
filepath.Join(tempDir, hclFilename2),
filepath.Join(tempDir, jsonFilename3),
filepath.Join(tempDir, jsonFilename4),
}, "", nil)
require.NoError(t, err)
// Then
expected := []codersdk.VariableValue{
{Name: "cat", Value: "foobar"},
{Name: "cores", Value: "3"},
{Name: "dog", Value: "4"},
{Name: "go_image", Value: "[\"1.19\",\"1.20\"]"},
{Name: "region", Value: "us-west-2"},
}
require.Equal(t, expected, actual)
}
func TestParseVariableValuesFromVarsFiles_InvalidJSON(t *testing.T) {
t.Parallel()
// Given
const (
jsonFilename = "file.tfvars.json"
jsonContent = `{"cat": "foobar", cores: 3}` // invalid content: no quotes around "cores"
)
// Prepare the .tfvars files
tempDir, err := os.MkdirTemp(os.TempDir(), "test-parse-variable-values-from-vars-files-invalid-json-*")
require.NoError(t, err)
t.Cleanup(func() {
_ = os.RemoveAll(tempDir)
})
err = os.WriteFile(filepath.Join(tempDir, jsonFilename), []byte(jsonContent), 0o600)
require.NoError(t, err)
// When
actual, err := cli.ParseUserVariableValues([]string{
filepath.Join(tempDir, jsonFilename),
}, "", nil)
// Then
require.Nil(t, actual)
require.Error(t, err)
require.Contains(t, err.Error(), "unable to parse JSON content")
}
func TestParseVariableValuesFromVarsFiles_InvalidHCL(t *testing.T) {
t.Parallel()
// Given
const (
hclFilename = "file.tfvars"
hclContent = `region = "us-east-1"
cores: 2`
)
// Prepare the .tfvars files
tempDir, err := os.MkdirTemp(os.TempDir(), "test-parse-variable-values-from-vars-files-invalid-hcl-*")
require.NoError(t, err)
t.Cleanup(func() {
_ = os.RemoveAll(tempDir)
})
err = os.WriteFile(filepath.Join(tempDir, hclFilename), []byte(hclContent), 0o600)
require.NoError(t, err)
// When
actual, err := cli.ParseUserVariableValues([]string{
filepath.Join(tempDir, hclFilename),
}, "", nil)
// Then
require.Nil(t, actual)
require.Error(t, err)
require.Contains(t, err.Error(), `use the equals sign "=" to introduce the argument value`)
}