github.com/komosa/bug@v0.3.1/scm/GitManager_test.go (about) 1 package scm 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "strings" 8 "testing" 9 ) 10 11 type GitCommit struct { 12 commit string 13 log string 14 } 15 16 func (c GitCommit) CommitID() string { 17 return c.commit 18 } 19 func (c GitCommit) LogMsg() string { 20 return c.log 21 } 22 func (c GitCommit) Diff() (string, error) { 23 return runCmd("git", "show", "--pretty=format:%b", c.CommitID()) 24 } 25 26 type GitTester struct { 27 handler SCMHandler 28 workdir string 29 } 30 31 func (t GitTester) GetLogs() ([]Commit, error) { 32 logs, err := runCmd("git", "log", "--oneline", "--reverse", "-z") 33 if err != nil { 34 fmt.Fprintf(os.Stderr, "Error retrieving git logs: %s", logs) 35 return nil, err 36 } 37 logMsgs := strings.Split(logs, "\000") 38 // the last line is empty, so don't allocate 1 for 39 // it 40 commits := make([]Commit, len(logMsgs)-1) 41 for idx, commitText := range logMsgs { 42 if commitText == "" { 43 continue 44 } 45 spaceIdx := strings.Index(commitText, " ") 46 if spaceIdx >= 0 { 47 commits[idx] = GitCommit{commitText[0:spaceIdx], commitText[spaceIdx+1:]} 48 } 49 } 50 return commits, nil 51 } 52 53 func (g GitTester) AssertStagingIndex(t *testing.T, f []FileStatus) { 54 for _, file := range f { 55 out, err := runCmd("git", "status", "--porcelain", file.Filename) 56 if err != nil { 57 t.Error("Could not run git status") 58 } 59 expected := file.IndexStatus + file.WorkingStatus + " " + file.Filename + "\n" 60 if out != expected { 61 t.Error("Incorrect file status") 62 t.Error("Got" + out + " not " + expected) 63 } 64 } 65 } 66 67 func (g GitTester) StageFile(file string) error { 68 _, err := runCmd("git", "add", file) 69 return err 70 } 71 func (t *GitTester) Setup() error { 72 if dir, err := ioutil.TempDir("", "gitbug"); err == nil { 73 t.workdir = dir 74 os.Chdir(t.workdir) 75 } else { 76 return err 77 } 78 79 out, err := runCmd("git", "init", ".") 80 if err != nil { 81 fmt.Fprintf(os.Stderr, "Error initializing git: %s", out) 82 return err 83 } 84 85 t.handler = GitManager{} 86 return nil 87 } 88 func (t GitTester) TearDown() { 89 os.RemoveAll(t.workdir) 90 } 91 func (t GitTester) GetWorkDir() string { 92 return t.workdir 93 } 94 95 func (m GitTester) AssertCleanTree(t *testing.T) { 96 out, err := runCmd("git", "status", "--porcelain") 97 if err != nil { 98 t.Error("Error running git status") 99 } 100 if out != "" { 101 t.Error("Unexpected Output from git status (expected nothing):\n" + out) 102 } 103 } 104 105 func (m GitTester) GetManager() SCMHandler { 106 return m.handler 107 } 108 109 func TestGitBugRenameCommits(t *testing.T) { 110 if os.Getenv("TRAVIS") == "true" && os.Getenv("TRAVIS_OS_NAME") == "linux" { 111 t.Skip("Skipping test which fails only under Travis for unknown reasons..") 112 return 113 } 114 gm := GitTester{} 115 gm.handler = GitManager{} 116 117 expectedDiffs := []string{ 118 ` 119 diff --git a/issues/Test-bug/Description b/issues/Test-bug/Description 120 new file mode 100644 121 index 0000000..e69de29 122 `, ` 123 diff --git a/issues/Renamed-bug/Description b/issues/Renamed-bug/Description 124 new file mode 100644 125 index 0000000..e69de29 126 diff --git a/issues/Test-bug/Description b/issues/Test-bug/Description 127 deleted file mode 100644 128 index e69de29..0000000 129 `} 130 131 runtestRenameCommitsHelper(&gm, t, expectedDiffs) 132 } 133 134 func TestGitFilesOutsideOfBugNotCommited(t *testing.T) { 135 gm := GitTester{} 136 gm.handler = GitManager{} 137 runtestCommitDirtyTree(&gm, t) 138 } 139 140 func TestGitManagerGetType(t *testing.T) { 141 manager := GitManager{} 142 143 if getType := manager.GetSCMType(); getType != "git" { 144 t.Error("Incorrect SCM Type for GitManager. Got " + getType) 145 } 146 }