github.com/inteleradmedicalsystems/go-codecommit@v0.1.0/pkg/codecommit/git_test.go (about)

     1  package codecommit
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"os"
     7  	"os/exec"
     8  	"path/filepath"
     9  	"testing"
    10  
    11  	"gopkg.in/src-d/go-git.v4"
    12  	"gopkg.in/src-d/go-git.v4/plumbing/object"
    13  )
    14  
    15  // TestRepoWrapperCloneEmpty tests RepoWrapper.Clone() of an empty Git repo.
    16  func TestRepoWrapperCloneEmpty(t *testing.T) {
    17  	tempdir := tempDir(t, "TestRepoWrapper-")
    18  	defer os.RemoveAll(tempdir)
    19  	repoRoot := filepath.Join(tempdir, "repo")
    20  	gitInit(t, repoRoot)
    21  
    22  	repoWrapper := RepoWrapper{}
    23  	destDir := filepath.Join(repoRoot, "dest")
    24  	r, isEmpty, err := repoWrapper.Clone(repoRoot, destDir)
    25  	if err != nil {
    26  		t.Fatalf("Failed cloning repo %v, err=%v, repo=%v", repoRoot, err, r)
    27  
    28  	}
    29  	if !isEmpty {
    30  		t.Fatalf("Repo %v should have been empty", repoRoot)
    31  	}
    32  
    33  }
    34  
    35  // TestRepoWrapperClone tests RepoWrapper.Clone() a non-empty Git repo, verifying that the contents of the clone matches the source repo.
    36  func TestRepoWrapperClone(t *testing.T) {
    37  	cwd, err := os.Getwd()
    38  	if err != nil {
    39  		t.Fatalf("%v", err)
    40  	}
    41  
    42  	defer os.Chdir(cwd)
    43  
    44  	tempdir := tempDir(t, "TestRepoWrapper-")
    45  	defer os.RemoveAll(tempdir)
    46  	repoRoot := filepath.Join(tempdir, "repo")
    47  	gitInit(t, repoRoot)
    48  
    49  	os.Chdir(repoRoot)
    50  
    51  	f, err := ioutil.TempFile(repoRoot, "")
    52  	if err != nil {
    53  		t.Fatalf("%v", err)
    54  	}
    55  
    56  	baseFile := filepath.Base(f.Name())
    57  	contentExpected := []byte("foo\n")
    58  	f.Write(contentExpected)
    59  	gitAdd(t, baseFile)
    60  	gitCommit(t, "commit it")
    61  
    62  	repoWrapper := RepoWrapper{}
    63  	destDir := filepath.Join(repoRoot, "dest")
    64  	r, isEmpty, err := repoWrapper.Clone(repoRoot, destDir)
    65  	if err != nil {
    66  		t.Fatalf("Failed cloning repo %v, err=%v, repo=%v", repoRoot, err, r)
    67  
    68  	}
    69  	if isEmpty {
    70  		t.Fatalf("Repo %v should not have been empty", repoRoot)
    71  	}
    72  
    73  	filename := filepath.Join(destDir, baseFile)
    74  	_, err = os.Stat(filename)
    75  	if err != nil {
    76  		t.Fatalf("Expected file %v was not cloned, err=%v", filename, err)
    77  	}
    78  
    79  	assertFileContents(t, filename, contentExpected)
    80  }
    81  
    82  // TestRepoWrapperCommit tests RepoWrapper.commit() of a single file, verifying that the commitl Log() method returns the expected commit.
    83  func TestRepoWrapperCommit(t *testing.T) {
    84  	cwd, err := os.Getwd()
    85  	if err != nil {
    86  		t.Fatalf("%v", err)
    87  	}
    88  
    89  	defer os.Chdir(cwd)
    90  
    91  	tempdir := tempDir(t, "TestRepoWrapper-")
    92  	defer os.RemoveAll(tempdir)
    93  	repoRoot := filepath.Join(tempdir, "repo")
    94  	gitInit(t, repoRoot)
    95  
    96  	os.Chdir(repoRoot)
    97  
    98  	f, err := ioutil.TempFile(repoRoot, "")
    99  	if err != nil {
   100  		t.Fatalf("%v", err)
   101  	}
   102  
   103  	baseFile := filepath.Base(f.Name())
   104  	contentExpected := []byte("foo\n")
   105  	f.Write(contentExpected)
   106  	gitAdd(t, baseFile)
   107  
   108  	repoWrapper := RepoWrapper{}
   109  	repo, err := repoWrapper.repo(repoRoot)
   110  	if err != nil {
   111  		t.Fatalf("Failed to get a new repo, err=%v", err)
   112  	}
   113  
   114  	w, err := repo.Worktree()
   115  	if err != nil {
   116  		t.Fatalf("Failed to get a WorkTree for repo %v, err=%v", repo, err)
   117  	}
   118  
   119  	name := "TestIt"
   120  	email := "testit@foo.local"
   121  	message := "testit"
   122  	h, err := repoWrapper.Commit(w, name, email, message, false)
   123  	if err != nil {
   124  		t.Fatalf("Failed to commit to repo %v, err=%v", repo, err)
   125  	}
   126  
   127  	cIter, err := repo.Log(&git.LogOptions{From: *h})
   128  	err = cIter.ForEach(func(c *object.Commit) error {
   129  		if c.Author.Name != name {
   130  			t.Fatalf("Expected name %v not found for %v", name, h)
   131  		}
   132  		if c.Author.Email != email {
   133  			t.Fatalf("Expected email %v not found for %v", email, h)
   134  		}
   135  		if c.Message != message {
   136  			t.Fatalf("Expected message %v not found for %v", message, h)
   137  		}
   138  		return nil
   139  	})
   140  }
   141  
   142  // TestRepoWrapperPush tests that the RepoWrapper can push changes to a bare remote Git repo.
   143  func TestRepoWrapperPush(t *testing.T) {
   144  	cwd, err := os.Getwd()
   145  	if err != nil {
   146  		t.Fatalf("%v", err)
   147  	}
   148  
   149  	defer os.Chdir(cwd)
   150  
   151  	tempdir := tempDir(t, "TestRepoWrapper-")
   152  	defer os.RemoveAll(tempdir)
   153  
   154  	repoRoot := filepath.Join(tempdir, "repo")
   155  	gitInit(t, repoRoot, "--bare")
   156  
   157  	cloneDir := filepath.Join(tempdir, "clone")
   158  	gitClone(t, repoRoot, cloneDir)
   159  
   160  	os.Chdir(cloneDir)
   161  
   162  	f, err := ioutil.TempFile(cloneDir, "")
   163  	if err != nil {
   164  		t.Fatalf("%v", err)
   165  	}
   166  	baseFile := filepath.Base(f.Name())
   167  	contentExpected := []byte("foo\n")
   168  	f.Write(contentExpected)
   169  	gitAdd(t, baseFile)
   170  	gitCommit(t, "commit it")
   171  
   172  	repoWrapper := RepoWrapper{}
   173  	repo, err := repoWrapper.repo(cloneDir)
   174  	if err != nil {
   175  		t.Fatalf("Failed to get a new repo, err=%v", err)
   176  	}
   177  	err = repoWrapper.PushR(repo)
   178  	if err != nil {
   179  		t.Fatalf("Failed to push repo %v to %v, err=%v", cloneDir, repoRoot, err)
   180  	}
   181  
   182  	otherDir := filepath.Join(tempdir, "other")
   183  	gitClone(t, repoRoot, otherDir)
   184  	assertFileContents(t, filepath.Join(otherDir, baseFile), contentExpected)
   185  }
   186  
   187  func assertFileContents(t *testing.T, filename string, expected []byte) {
   188  	actual, err := ioutil.ReadFile(filename)
   189  	if err != nil {
   190  		t.Fatalf("Error reading %v, err=%v", expected, err)
   191  	}
   192  
   193  	if bytes.Compare(actual, expected) != 0 {
   194  		t.Fatalf("Contents of %v does not match expected %v, actual=%v", filename, expected, actual)
   195  	}
   196  
   197  }
   198  func tempDir(t *testing.T, prefix string) string {
   199  	t.Helper()
   200  	tempdir, err := ioutil.TempDir("", prefix)
   201  	if err != nil {
   202  		t.Fatalf("Temp directory creation failed, err=%v", err)
   203  	}
   204  	return tempdir
   205  }
   206  
   207  func gitAdd(t *testing.T, files ...string) {
   208  	t.Helper()
   209  	execGit(t, "add", files...)
   210  }
   211  
   212  func gitInit(t *testing.T, args ...string) {
   213  	t.Helper()
   214  	execGit(t, "init", args...)
   215  }
   216  
   217  func gitClone(t *testing.T, url string, dest string) {
   218  	t.Helper()
   219  	execGit(t, "clone", url, dest)
   220  }
   221  
   222  func gitCommit(t *testing.T, message string) {
   223  	t.Helper()
   224  	execGit(t, "commit", "-m", message)
   225  }
   226  
   227  func execGit(t *testing.T, command string, args ...string) {
   228  	t.Helper()
   229  	a := []string{command}
   230  	a = append(a, args...)
   231  	cmd := exec.Command("git", a...)
   232  	stdouterr, err := cmd.CombinedOutput()
   233  	if err != nil {
   234  		t.Fatalf("git %v failed, args=%v, err=%v, stdouterr=%s", command, a, err, stdouterr)
   235  	}
   236  }