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  }