diff --git a/cli/packages/cmd/export.go b/cli/packages/cmd/export.go index 649de41f2..d99686aeb 100644 --- a/cli/packages/cmd/export.go +++ b/cli/packages/cmd/export.go @@ -38,7 +38,7 @@ var exportCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { environmentName, _ := cmd.Flags().GetString("env") if !cmd.Flags().Changed("env") { - environmentFromWorkspace := util.GetEnvelopmentBasedOnGitBranch() + environmentFromWorkspace := util.GetEnvFromWorkspaceFile() if environmentFromWorkspace != "" { environmentName = environmentFromWorkspace } diff --git a/cli/packages/cmd/run.go b/cli/packages/cmd/run.go index f70d29726..c04a12d58 100644 --- a/cli/packages/cmd/run.go +++ b/cli/packages/cmd/run.go @@ -56,7 +56,7 @@ var runCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { environmentName, _ := cmd.Flags().GetString("env") if !cmd.Flags().Changed("env") { - environmentFromWorkspace := util.GetEnvelopmentBasedOnGitBranch() + environmentFromWorkspace := util.GetEnvFromWorkspaceFile() if environmentFromWorkspace != "" { environmentName = environmentFromWorkspace } diff --git a/cli/packages/cmd/secrets.go b/cli/packages/cmd/secrets.go index 625152aa9..b6805ed50 100644 --- a/cli/packages/cmd/secrets.go +++ b/cli/packages/cmd/secrets.go @@ -32,7 +32,7 @@ var secretsCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { environmentName, _ := cmd.Flags().GetString("env") if !cmd.Flags().Changed("env") { - environmentFromWorkspace := util.GetEnvelopmentBasedOnGitBranch() + environmentFromWorkspace := util.GetEnvFromWorkspaceFile() if environmentFromWorkspace != "" { environmentName = environmentFromWorkspace } @@ -98,7 +98,7 @@ var secretsSetCmd = &cobra.Command{ environmentName, _ := cmd.Flags().GetString("env") if !cmd.Flags().Changed("env") { - environmentFromWorkspace := util.GetEnvelopmentBasedOnGitBranch() + environmentFromWorkspace := util.GetEnvFromWorkspaceFile() if environmentFromWorkspace != "" { environmentName = environmentFromWorkspace } @@ -277,7 +277,7 @@ var secretsDeleteCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { environmentName, _ := cmd.Flags().GetString("env") if !cmd.Flags().Changed("env") { - environmentFromWorkspace := util.GetEnvelopmentBasedOnGitBranch() + environmentFromWorkspace := util.GetEnvFromWorkspaceFile() if environmentFromWorkspace != "" { environmentName = environmentFromWorkspace } @@ -338,7 +338,7 @@ var secretsDeleteCmd = &cobra.Command{ func getSecretsByNames(cmd *cobra.Command, args []string) { environmentName, _ := cmd.Flags().GetString("env") if !cmd.Flags().Changed("env") { - environmentFromWorkspace := util.GetEnvelopmentBasedOnGitBranch() + environmentFromWorkspace := util.GetEnvFromWorkspaceFile() if environmentFromWorkspace != "" { environmentName = environmentFromWorkspace } @@ -384,7 +384,7 @@ func getSecretsByNames(cmd *cobra.Command, args []string) { func generateExampleEnv(cmd *cobra.Command, args []string) { environmentName, _ := cmd.Flags().GetString("env") if !cmd.Flags().Changed("env") { - environmentFromWorkspace := util.GetEnvelopmentBasedOnGitBranch() + environmentFromWorkspace := util.GetEnvFromWorkspaceFile() if environmentFromWorkspace != "" { environmentName = environmentFromWorkspace } diff --git a/cli/packages/util/helper.go b/cli/packages/util/helper.go index 8d70e9e0a..59f245fc1 100644 --- a/cli/packages/util/helper.go +++ b/cli/packages/util/helper.go @@ -115,8 +115,20 @@ func GetHashFromStringList(list []string) string { return fmt.Sprintf("%x", sum) } +// execCmd is a struct that holds the command and arguments to be executed. +// By using this struct, we can easily mock the command and arguments. +type execCmd struct { + cmd string + args []string +} + +var getCurrentBranchCmd = execCmd{ + cmd: "git", + args: []string{"symbolic-ref", "--short", "HEAD"}, +} + func getCurrentBranch() (string, error) { - cmd := exec.Command("git", "symbolic-ref", "--short", "HEAD") + cmd := exec.Command(getCurrentBranchCmd.cmd, getCurrentBranchCmd.args...) var out bytes.Buffer cmd.Stdout = &out err := cmd.Run() diff --git a/cli/packages/util/secrets.go b/cli/packages/util/secrets.go index 95065de66..5d78e65e2 100644 --- a/cli/packages/util/secrets.go +++ b/cli/packages/util/secrets.go @@ -482,21 +482,29 @@ func DeleteBackupSecrets() error { return os.RemoveAll(fullPathToSecretsBackupFolder) } -func GetEnvelopmentBasedOnGitBranch() string { +func GetEnvFromWorkspaceFile() string { + workspaceFile, err := GetWorkSpaceFromFile() + if err != nil { + log.Debugf("getEnvFromWorkspaceFile: [err=%s]", err) + return "" + } + + if env := GetEnvelopmentBasedOnGitBranch(workspaceFile); env != "" { + return env + } + + return workspaceFile.DefaultEnvironment +} + +func GetEnvelopmentBasedOnGitBranch(workspaceFile models.WorkspaceConfigFile) string { branch, err := getCurrentBranch() if err != nil { log.Debugf("getEnvelopmentBasedOnGitBranch: [err=%s]", err) } - workspaceFile, err := GetWorkSpaceFromFile() - if err != nil { - log.Debugf("getEnvelopmentBasedOnGitBranch: [err=%s]", err) - return "" - } - envBasedOnGitBranch, ok := workspaceFile.GitBranchToEnvironmentMapping[branch] - log.Debugf("GetEnvelopmentBasedOnGitBranch: [envBasedOnGitBranch=%s] [ok=%s]", envBasedOnGitBranch, ok) + log.Debugf("GetEnvelopmentBasedOnGitBranch: [envBasedOnGitBranch=%s] [ok=%t]", envBasedOnGitBranch, ok) if err == nil && ok { return envBasedOnGitBranch diff --git a/cli/packages/util/secrets_test.go b/cli/packages/util/secrets_test.go index 513e4f7e3..c63b96be9 100644 --- a/cli/packages/util/secrets_test.go +++ b/cli/packages/util/secrets_test.go @@ -1,6 +1,9 @@ package util import ( + "io" + "os" + "path" "testing" "github.com/Infisical/infisical-merge/packages/models" @@ -158,3 +161,98 @@ func Test_SubstituteSecrets_When_No_SubstituteNeeded(t *testing.T) { } } } + +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) + } +} diff --git a/cli/packages/util/testdata/infisical-branch-env.json b/cli/packages/util/testdata/infisical-branch-env.json new file mode 100644 index 000000000..657d68cd9 --- /dev/null +++ b/cli/packages/util/testdata/infisical-branch-env.json @@ -0,0 +1,7 @@ +{ + "workspaceId": "12345678", + "defaultEnvironment": "myDefaultEnv", + "gitBranchToEnvironmentMapping": { + "main": "myMainEnv" + } +} \ No newline at end of file diff --git a/cli/packages/util/testdata/infisical-default-env.json b/cli/packages/util/testdata/infisical-default-env.json new file mode 100644 index 000000000..63d37ad87 --- /dev/null +++ b/cli/packages/util/testdata/infisical-default-env.json @@ -0,0 +1,5 @@ +{ + "workspaceId": "12345678", + "defaultEnvironment": "myDefaultEnv", + "gitBranchToEnvironmentMapping": null +} \ No newline at end of file diff --git a/cli/packages/util/testdata/infisical-no-matching-branch-env.json b/cli/packages/util/testdata/infisical-no-matching-branch-env.json new file mode 100644 index 000000000..101dc61d6 --- /dev/null +++ b/cli/packages/util/testdata/infisical-no-matching-branch-env.json @@ -0,0 +1,7 @@ +{ + "workspaceId": "12345678", + "defaultEnvironment": "myDefaultEnv", + "gitBranchToEnvironmentMapping": { + "notmain": "myMainEnv" + } +} \ No newline at end of file