2019-03-13 04:14:30 -07:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestEnabledGitNotFound(t *testing.T) {
|
|
|
|
env := new(MockedEnvironment)
|
|
|
|
env.On("hasCommand", "git").Return(false)
|
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
|
|
|
assert.False(t, g.enabled())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestEnabledInWorkingDirectory(t *testing.T) {
|
|
|
|
env := new(MockedEnvironment)
|
|
|
|
env.On("hasCommand", "git").Return(true)
|
|
|
|
env.On("runCommand", "git", []string{"rev-parse", "--is-inside-work-tree"}).Return("true")
|
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
|
|
|
assert.True(t, g.enabled())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetGitOutputForCommand(t *testing.T) {
|
|
|
|
args := []string{"-c", "core.quotepath=false", "-c", "color.status=false"}
|
|
|
|
commandArgs := []string{"symbolic-ref", "--short", "HEAD"}
|
|
|
|
want := "je suis le output"
|
|
|
|
env := new(MockedEnvironment)
|
|
|
|
env.On("runCommand", "git", append(args, commandArgs...)).Return(want)
|
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
2020-10-07 04:32:42 -07:00
|
|
|
got := g.getGitCommandOutput(commandArgs...)
|
2019-03-13 04:14:30 -07:00
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
2020-10-07 04:32:42 -07:00
|
|
|
type detachedContext struct {
|
|
|
|
currentCommit string
|
|
|
|
rebase string
|
|
|
|
rebaseMerge bool
|
|
|
|
rebaseApply bool
|
|
|
|
origin string
|
|
|
|
onto string
|
|
|
|
step string
|
|
|
|
total string
|
|
|
|
branchName string
|
|
|
|
tagName string
|
2020-10-07 11:44:22 -07:00
|
|
|
cherryPick bool
|
|
|
|
cherryPickSHA string
|
2020-10-11 02:56:33 -07:00
|
|
|
merge bool
|
|
|
|
mergeHEAD string
|
2020-10-07 04:32:42 -07:00
|
|
|
}
|
|
|
|
|
2020-10-07 11:44:22 -07:00
|
|
|
func setupHEADContextEnv(context *detachedContext) environmentInfo {
|
2019-03-13 04:14:30 -07:00
|
|
|
env := new(MockedEnvironment)
|
2020-10-07 04:32:42 -07:00
|
|
|
env.On("hasFolder", ".git/rebase-merge").Return(context.rebaseMerge)
|
|
|
|
env.On("hasFolder", ".git/rebase-apply").Return(context.rebaseApply)
|
|
|
|
env.On("getFileContent", ".git/rebase-merge/orig-head").Return(context.origin)
|
|
|
|
env.On("getFileContent", ".git/rebase-merge/onto").Return(context.onto)
|
|
|
|
env.On("getFileContent", ".git/rebase-merge/msgnum").Return(context.step)
|
|
|
|
env.On("getFileContent", ".git/rebase-apply/next").Return(context.step)
|
|
|
|
env.On("getFileContent", ".git/rebase-merge/end").Return(context.total)
|
|
|
|
env.On("getFileContent", ".git/rebase-apply/last").Return(context.total)
|
|
|
|
env.On("getFileContent", ".git/rebase-apply/head-name").Return(context.origin)
|
2020-10-07 11:44:22 -07:00
|
|
|
env.On("getFileContent", ".git/CHERRY_PICK_HEAD").Return(context.cherryPickSHA)
|
2020-10-11 02:56:33 -07:00
|
|
|
env.On("getFileContent", ".git/MERGE_HEAD").Return(context.mergeHEAD)
|
2020-10-07 11:44:22 -07:00
|
|
|
env.On("hasFiles", ".git/CHERRY_PICK_HEAD").Return(context.cherryPick)
|
2020-10-11 02:56:33 -07:00
|
|
|
env.On("hasFiles", ".git/MERGE_HEAD").Return(context.merge)
|
2020-10-07 04:32:42 -07:00
|
|
|
env.On("runCommand", "git", []string{"-c", "core.quotepath=false", "-c", "color.status=false", "rev-parse", "--short", "HEAD"}).Return(context.currentCommit)
|
|
|
|
env.On("runCommand", "git", []string{"-c", "core.quotepath=false", "-c", "color.status=false", "describe", "--tags", "--exact-match"}).Return(context.tagName)
|
|
|
|
env.On("runCommand", "git", []string{"-c", "core.quotepath=false", "-c", "color.status=false", "name-rev", "--name-only", "--exclude=tags/*", context.origin}).Return(context.origin)
|
|
|
|
env.On("runCommand", "git", []string{"-c", "core.quotepath=false", "-c", "color.status=false", "name-rev", "--name-only", "--exclude=tags/*", context.onto}).Return(context.onto)
|
2020-10-07 11:44:22 -07:00
|
|
|
env.On("runCommand", "git", []string{"-c", "core.quotepath=false", "-c", "color.status=false", "name-rev", "--name-only", "--exclude=tags/*", context.cherryPickSHA}).Return(context.cherryPickSHA)
|
2020-10-11 02:56:33 -07:00
|
|
|
env.On("runCommand", "git", []string{"-c", "core.quotepath=false", "-c", "color.status=false", "name-rev", "--name-only", "--exclude=tags/*", context.mergeHEAD}).Return(context.mergeHEAD)
|
2020-10-07 04:32:42 -07:00
|
|
|
return env
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetGitDetachedCommitHash(t *testing.T) {
|
2020-10-10 07:38:57 -07:00
|
|
|
want := "COMMIT:lalasha1"
|
2020-10-07 04:32:42 -07:00
|
|
|
context := &detachedContext{
|
2020-10-07 11:44:22 -07:00
|
|
|
currentCommit: "lalasha1",
|
2020-10-07 04:32:42 -07:00
|
|
|
}
|
2020-10-07 11:44:22 -07:00
|
|
|
env := setupHEADContextEnv(context)
|
2019-03-13 04:14:30 -07:00
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
2020-10-10 07:38:57 -07:00
|
|
|
got := g.getGitHEADContext("")
|
2019-03-13 04:14:30 -07:00
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
2020-10-07 11:44:22 -07:00
|
|
|
func TestGetGitHEADContextTagName(t *testing.T) {
|
|
|
|
want := "TAG:lalasha1"
|
2020-10-07 04:32:42 -07:00
|
|
|
context := &detachedContext{
|
|
|
|
currentCommit: "whatever",
|
2020-10-07 11:44:22 -07:00
|
|
|
tagName: "lalasha1",
|
2020-10-07 04:32:42 -07:00
|
|
|
}
|
2020-10-07 11:44:22 -07:00
|
|
|
env := setupHEADContextEnv(context)
|
2020-10-07 04:32:42 -07:00
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
2020-10-10 07:38:57 -07:00
|
|
|
got := g.getGitHEADContext("")
|
2020-10-07 04:32:42 -07:00
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
2020-10-07 11:44:22 -07:00
|
|
|
func TestGetGitHEADContextRebaseMerge(t *testing.T) {
|
2020-10-10 07:38:57 -07:00
|
|
|
want := "REBASE:BRANCH:cool-feature-bro onto BRANCH:main (2/3) at COMMIT:whatever"
|
2020-10-07 04:32:42 -07:00
|
|
|
context := &detachedContext{
|
|
|
|
currentCommit: "whatever",
|
|
|
|
rebase: "true",
|
|
|
|
rebaseMerge: true,
|
|
|
|
origin: "cool-feature-bro",
|
|
|
|
onto: "main",
|
|
|
|
step: "2",
|
|
|
|
total: "3",
|
|
|
|
}
|
2020-10-07 11:44:22 -07:00
|
|
|
env := setupHEADContextEnv(context)
|
2020-10-07 04:32:42 -07:00
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
2020-10-10 07:38:57 -07:00
|
|
|
got := g.getGitHEADContext("")
|
2020-10-07 04:32:42 -07:00
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
2020-10-07 11:44:22 -07:00
|
|
|
func TestGetGitHEADContextRebaseApply(t *testing.T) {
|
2020-10-10 07:38:57 -07:00
|
|
|
want := "REBASING:BRANCH:cool-feature-bro (2/3) at COMMIT:whatever"
|
2020-10-07 04:32:42 -07:00
|
|
|
context := &detachedContext{
|
|
|
|
currentCommit: "whatever",
|
|
|
|
rebase: "true",
|
|
|
|
rebaseApply: true,
|
|
|
|
origin: "cool-feature-bro",
|
|
|
|
step: "2",
|
|
|
|
total: "3",
|
|
|
|
}
|
2020-10-07 11:44:22 -07:00
|
|
|
env := setupHEADContextEnv(context)
|
2020-10-07 04:32:42 -07:00
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
2020-10-10 07:38:57 -07:00
|
|
|
got := g.getGitHEADContext("")
|
2020-10-07 04:32:42 -07:00
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
2020-10-07 11:44:22 -07:00
|
|
|
func TestGetGitHEADContextRebaseUnknown(t *testing.T) {
|
2020-10-10 07:38:57 -07:00
|
|
|
want := "COMMIT:whatever"
|
2020-10-07 04:32:42 -07:00
|
|
|
context := &detachedContext{
|
|
|
|
currentCommit: "whatever",
|
|
|
|
rebase: "true",
|
|
|
|
}
|
2020-10-07 11:44:22 -07:00
|
|
|
env := setupHEADContextEnv(context)
|
2019-03-13 04:14:30 -07:00
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
2020-10-10 07:38:57 -07:00
|
|
|
got := g.getGitHEADContext("")
|
2020-10-07 11:44:22 -07:00
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetGitHEADContextCherryPickOnBranch(t *testing.T) {
|
2020-10-10 07:38:57 -07:00
|
|
|
want := "CHERRY PICK:pickme onto BRANCH:main"
|
2020-10-07 11:44:22 -07:00
|
|
|
context := &detachedContext{
|
|
|
|
currentCommit: "whatever",
|
|
|
|
branchName: "main",
|
|
|
|
cherryPick: true,
|
|
|
|
cherryPickSHA: "pickme",
|
|
|
|
}
|
|
|
|
env := setupHEADContextEnv(context)
|
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
2020-10-10 07:38:57 -07:00
|
|
|
got := g.getGitHEADContext("main")
|
2020-10-07 11:44:22 -07:00
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetGitHEADContextCherryPickOnTag(t *testing.T) {
|
2020-10-10 07:38:57 -07:00
|
|
|
want := "CHERRY PICK:pickme onto TAG:v3.4.6"
|
2020-10-07 11:44:22 -07:00
|
|
|
context := &detachedContext{
|
|
|
|
currentCommit: "whatever",
|
|
|
|
tagName: "v3.4.6",
|
|
|
|
cherryPick: true,
|
|
|
|
cherryPickSHA: "pickme",
|
|
|
|
}
|
|
|
|
env := setupHEADContextEnv(context)
|
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
2020-10-10 07:38:57 -07:00
|
|
|
got := g.getGitHEADContext("")
|
2019-03-13 04:14:30 -07:00
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
2020-10-11 02:56:33 -07:00
|
|
|
func TestGetGitHEADContextMerge(t *testing.T) {
|
|
|
|
want := "MERGING:BRANCH:feat into BRANCH:main"
|
|
|
|
context := &detachedContext{
|
|
|
|
merge: true,
|
|
|
|
mergeHEAD: "feat",
|
|
|
|
}
|
|
|
|
env := setupHEADContextEnv(context)
|
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
|
|
|
got := g.getGitHEADContext("main")
|
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetGitHEADContextMergeTag(t *testing.T) {
|
|
|
|
want := "MERGING:BRANCH:feat into TAG:v3.4.6"
|
|
|
|
context := &detachedContext{
|
|
|
|
tagName: "v3.4.6",
|
|
|
|
merge: true,
|
|
|
|
mergeHEAD: "feat",
|
|
|
|
}
|
|
|
|
env := setupHEADContextEnv(context)
|
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
|
|
|
got := g.getGitHEADContext("")
|
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
2019-03-13 04:14:30 -07:00
|
|
|
func TestGetStashContextZeroEntries(t *testing.T) {
|
2020-10-10 10:27:04 -07:00
|
|
|
want := ""
|
2019-03-13 04:14:30 -07:00
|
|
|
env := new(MockedEnvironment)
|
2020-10-10 10:27:04 -07:00
|
|
|
env.On("runCommand", "git", []string{"-c", "core.quotepath=false", "-c", "color.status=false", "rev-list", "--walk-reflogs", "--count", "refs/stash"}).Return("")
|
2019-03-13 04:14:30 -07:00
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
|
|
|
got := g.getStashContext()
|
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetStashContextMultipleEntries(t *testing.T) {
|
2020-10-10 10:27:04 -07:00
|
|
|
want := "2"
|
2019-03-13 04:14:30 -07:00
|
|
|
env := new(MockedEnvironment)
|
2020-10-10 10:27:04 -07:00
|
|
|
env.On("runCommand", "git", []string{"-c", "core.quotepath=false", "-c", "color.status=false", "rev-list", "--walk-reflogs", "--count", "refs/stash"}).Return("2")
|
2019-03-13 04:14:30 -07:00
|
|
|
g := &git{
|
|
|
|
env: env,
|
|
|
|
}
|
|
|
|
got := g.getStashContext()
|
|
|
|
assert.Equal(t, want, got)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGitBranchInfoEqual(t *testing.T) {
|
|
|
|
g := git{}
|
|
|
|
branchInfo := "## master...origin/master"
|
2020-10-07 11:44:22 -07:00
|
|
|
got := g.parseGitStatusInfo(branchInfo)
|
2019-03-13 04:14:30 -07:00
|
|
|
assert.Equal(t, "master", got["local"])
|
|
|
|
assert.Equal(t, "origin/master", got["upstream"])
|
|
|
|
assert.Empty(t, got["ahead"])
|
|
|
|
assert.Empty(t, got["behind"])
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGitBranchInfoAhead(t *testing.T) {
|
|
|
|
g := git{}
|
|
|
|
branchInfo := "## master...origin/master [ahead 1]"
|
2020-10-07 11:44:22 -07:00
|
|
|
got := g.parseGitStatusInfo(branchInfo)
|
2019-03-13 04:14:30 -07:00
|
|
|
assert.Equal(t, "master", got["local"])
|
|
|
|
assert.Equal(t, "origin/master", got["upstream"])
|
|
|
|
assert.Equal(t, "1", got["ahead"])
|
|
|
|
assert.Empty(t, got["behind"])
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGitBranchInfoBehind(t *testing.T) {
|
|
|
|
g := git{}
|
|
|
|
branchInfo := "## master...origin/master [behind 1]"
|
2020-10-07 11:44:22 -07:00
|
|
|
got := g.parseGitStatusInfo(branchInfo)
|
2019-03-13 04:14:30 -07:00
|
|
|
assert.Equal(t, "master", got["local"])
|
|
|
|
assert.Equal(t, "origin/master", got["upstream"])
|
|
|
|
assert.Equal(t, "1", got["behind"])
|
|
|
|
assert.Empty(t, got["ahead"])
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGitBranchInfoBehindandAhead(t *testing.T) {
|
|
|
|
g := git{}
|
|
|
|
branchInfo := "## master...origin/master [ahead 1, behind 2]"
|
2020-10-07 11:44:22 -07:00
|
|
|
got := g.parseGitStatusInfo(branchInfo)
|
2019-03-13 04:14:30 -07:00
|
|
|
assert.Equal(t, "master", got["local"])
|
|
|
|
assert.Equal(t, "origin/master", got["upstream"])
|
|
|
|
assert.Equal(t, "2", got["behind"])
|
|
|
|
assert.Equal(t, "1", got["ahead"])
|
|
|
|
}
|
2020-10-10 10:16:58 -07:00
|
|
|
|
|
|
|
func TestParseGitBranchInfoNoRemote(t *testing.T) {
|
|
|
|
g := git{}
|
|
|
|
branchInfo := "## master"
|
|
|
|
got := g.parseGitStatusInfo(branchInfo)
|
|
|
|
assert.Equal(t, "master", got["local"])
|
|
|
|
assert.Empty(t, got["upstream"])
|
|
|
|
}
|
2020-10-11 04:32:21 -07:00
|
|
|
|
|
|
|
func TestGitStatusUnmerged(t *testing.T) {
|
|
|
|
expected := " working: x1"
|
|
|
|
status := &gitStatus{
|
|
|
|
unmerged: 1,
|
|
|
|
}
|
|
|
|
assert.Equal(t, expected, status.string("working:"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGitStatusUnmergedModified(t *testing.T) {
|
|
|
|
expected := " working: ~3 x1"
|
|
|
|
status := &gitStatus{
|
|
|
|
unmerged: 1,
|
|
|
|
modified: 3,
|
|
|
|
}
|
|
|
|
assert.Equal(t, expected, status.string("working:"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGitStatusEmpty(t *testing.T) {
|
|
|
|
expected := ""
|
|
|
|
status := &gitStatus{}
|
|
|
|
assert.Equal(t, expected, status.string("working:"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGitStatsWorking(t *testing.T) {
|
|
|
|
g := &git{}
|
|
|
|
output := []string{
|
|
|
|
"## amazing-feat",
|
|
|
|
" M change.go",
|
|
|
|
"DD change.go",
|
|
|
|
" ? change.go",
|
|
|
|
" ? change.go",
|
|
|
|
" A change.go",
|
|
|
|
" U change.go",
|
|
|
|
" R change.go",
|
|
|
|
" C change.go",
|
|
|
|
}
|
|
|
|
status := g.parseGitStats(output, true)
|
|
|
|
assert.Equal(t, 3, status.modified)
|
|
|
|
assert.Equal(t, 1, status.unmerged)
|
|
|
|
assert.Equal(t, 1, status.added)
|
|
|
|
assert.Equal(t, 1, status.deleted)
|
|
|
|
assert.Equal(t, 2, status.untracked)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGitStatsStaging(t *testing.T) {
|
|
|
|
g := &git{}
|
|
|
|
output := []string{
|
|
|
|
"## amazing-feat",
|
|
|
|
" M change.go",
|
|
|
|
"DD change.go",
|
|
|
|
" ? change.go",
|
|
|
|
"?? change.go",
|
|
|
|
" A change.go",
|
|
|
|
"DU change.go",
|
|
|
|
"MR change.go",
|
|
|
|
"AC change.go",
|
|
|
|
}
|
|
|
|
status := g.parseGitStats(output, false)
|
|
|
|
assert.Equal(t, 1, status.modified)
|
|
|
|
assert.Equal(t, 0, status.unmerged)
|
|
|
|
assert.Equal(t, 1, status.added)
|
|
|
|
assert.Equal(t, 2, status.deleted)
|
|
|
|
assert.Equal(t, 1, status.untracked)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGitStatsNoChanges(t *testing.T) {
|
|
|
|
g := &git{}
|
|
|
|
expected := &gitStatus{}
|
|
|
|
output := []string{
|
|
|
|
"## amazing-feat",
|
|
|
|
}
|
|
|
|
status := g.parseGitStats(output, false)
|
|
|
|
assert.Equal(t, expected, status)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGitStatsInvalidLine(t *testing.T) {
|
|
|
|
g := &git{}
|
|
|
|
expected := &gitStatus{}
|
|
|
|
output := []string{
|
|
|
|
"## amazing-feat",
|
|
|
|
"#",
|
|
|
|
}
|
|
|
|
status := g.parseGitStats(output, false)
|
|
|
|
assert.Equal(t, expected, status)
|
|
|
|
}
|