1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2024-12-12 11:15:00 +02:00
lazygit/pkg/commands/branches_test.go

251 lines
6.6 KiB
Go
Raw Normal View History

2021-04-10 03:40:42 +02:00
package commands
import (
"testing"
2021-12-30 08:19:01 +02:00
"github.com/go-errors/errors"
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
2021-04-10 03:40:42 +02:00
"github.com/stretchr/testify/assert"
)
func TestGitCommandGetCommitDifferences(t *testing.T) {
type scenario struct {
2021-12-30 08:19:01 +02:00
testName string
runner *oscommands.FakeCmdObjRunner
expectedPushables string
expectedPullables string
2021-04-10 03:40:42 +02:00
}
scenarios := []scenario{
{
"Can't retrieve pushable count",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
Expect("git rev-list @{u}..HEAD --count", "", errors.New("error")),
"?", "?",
2021-04-10 03:40:42 +02:00
},
{
"Can't retrieve pullable count",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
Expect("git rev-list @{u}..HEAD --count", "1\n", nil).
Expect("git rev-list HEAD..@{u} --count", "", errors.New("error")),
"?", "?",
2021-04-10 03:40:42 +02:00
},
{
"Retrieve pullable and pushable count",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
Expect("git rev-list @{u}..HEAD --count", "1\n", nil).
Expect("git rev-list HEAD..@{u} --count", "2\n", nil),
"1", "2",
2021-04-10 03:40:42 +02:00
},
}
for _, s := range scenarios {
t.Run(s.testName, func(t *testing.T) {
2021-12-30 08:19:01 +02:00
gitCmd := NewDummyGitCommandWithRunner(s.runner)
pushables, pullables := gitCmd.GetCommitDifferences("HEAD", "@{u}")
assert.EqualValues(t, s.expectedPushables, pushables)
assert.EqualValues(t, s.expectedPullables, pullables)
s.runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
})
}
}
func TestGitCommandNewBranch(t *testing.T) {
2021-12-30 08:19:01 +02:00
runner := oscommands.NewFakeRunner(t).
Expect(`git checkout -b "test" "master"`, "", nil)
gitCmd := NewDummyGitCommandWithRunner(runner)
2021-04-10 03:40:42 +02:00
assert.NoError(t, gitCmd.NewBranch("test", "master"))
2021-12-30 08:19:01 +02:00
runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
}
func TestGitCommandDeleteBranch(t *testing.T) {
type scenario struct {
testName string
force bool
2021-12-30 08:19:01 +02:00
runner *oscommands.FakeCmdObjRunner
2021-04-10 03:40:42 +02:00
test func(error)
}
scenarios := []scenario{
{
"Delete a branch",
false,
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).Expect(`git branch -d "test"`, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
},
{
"Force delete a branch",
true,
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).Expect(`git branch -D "test"`, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
},
}
for _, s := range scenarios {
t.Run(s.testName, func(t *testing.T) {
2021-12-30 08:19:01 +02:00
gitCmd := NewDummyGitCommandWithRunner(s.runner)
s.test(gitCmd.DeleteBranch("test", s.force))
s.runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
})
}
}
func TestGitCommandMerge(t *testing.T) {
2021-12-30 08:19:01 +02:00
runner := oscommands.NewFakeRunner(t).
Expect(`git merge --no-edit "test"`, "", nil)
gitCmd := NewDummyGitCommandWithRunner(runner)
2021-04-10 03:40:42 +02:00
assert.NoError(t, gitCmd.Merge("test", MergeOpts{}))
2021-12-30 08:19:01 +02:00
runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
}
func TestGitCommandCheckout(t *testing.T) {
type scenario struct {
testName string
2021-12-30 08:19:01 +02:00
runner *oscommands.FakeCmdObjRunner
2021-04-10 03:40:42 +02:00
test func(error)
force bool
}
scenarios := []scenario{
{
"Checkout",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).Expect(`git checkout "test"`, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
false,
},
{
"Checkout forced",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).Expect(`git checkout --force "test"`, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
true,
},
}
for _, s := range scenarios {
t.Run(s.testName, func(t *testing.T) {
2021-12-30 08:19:01 +02:00
gitCmd := NewDummyGitCommandWithRunner(s.runner)
2021-04-10 03:40:42 +02:00
s.test(gitCmd.Checkout("test", CheckoutOptions{Force: s.force}))
2021-12-30 08:19:01 +02:00
s.runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
})
}
}
func TestGitCommandGetBranchGraph(t *testing.T) {
2021-12-30 08:19:01 +02:00
runner := oscommands.NewFakeRunner(t).ExpectArgs([]string{
"git", "log", "--graph", "--color=always", "--abbrev-commit", "--decorate", "--date=relative", "--pretty=medium", "test", "--",
}, "", nil)
gitCmd := NewDummyGitCommandWithRunner(runner)
2021-04-10 03:40:42 +02:00
_, err := gitCmd.GetBranchGraph("test")
assert.NoError(t, err)
}
func TestGitCommandGetAllBranchGraph(t *testing.T) {
2021-12-30 08:19:01 +02:00
runner := oscommands.NewFakeRunner(t).ExpectArgs([]string{
"git", "log", "--graph", "--all", "--color=always", "--abbrev-commit", "--decorate", "--date=relative", "--pretty=medium",
}, "", nil)
gitCmd := NewDummyGitCommandWithRunner(runner)
2021-12-29 02:41:33 +02:00
cmdStr := gitCmd.UserConfig.Git.AllBranchesLogCmd
2021-12-29 05:33:38 +02:00
_, err := gitCmd.Cmd.New(cmdStr).RunWithOutput()
2021-04-10 03:40:42 +02:00
assert.NoError(t, err)
}
func TestGitCommandCurrentBranchName(t *testing.T) {
type scenario struct {
testName string
2021-12-30 08:19:01 +02:00
runner *oscommands.FakeCmdObjRunner
2021-04-10 03:40:42 +02:00
test func(string, string, error)
}
scenarios := []scenario{
{
"says we are on the master branch if we are",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).Expect(`git symbolic-ref --short HEAD`, "master", nil),
2021-04-10 03:40:42 +02:00
func(name string, displayname string, err error) {
assert.NoError(t, err)
assert.EqualValues(t, "master", name)
assert.EqualValues(t, "master", displayname)
},
},
{
"falls back to git `git branch --contains` if symbolic-ref fails",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")).
Expect(`git branch --contains`, "* master", nil),
2021-04-10 03:40:42 +02:00
func(name string, displayname string, err error) {
assert.NoError(t, err)
assert.EqualValues(t, "master", name)
assert.EqualValues(t, "master", displayname)
},
},
{
"handles a detached head",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")).
Expect(`git branch --contains`, "* (HEAD detached at 123abcd)", nil),
2021-04-10 03:40:42 +02:00
func(name string, displayname string, err error) {
assert.NoError(t, err)
assert.EqualValues(t, "123abcd", name)
assert.EqualValues(t, "(HEAD detached at 123abcd)", displayname)
},
},
{
"bubbles up error if there is one",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")).
Expect(`git branch --contains`, "", errors.New("error")),
2021-04-10 03:40:42 +02:00
func(name string, displayname string, err error) {
assert.Error(t, err)
assert.EqualValues(t, "", name)
assert.EqualValues(t, "", displayname)
},
},
}
for _, s := range scenarios {
t.Run(s.testName, func(t *testing.T) {
2021-12-30 08:19:01 +02:00
gitCmd := NewDummyGitCommandWithRunner(s.runner)
2021-04-10 03:40:42 +02:00
s.test(gitCmd.CurrentBranchName())
2021-12-30 08:19:01 +02:00
s.runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
})
}
}
func TestGitCommandResetHard(t *testing.T) {
type scenario struct {
testName string
ref string
2021-12-30 08:19:01 +02:00
runner *oscommands.FakeCmdObjRunner
2021-04-10 03:40:42 +02:00
test func(error)
}
scenarios := []scenario{
{
"valid case",
"HEAD",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
Expect(`git reset --hard "HEAD"`, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
},
}
for _, s := range scenarios {
t.Run(s.testName, func(t *testing.T) {
2021-12-30 08:19:01 +02:00
gitCmd := NewDummyGitCommandWithRunner(s.runner)
2021-04-10 03:40:42 +02:00
s.test(gitCmd.ResetHard(s.ref))
})
}
}