summaryrefslogtreecommitdiffstats
path: root/pkg/commands/files_test.go
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2021-04-10 16:01:46 +1000
committerJesse Duffield <jessedduffield@gmail.com>2021-04-11 17:07:49 +1000
commitbb918b579a3073d786fda83a2bc11c602e442aa0 (patch)
treefe126f12a88db9a9e119d0b172c0902bc0f49244 /pkg/commands/files_test.go
parente145090046e1693e2100cb0a0ab40a271705f4b0 (diff)
start adding support for logging of commands
Diffstat (limited to 'pkg/commands/files_test.go')
-rw-r--r--pkg/commands/files_test.go381
1 files changed, 380 insertions, 1 deletions
diff --git a/pkg/commands/files_test.go b/pkg/commands/files_test.go
index 62aa388cb..20c18a9a0 100644
--- a/pkg/commands/files_test.go
+++ b/pkg/commands/files_test.go
@@ -2,6 +2,7 @@ package commands
import (
"fmt"
+ "io/ioutil"
"os/exec"
"runtime"
"testing"
@@ -323,7 +324,7 @@ func TestGitCommandDiscardAllFileChanges(t *testing.T) {
var cmdsCalled *[][]string
gitCmd := NewDummyGitCommand()
gitCmd.OSCommand.Command, cmdsCalled = s.command()
- gitCmd.removeFile = s.removeFile
+ gitCmd.OSCommand.SetRemoveFile(s.removeFile)
s.test(cmdsCalled, gitCmd.DiscardAllFileChanges(s.file))
})
}
@@ -465,3 +466,381 @@ func TestGitCommandCheckoutFile(t *testing.T) {
})
}
}
+
+func TestGitCommandApplyPatch(t *testing.T) {
+ type scenario struct {
+ testName string
+ command func(string, ...string) *exec.Cmd
+ test func(error)
+ }
+
+ scenarios := []scenario{
+ {
+ "valid case",
+ func(cmd string, args ...string) *exec.Cmd {
+ assert.Equal(t, "git", cmd)
+ assert.EqualValues(t, []string{"apply", "--cached"}, args[0:2])
+ filename := args[2]
+ content, err := ioutil.ReadFile(filename)
+ assert.NoError(t, err)
+
+ assert.Equal(t, "test", string(content))
+
+ return secureexec.Command("echo", "done")
+ },
+ func(err error) {
+ assert.NoError(t, err)
+ },
+ },
+ {
+ "command returns error",
+ func(cmd string, args ...string) *exec.Cmd {
+ assert.Equal(t, "git", cmd)
+ assert.EqualValues(t, []string{"apply", "--cached"}, args[0:2])
+ filename := args[2]
+ // TODO: Ideally we want to mock out OSCommand here so that we're not
+ // double handling testing it's CreateTempFile functionality,
+ // but it is going to take a bit of work to make a proper mock for it
+ // so I'm leaving it for another PR
+ content, err := ioutil.ReadFile(filename)
+ assert.NoError(t, err)
+
+ assert.Equal(t, "test", string(content))
+
+ return secureexec.Command("test")
+ },
+ func(err error) {
+ assert.Error(t, err)
+ },
+ },
+ }
+
+ for _, s := range scenarios {
+ t.Run(s.testName, func(t *testing.T) {
+ gitCmd := NewDummyGitCommand()
+ gitCmd.OSCommand.Command = s.command
+ s.test(gitCmd.ApplyPatch("test", "cached"))
+ })
+ }
+}
+
+// TestGitCommandDiscardOldFileChanges is a function.
+func TestGitCommandDiscardOldFileChanges(t *testing.T) {
+ type scenario struct {
+ testName string
+ getGitConfigValue func(string) (string, error)
+ commits []*models.Commit
+ commitIndex int
+ fileName string
+ command func(string, ...string) *exec.Cmd
+ test func(error)
+ }
+
+ scenarios := []scenario{
+ {
+ "returns error when index outside of range of commits",
+ func(string) (string, error) {
+ return "", nil
+ },
+ []*models.Commit{},
+ 0,
+ "test999.txt",
+ nil,
+ func(err error) {
+ assert.Error(t, err)
+ },
+ },
+ {
+ "returns error when using gpg",
+ func(string) (string, error) {
+ return "true", nil
+ },
+ []*models.Commit{{Name: "commit", Sha: "123456"}},
+ 0,
+ "test999.txt",
+ nil,
+ func(err error) {
+ assert.Error(t, err)
+ },
+ },
+ {
+ "checks out file if it already existed",
+ func(string) (string, error) {
+ return "", nil
+ },
+ []*models.Commit{
+ {Name: "commit", Sha: "123456"},
+ {Name: "commit2", Sha: "abcdef"},
+ },
+ 0,
+ "test999.txt",
+ test.CreateMockCommand(t, []*test.CommandSwapper{
+ {
+ Expect: "git rebase --interactive --autostash --keep-empty abcdef",
+ Replace: "echo",
+ },
+ {
+ Expect: "git cat-file -e HEAD^:test999.txt",
+ Replace: "echo",
+ },
+ {
+ Expect: "git checkout HEAD^ test999.txt",
+ Replace: "echo",
+ },
+ {
+ Expect: "git commit --amend --no-edit --allow-empty",
+ Replace: "echo",
+ },
+ {
+ Expect: "git rebase --continue",
+ Replace: "echo",
+ },
+ }),
+ func(err error) {
+ assert.NoError(t, err)
+ },
+ },
+ // test for when the file was created within the commit requires a refactor to support proper mocks
+ // currently we'd need to mock out the os.Remove function and that's gonna introduce tech debt
+ }
+
+ gitCmd := NewDummyGitCommand()
+
+ for _, s := range scenarios {
+ t.Run(s.testName, func(t *testing.T) {
+ gitCmd.OSCommand.Command = s.command
+ gitCmd.getGitConfigValue = s.getGitConfigValue
+ s.test(gitCmd.DiscardOldFileChanges(s.commits, s.commitIndex, s.fileName))
+ })
+ }
+}
+
+// TestGitCommandDiscardUnstagedFileChanges is a function.
+func TestGitCommandDiscardUnstagedFileChanges(t *testing.T) {
+ type scenario struct {
+ testName string
+ file *models.File
+ command func(string, ...string) *exec.Cmd
+ test func(error)
+ }
+
+ scenarios := []scenario{
+ {
+ "valid case",
+ &models.File{Name: "test.txt"},
+ test.CreateMockCommand(t, []*test.CommandSwapper{
+ {
+ Expect: `git checkout -- "test.txt"`,
+ Replace: "echo",
+ },
+ }),
+ func(err error) {
+ assert.NoError(t, err)
+ },
+ },
+ }
+
+ gitCmd := NewDummyGitCommand()
+
+ for _, s := range scenarios {
+ t.Run(s.testName, func(t *testing.T) {
+ gitCmd.OSCommand.Command = s.command
+ s.test(gitCmd.DiscardUnstagedFileChanges(s.file))
+ })
+ }
+}
+
+// TestGitCommandDiscardAnyUnstagedFileChanges is a function.
+func TestGitCommandDiscardAnyUnstagedFileChanges(t *testing.T) {
+ type scenario struct {
+ testName string
+ command func(string, ...string) *exec.Cmd
+ test func(error)
+ }
+
+ scenarios := []scenario{
+ {
+ "valid case",
+ test.CreateMockCommand(t, []*test.CommandSwapper{
+ {
+ Expect: `git checkout -- .`,
+ Replace: "echo",
+ },
+ }),
+ func(err error) {
+ assert.NoError(t, err)
+ },
+ },
+ }
+
+ gitCmd := NewDummyGitCommand()
+
+ for _, s := range scenarios {
+ t.Run(s.testName, func(t *testing.T) {
+ gitCmd.OSCommand.Command = s.command
+ s.test(gitCmd.DiscardAnyUnstagedFileChanges())
+ })
+ }
+}
+
+// TestGitCommandRemoveUntrackedFiles is a function.
+func TestGitCommandRemoveUntrackedFiles(t *testing.T) {
+ type scenario struct {
+ testName string
+ command func(string, ...string) *exec.Cmd
+ test func(error)
+ }
+
+ scenarios := []scenario{
+ {
+ "valid case",
+ test.CreateMockCommand(t, []*test.CommandSwapper{
+ {
+ Expect: `git clean -fd`,
+ Replace: "echo",
+ },
+ }),
+ func(err error) {
+ assert.NoError(t, err)
+ },
+ },
+ }
+
+ gitCmd := NewDummyGitCommand()
+
+ for _, s := range scenarios {
+ t.Run(s.testName, func(t *testing.T) {
+ gitCmd.OSCommand.Command = s.command
+ s.test(gitCmd.RemoveUntrackedFiles())
+ })
+ }
+}
+
+// TestEditFileCmdStr is a function.
+func TestEditFileCmdStr(t *testing.T) {
+ type scenario struct {
+ filename string
+ command func(string, ...string) *exec.Cmd
+ getenv func(string) string
+ getGitConfigValue func(string) (string, error)
+ test func(string, error)
+ }
+
+ scenarios := []scenario{
+ {
+ "test",
+ func(name string, arg ...string) *exec.Cmd {
+ return secureexec.Command("exit", "1")
+ },
+ func(env string) string {
+ return ""
+ },
+ func(cf string) (string, error) {
+ return "", nil
+ },
+ func(cmdStr string, err error) {
+ assert.EqualError(t, err, "No editor defined in $GIT_EDITOR, $VISUAL, $EDITOR, or git config")
+ },
+ },
+ {
+ "test",
+ func(name string, arg ...string) *exec.Cmd {
+ assert.Equal(t, "which", name)
+ return secureexec.Command("exit", "1")
+ },
+ func(env string) string {
+ return ""
+ },
+ func(cf string) (string, error) {
+ return "nano", nil
+ },
+ func(cmdStr string, err error) {
+ assert.NoError(t, err)
+ assert.Equal(t, "nano \"test\"", cmdStr)
+ },
+ },
+ {
+ "test",
+ func(name string, arg ...string) *exec.Cmd {
+ assert.Equal(t, "which", name)
+ return secureexec.Command("exit", "1")
+ },
+ func(env string) string {
+ if env == "VISUAL" {
+ return "nano"
+ }
+
+ return ""
+ },
+ func(cf string) (string, error) {
+ return "", nil
+ },
+ func(cmdStr string, err error) {
+ assert.NoError(t, err)
+ },
+ },
+ {
+ "test",
+ func(name string, arg ...string) *exec.Cmd {
+ assert.Equal(t, "which", name)
+ return secureexec.Command("exit", "1")
+ },
+ func(env string) string {
+ if env == "EDITOR" {
+ return "emacs"
+ }
+
+ return ""
+ },
+ func(cf string) (string, error) {
+ return "", nil
+ },
+ func(cmdStr string, err error) {
+ assert.NoError(t, err)
+ assert.Equal(t, "emacs \"test\"", cmdStr)
+ },
+ },
+ {
+ "test",
+ func(name string, arg ...string) *exec.Cmd {
+ assert.Equal(t, "which", name)
+ return secureexec.Command("echo")
+ },
+ func(env string) string {
+ return ""
+ },
+ func(cf string) (string, error) {
+ return "", nil
+ },
+ func(cmdStr string, err error) {
+ assert.NoError(t, err)
+ assert.Equal(t, "vi \"test\"", cmdStr)
+ },
+ },
+ {
+ "file/with space",
+ func(name string, args ...string) *exec.Cmd {
+ assert.Equal(t, "which", name)
+ return secureexec.Command("echo")
+ },
+ func(env string) string {
+ return ""
+ },
+ func(cf string) (string, error) {
+ return "", nil
+ },
+ func(cmdStr string, err error) {
+ assert.NoError(t, err)
+ assert.Equal(t, "vi \"file/with space\"", cmdStr)
+ },
+ },
+ }
+
+ for _, s := range scenarios {
+ gitCmd := NewDummyGitCommand()
+ gitCmd.OSCommand.Command = s.command
+ gitCmd.OSCommand.Getenv = s.getenv
+ gitCmd.getGitConfigValue = s.getGitConfigValue
+ s.test(gitCmd.EditFileCmdStr(s.filename))
+ }
+}