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  }