mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
259 lines
6.8 KiB
Go
259 lines
6.8 KiB
Go
package util
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"path"
|
|
"testing"
|
|
|
|
"github.com/Infisical/infisical-merge/packages/models"
|
|
)
|
|
|
|
// References to self should return the value unaltered
|
|
func Test_SubstituteSecrets_When_ReferenceToSelf(t *testing.T) {
|
|
|
|
var tests = []struct {
|
|
Key string
|
|
Value string
|
|
ExpectedValue string
|
|
}{
|
|
{Key: "A", Value: "${A}", ExpectedValue: "${A}"},
|
|
{Key: "A", Value: "${A} ${A}", ExpectedValue: "${A} ${A}"},
|
|
{Key: "A", Value: "${A}${A}", ExpectedValue: "${A}${A}"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
secret := models.SingleEnvironmentVariable{
|
|
Key: test.Key,
|
|
Value: test.Value,
|
|
}
|
|
|
|
secrets := []models.SingleEnvironmentVariable{secret}
|
|
result := SubstituteSecrets(secrets)
|
|
|
|
if result[0].Value != test.ExpectedValue {
|
|
t.Errorf("Test_SubstituteSecrets_When_ReferenceToSelf: expected %s but got %s for input %s", test.ExpectedValue, result[0].Value, test.Value)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
func Test_SubstituteSecrets_When_ReferenceDoesNotExist(t *testing.T) {
|
|
|
|
var tests = []struct {
|
|
Key string
|
|
Value string
|
|
ExpectedValue string
|
|
}{
|
|
{Key: "A", Value: "${X}", ExpectedValue: "${X}"},
|
|
{Key: "A", Value: "${H}HELLO", ExpectedValue: "${H}HELLO"},
|
|
{Key: "A", Value: "${L}${S}", ExpectedValue: "${L}${S}"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
secret := models.SingleEnvironmentVariable{
|
|
Key: test.Key,
|
|
Value: test.Value,
|
|
}
|
|
|
|
secrets := []models.SingleEnvironmentVariable{secret}
|
|
result := SubstituteSecrets(secrets)
|
|
|
|
if result[0].Value != test.ExpectedValue {
|
|
t.Errorf("Test_SubstituteSecrets_When_ReferenceToSelf: expected %s but got %s for input %s", test.ExpectedValue, result[0].Value, test.Value)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
func Test_SubstituteSecrets_When_ReferenceDoesNotExist_And_Self_Referencing(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
Key string
|
|
Value string
|
|
ExpectedValue string
|
|
}{
|
|
{
|
|
Key: "O",
|
|
Value: "${P} ==$$ ${X} ${UNKNOWN} ${A}",
|
|
ExpectedValue: "DOMAIN === ${A} DOMAIN >>> ==$$ DOMAIN ${UNKNOWN} ${A}",
|
|
},
|
|
{
|
|
Key: "X",
|
|
Value: "DOMAIN",
|
|
ExpectedValue: "DOMAIN",
|
|
},
|
|
{
|
|
Key: "A",
|
|
Value: "*${A}* ${X}",
|
|
ExpectedValue: "*${A}* DOMAIN",
|
|
},
|
|
{
|
|
Key: "H",
|
|
Value: "${X} >>>",
|
|
ExpectedValue: "DOMAIN >>>",
|
|
},
|
|
{
|
|
Key: "P",
|
|
Value: "DOMAIN === ${A} ${H}",
|
|
ExpectedValue: "DOMAIN === ${A} DOMAIN >>>",
|
|
},
|
|
{
|
|
Key: "T",
|
|
Value: "${P} ==$$ ${X} ${UNKNOWN} ${A} ${P} ==$$ ${X} ${UNKNOWN} ${A}",
|
|
ExpectedValue: "DOMAIN === ${A} DOMAIN >>> ==$$ DOMAIN ${UNKNOWN} ${A} DOMAIN === ${A} DOMAIN >>> ==$$ DOMAIN ${UNKNOWN} ${A}",
|
|
},
|
|
{
|
|
Key: "S",
|
|
Value: "${ SSS$$ ${HEY}",
|
|
ExpectedValue: "${ SSS$$ ${HEY}",
|
|
},
|
|
}
|
|
|
|
secrets := []models.SingleEnvironmentVariable{}
|
|
for _, test := range tests {
|
|
secrets = append(secrets, models.SingleEnvironmentVariable{Key: test.Key, Value: test.Value})
|
|
}
|
|
|
|
results := SubstituteSecrets(secrets)
|
|
|
|
for index, expanded := range results {
|
|
if expanded.Value != tests[index].ExpectedValue {
|
|
t.Errorf("Test_SubstituteSecrets_When_ReferenceToSelf: expected [%s] but got [%s] for input [%s]", tests[index].ExpectedValue, expanded.Value, tests[index].Value)
|
|
}
|
|
}
|
|
}
|
|
|
|
func Test_SubstituteSecrets_When_No_SubstituteNeeded(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
Key string
|
|
Value string
|
|
ExpectedValue string
|
|
}{
|
|
{
|
|
Key: "DOMAIN",
|
|
Value: "infisical.com",
|
|
ExpectedValue: "infisical.com",
|
|
},
|
|
{
|
|
Key: "API_KEY",
|
|
Value: "hdgsvjshcgkdckhevdkd",
|
|
ExpectedValue: "hdgsvjshcgkdckhevdkd",
|
|
},
|
|
{
|
|
Key: "ENV",
|
|
Value: "PROD",
|
|
ExpectedValue: "PROD",
|
|
},
|
|
}
|
|
|
|
secrets := []models.SingleEnvironmentVariable{}
|
|
for _, test := range tests {
|
|
secrets = append(secrets, models.SingleEnvironmentVariable{Key: test.Key, Value: test.Value})
|
|
}
|
|
|
|
results := SubstituteSecrets(secrets)
|
|
|
|
for index, expanded := range results {
|
|
if expanded.Value != tests[index].ExpectedValue {
|
|
t.Errorf("Test_SubstituteSecrets_When_ReferenceToSelf: expected [%s] but got [%s] for input [%s]", tests[index].ExpectedValue, expanded.Value, tests[index].Value)
|
|
}
|
|
}
|
|
}
|
|
|
|
func Test_Read_Env_From_File(t *testing.T) {
|
|
type testCase struct {
|
|
TestFile string
|
|
ExpectedEnv string
|
|
}
|
|
|
|
var cases = []testCase{
|
|
{
|
|
TestFile: "testdata/infisical-default-env.json",
|
|
ExpectedEnv: "myDefaultEnv",
|
|
},
|
|
{
|
|
TestFile: "testdata/infisical-branch-env.json",
|
|
ExpectedEnv: "myMainEnv",
|
|
},
|
|
{
|
|
TestFile: "testdata/infisical-no-matching-branch-env.json",
|
|
ExpectedEnv: "myDefaultEnv",
|
|
},
|
|
}
|
|
|
|
// create a tmp directory for testing
|
|
testDir, err := os.MkdirTemp(os.TempDir(), "infisical-test")
|
|
if err != nil {
|
|
t.Errorf("Test_Read_DefaultEnv_From_File: Failed to create temp directory: %s", err)
|
|
}
|
|
|
|
// safe the current working directory
|
|
originalDir, err := os.Getwd()
|
|
if err != nil {
|
|
t.Errorf("Test_Read_DefaultEnv_From_File: Failed to get current working directory: %s", err)
|
|
}
|
|
|
|
// backup the original git command
|
|
originalGitCmd := getCurrentBranchCmd
|
|
|
|
// make sure to clean up after the test
|
|
t.Cleanup(func() {
|
|
os.Chdir(originalDir)
|
|
os.RemoveAll(testDir)
|
|
getCurrentBranchCmd = originalGitCmd
|
|
})
|
|
|
|
// mock the git command to return "main" as the current branch
|
|
getCurrentBranchCmd = execCmd{cmd: "echo", args: []string{"main"}}
|
|
|
|
for _, c := range cases {
|
|
// make sure we start in the original directory
|
|
err = os.Chdir(originalDir)
|
|
if err != nil {
|
|
t.Errorf("Test_Read_DefaultEnv_From_File: Failed to change working directory: %s", err)
|
|
}
|
|
|
|
// remove old test file if it exists
|
|
err = os.Remove(path.Join(testDir, INFISICAL_WORKSPACE_CONFIG_FILE_NAME))
|
|
if err != nil && !os.IsNotExist(err) {
|
|
t.Errorf("Test_Read_DefaultEnv_From_File: Failed to remove old test file: %s", err)
|
|
}
|
|
|
|
// deploy the test file
|
|
copyTestFile(t, c.TestFile, path.Join(testDir, INFISICAL_WORKSPACE_CONFIG_FILE_NAME))
|
|
|
|
// change the working directory to the tmp directory
|
|
err = os.Chdir(testDir)
|
|
if err != nil {
|
|
t.Errorf("Test_Read_DefaultEnv_From_File: Failed to change working directory: %s", err)
|
|
}
|
|
|
|
// get env from file
|
|
env := GetEnvFromWorkspaceFile()
|
|
if env != c.ExpectedEnv {
|
|
t.Errorf("Test_Read_DefaultEnv_From_File: Expected env to be %s but got %s", c.ExpectedEnv, env)
|
|
}
|
|
}
|
|
}
|
|
|
|
func copyTestFile(t *testing.T, src, dst string) {
|
|
srcFile, err := os.Open(src)
|
|
if err != nil {
|
|
t.Errorf("Test_Read_Env_From_File_By_Branch: Failed to open source file: %s", err)
|
|
}
|
|
defer srcFile.Close()
|
|
|
|
dstFile, err := os.Create(dst)
|
|
if err != nil {
|
|
t.Errorf("Test_Read_Env_From_File_By_Branch: Failed to create destination file: %s", err)
|
|
}
|
|
defer dstFile.Close()
|
|
|
|
_, err = io.Copy(dstFile, srcFile)
|
|
if err != nil {
|
|
t.Errorf("Test_Read_Env_From_File_By_Branch: Failed to copy file: %s", err)
|
|
}
|
|
}
|