github.com/testrecall/reporter@v0.2.3-0.20240102230324-a312dcb6d921/reporter/reporter_test.go (about) 1 package reporter_test 2 3 import ( 4 "fmt" 5 "os" 6 "os/exec" 7 "path/filepath" 8 "strings" 9 "testing" 10 11 "github.com/sirupsen/logrus" 12 "github.com/stretchr/testify/assert" 13 "github.com/testrecall/reporter/reporter" 14 ) 15 16 func testLogger() *logrus.Logger { 17 l := logrus.New() 18 l.Level = logrus.TraceLevel 19 return l 20 } 21 22 func TestGitBranchFromInfo(t *testing.T) { 23 for _, tt := range []struct { 24 line string 25 want string 26 }{ 27 {line: "HEAD, master", want: "master"}, 28 {line: "HEAD -> master", want: "master"}, 29 {line: "(HEAD -> master, origin/master, origin/HEAD)", want: "master"}, 30 {line: "HEAD, origin/master, master", want: "master"}, 31 } { 32 got := reporter.GitBranchFromInfo(tt.line) 33 34 assert.Equal(t, tt.want, got, tt.line) 35 } 36 } 37 38 func TestFailureCount(t *testing.T) { 39 for _, tt := range []struct { 40 filename string 41 fails int 42 validXML bool 43 }{ 44 {"rspec_success.xml", 0, true}, 45 {"rspec_malformed.xml", 0, false}, 46 {"golang_success.xml", 0, true}, 47 {"golang_fail.xml", 1, true}, 48 } { 49 report := reporter.RequestPayload{ 50 Logger: testLogger(), 51 RequestData: reporter.RequestData{ 52 RunData: [][]byte{getFixture(tt.filename)}, 53 }, 54 } 55 fails, xmlOK := report.FailureCount() 56 assert.Equal(t, tt.validXML, xmlOK) 57 assert.Equal(t, tt.fails, fails) 58 } 59 } 60 61 func getFixture(filename string) []byte { 62 fp := filepath.Join("fixtures", filename) 63 b, err := os.ReadFile(fp) 64 if err != nil { 65 fmt.Print(err) 66 } 67 68 return b 69 } 70 71 func TestSetup(t *testing.T) { 72 os.Setenv("TR_UPLOAD_TOKEN", "abc123") 73 74 payload := reporter.RequestPayload{ 75 Filename: "./fixtures/hello.txt", 76 RequestData: reporter.RequestData{ 77 Branch: "branch1", 78 SHA: "sha1", 79 BuildNumber: "10", 80 BuildURL: "https://testrecall.com", 81 ReporterVersion: "10", 82 }, 83 Logger: testLogger(), 84 } 85 payload.Setup() 86 87 assert.Less(t, 1, len(payload.RequestData.ReporterVersion), payload.RequestData.ReporterVersion) 88 } 89 90 func gitConfig(t *testing.T, dir string) { 91 out, err := runCmd(dir, `git config commit.gpgsign false`) 92 assert.NoError(t, err, string(out)) 93 _, err = runCmd(dir, `git config user.email "you@example.com"`) 94 assert.NoError(t, err) 95 _, err = runCmd(dir, `git config user.name testuser`) 96 assert.NoError(t, err) 97 _, err = runCmd(dir, `git config --local -l`) 98 assert.NoError(t, err) 99 } 100 101 func TestGetBranch(t *testing.T) { 102 _, err := exec.LookPath("git") 103 assert.NoError(t, err, "git needs to be installed") 104 105 dir, cleanup := newRepo(t) 106 defer cleanup() 107 108 fmt.Println(dir) 109 110 err = os.Chdir(dir) 111 assert.NoError(t, err) 112 gitConfig(t, dir) 113 114 err = createBuzzFile(dir) 115 assert.NoError(t, err) 116 out, err := gitAdd(dir) 117 assert.NoError(t, err, string(out)) 118 out, err = gitCommit(dir, "zero commit") 119 fmt.Println(string(out)) 120 assert.NoError(t, err, string(out)) 121 122 out, _ = exec.Command("git", "log").CombinedOutput() 123 fmt.Println(string(out)) 124 fmt.Println("master branch") // master branch 125 assert.Equal(t, "master", reporterBranch()) 126 127 fmt.Println("detached head master") // detached head master 128 sha, err := gitSha(dir) 129 assert.NoError(t, err) 130 131 out, err = gitCheckout(dir, strings.TrimSpace(string(sha))) 132 assert.NoError(t, err, string(out)) 133 assert.Equal(t, "master", reporterBranch(), string(out)) 134 135 fmt.Println("new branch") // new branch 136 out, err = gitNewBrach(dir, "foobranch") 137 assert.NoError(t, err, string(out)) 138 139 out, err = gitBrach(dir) 140 assert.NoError(t, err) 141 assert.Equal(t, "foobranch", reporterBranch(), string(out)) 142 143 fmt.Println("detached head branch") // detached head branch 144 err = createBarFile(dir) 145 assert.NoError(t, err) 146 out, err = gitAdd(dir) 147 assert.NoError(t, err, string(out)) 148 out, err = gitCommit(dir, "second commit") 149 assert.NoError(t, err, string(out)) 150 151 sha, err = gitSha(dir) 152 assert.NoError(t, err) 153 154 out, err = gitCheckout(dir, strings.TrimSpace(string(sha))) 155 assert.NoError(t, err, string(out)) 156 assert.Equal(t, "foobranch", reporterBranch(), string(out)) 157 158 fmt.Println("detatched fork") // detatched fork 159 newDir := dir + "_cloned" 160 _, cleanupNewDir := gitClone(t, dir, newDir) 161 defer cleanupNewDir() 162 163 curDir, err := os.Getwd() 164 assert.NoError(t, err) 165 defer assert.NoError(t, os.Chdir(curDir)) 166 err = os.Chdir(newDir) 167 assert.NoError(t, err) 168 gitConfig(t, dir) 169 170 out, err = gitDetachtedBranch(newDir, "master") 171 assert.NoError(t, err, string(out)) 172 gitConfig(t, dir) 173 174 out, err = gitBrach(newDir) 175 assert.NoError(t, err) 176 assert.Equal(t, "master", reporterBranch(), string(out)) 177 178 } 179 180 func reporterBranch() string { 181 fmt.Println("getting branch") 182 payload := reporter.RequestPayload{Logger: testLogger()} 183 payload.GetBranch() 184 return payload.RequestData.Branch 185 } 186 187 func gitClone(t *testing.T, dir, newDir string) (string, func()) { 188 cmd := exec.Command("git", "clone", dir, newDir) 189 cmd.Dir = "/tmp" 190 191 out, err := cmd.CombinedOutput() 192 fmt.Println("out", string(out)) 193 assert.NoError(t, err, string(out)) 194 195 return dir, func() { os.RemoveAll(newDir) } 196 } 197 198 func newRepo(t *testing.T) (string, func()) { 199 dir, cleanup := tempDir(t) 200 201 out, err := gitInit(dir) 202 assert.NoError(t, err, string(out)) 203 gitConfig(t, dir) 204 205 err = createFooFile(dir) 206 assert.NoError(t, err) 207 208 out, err = gitAdd(dir) 209 assert.NoError(t, err, string(out)) 210 211 out, err = gitCommit(dir, "first commit") 212 assert.NoError(t, err, string(out)) 213 214 return dir, cleanup 215 } 216 217 func tempDir(t *testing.T) (string, func()) { 218 dir, err := os.MkdirTemp("", "tr-git-tests-") 219 assert.NoError(t, err) 220 return dir, func() { os.RemoveAll(dir) } 221 } 222 223 func gitCheckout(dir, branch string) ([]byte, error) { 224 cmd := exec.Command("git", "checkout", branch) 225 cmd.Dir = dir 226 return cmd.CombinedOutput() 227 } 228 229 func gitSha(dir string) ([]byte, error) { 230 cmd := exec.Command("git", "rev-parse", "HEAD") 231 cmd.Dir = dir 232 return cmd.CombinedOutput() 233 } 234 235 func gitBrach(dir string) ([]byte, error) { 236 cmd := exec.Command("git", "branch") 237 cmd.Dir = dir 238 return cmd.CombinedOutput() 239 } 240 241 func gitNewBrach(dir, branch string) ([]byte, error) { 242 cmd := exec.Command("git", "checkout", "-b", branch) 243 cmd.Dir = dir 244 return cmd.CombinedOutput() 245 } 246 247 func gitDetachtedBranch(dir, branch string) ([]byte, error) { 248 cmd := exec.Command("git", "checkout", "-q", "-B", "master") 249 cmd.Dir = dir 250 return cmd.CombinedOutput() 251 } 252 253 func gitInit(dir string) ([]byte, error) { 254 cmd := exec.Command("git", "init") 255 cmd.Dir = dir 256 return cmd.CombinedOutput() 257 } 258 259 func gitAdd(dir string) ([]byte, error) { 260 cmd := exec.Command("git", "add", ".") 261 cmd.Dir = dir 262 return cmd.CombinedOutput() 263 } 264 265 func gitCommit(dir, msg string) ([]byte, error) { 266 cmd := exec.Command("git", "commit", "-m", msg) 267 cmd.Dir = dir 268 return cmd.CombinedOutput() 269 } 270 271 func createFooFile(dir string) error { 272 d1 := []byte("hello\ngo\n") 273 err := os.WriteFile(dir+"/foo.txt", d1, 0644) 274 return err 275 } 276 277 func createBarFile(dir string) error { 278 d1 := []byte("hello\ngo\n") 279 err := os.WriteFile(dir+"/bar.txt", d1, 0644) 280 return err 281 } 282 283 func createBuzzFile(dir string) error { 284 d1 := []byte("hello\ngo\n") 285 err := os.WriteFile(dir+"/buzz.txt", d1, 0644) 286 return err 287 } 288 289 func runCmd(dir, c string) ([]byte, error) { 290 args := strings.Split(c, " ") 291 cmd := exec.Command(args[0], args[1:]...) 292 cmd.Dir = dir 293 return cmd.CombinedOutput() 294 } 295 296 func TestGetRunData(t *testing.T) { 297 d, err := os.MkdirTemp("", "s-") 298 assert.NoError(t, err) 299 defer os.RemoveAll(d) 300 301 for _, tt := range []struct { 302 file string 303 pattern string 304 match int 305 }{ 306 {"/a/f.xml", "/a/f.xml", 1}, 307 {"/f.xml", "*", 1}, 308 {"/f.xml", "/*.xml", 1}, 309 {"/a/f.xml", "/a/*.xml", 1}, 310 {"/a/b/f.xml", "/*/*/*.xml", 1}, 311 {"/a/b/c/f-oo.xml", "/*/*/f*xml", 1}, 312 {"/a/b/c/d/f-oo.xml", "/*/*/*/*/f-*.xml", 1}, 313 } { 314 file := d + tt.file 315 pattern := d + tt.pattern 316 fmt.Println(file, pattern) 317 318 err := os.MkdirAll(filepath.Dir(file), 0755) 319 assert.NoError(t, err) 320 321 _, err = os.Create(file) 322 assert.NoError(t, err) 323 324 matches, err := reporter.SearchReportFiles(pattern) 325 assert.NoError(t, err) 326 327 if tt.match != len(matches) { 328 t.Errorf("wanted %v got %v, with path %s pattern %s", tt.match, len(matches), file, pattern) 329 } 330 } 331 }