1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2024-12-14 11:23:09 +02:00
lazygit/pkg/commands/git_commands/branch_test.go

277 lines
8.1 KiB
Go
Raw Normal View History

2022-01-08 05:00:36 +02:00
package git_commands
2021-04-10 03:40:42 +02:00
import (
"testing"
2021-12-30 08:19:01 +02:00
"github.com/go-errors/errors"
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
2023-05-20 08:55:07 +02:00
"github.com/jesseduffield/lazygit/pkg/config"
2021-04-10 03:40:42 +02:00
"github.com/stretchr/testify/assert"
)
2022-01-08 04:22:29 +02:00
func TestBranchGetCommitDifferences(t *testing.T) {
2021-04-10 03:40:42 +02:00
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).
ExpectGitArgs([]string{"rev-list", "@{u}..HEAD", "--count"}, "", errors.New("error")),
2021-12-30 08:19:01 +02:00
"?", "?",
2021-04-10 03:40:42 +02:00
},
{
"Can't retrieve pullable count",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
ExpectGitArgs([]string{"rev-list", "@{u}..HEAD", "--count"}, "1\n", nil).
ExpectGitArgs([]string{"rev-list", "HEAD..@{u}", "--count"}, "", errors.New("error")),
2021-12-30 08:19:01 +02:00
"?", "?",
2021-04-10 03:40:42 +02:00
},
{
"Retrieve pullable and pushable count",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
ExpectGitArgs([]string{"rev-list", "@{u}..HEAD", "--count"}, "1\n", nil).
ExpectGitArgs([]string{"rev-list", "HEAD..@{u}", "--count"}, "2\n", nil),
2021-12-30 08:19:01 +02:00
"1", "2",
2021-04-10 03:40:42 +02:00
},
}
for _, s := range scenarios {
2022-01-08 06:46:35 +02:00
s := s
2021-04-10 03:40:42 +02:00
t.Run(s.testName, func(t *testing.T) {
instance := buildBranchCommands(commonDeps{runner: s.runner})
2022-01-08 04:22:29 +02:00
pushables, pullables := instance.GetCommitDifferences("HEAD", "@{u}")
2021-12-30 08:19:01 +02:00
assert.EqualValues(t, s.expectedPushables, pushables)
assert.EqualValues(t, s.expectedPullables, pullables)
s.runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
})
}
}
2022-01-08 04:22:29 +02:00
func TestBranchNewBranch(t *testing.T) {
2021-12-30 08:19:01 +02:00
runner := oscommands.NewFakeRunner(t).
ExpectGitArgs([]string{"checkout", "-b", "test", "refs/heads/master"}, "", nil)
instance := buildBranchCommands(commonDeps{runner: runner})
2021-04-10 03:40:42 +02:00
assert.NoError(t, instance.New("test", "refs/heads/master"))
2021-12-30 08:19:01 +02:00
runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
}
2022-01-08 04:22:29 +02:00
func TestBranchDeleteBranch(t *testing.T) {
2021-04-10 03:40:42 +02:00
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,
oscommands.NewFakeRunner(t).ExpectGitArgs([]string{"branch", "-d", "test"}, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
},
{
"Force delete a branch",
true,
oscommands.NewFakeRunner(t).ExpectGitArgs([]string{"branch", "-D", "test"}, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
},
}
for _, s := range scenarios {
2022-01-08 06:46:35 +02:00
s := s
2021-04-10 03:40:42 +02:00
t.Run(s.testName, func(t *testing.T) {
instance := buildBranchCommands(commonDeps{runner: s.runner})
2021-12-30 08:19:01 +02:00
s.test(instance.LocalDelete("test", s.force))
2021-12-30 08:19:01 +02:00
s.runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
})
}
}
2022-01-08 04:22:29 +02:00
func TestBranchMerge(t *testing.T) {
2023-05-20 08:55:07 +02:00
scenarios := []struct {
testName string
userConfig *config.UserConfig
opts MergeOpts
branchName string
expected []string
2023-05-20 08:55:07 +02:00
}{
{
testName: "basic",
userConfig: &config.UserConfig{},
opts: MergeOpts{},
branchName: "mybranch",
expected: []string{"merge", "--no-edit", "mybranch"},
2023-05-20 08:55:07 +02:00
},
{
testName: "merging args",
userConfig: &config.UserConfig{
Git: config.GitConfig{
Merging: config.MergingConfig{
Args: "--merging-args", // it's up to the user what they put here
},
},
},
opts: MergeOpts{},
branchName: "mybranch",
expected: []string{"merge", "--no-edit", "--merging-args", "mybranch"},
2023-05-20 08:55:07 +02:00
},
{
testName: "fast forward only",
userConfig: &config.UserConfig{},
opts: MergeOpts{FastForwardOnly: true},
branchName: "mybranch",
expected: []string{"merge", "--no-edit", "--ff-only", "mybranch"},
2023-05-20 08:55:07 +02:00
},
}
2021-04-10 03:40:42 +02:00
2023-05-20 08:55:07 +02:00
for _, s := range scenarios {
s := s
t.Run(s.testName, func(t *testing.T) {
runner := oscommands.NewFakeRunner(t).
ExpectGitArgs(s.expected, "", nil)
2023-05-20 08:55:07 +02:00
instance := buildBranchCommands(commonDeps{runner: runner, userConfig: s.userConfig})
assert.NoError(t, instance.Merge(s.branchName, s.opts))
runner.CheckForMissingCalls()
})
}
2021-04-10 03:40:42 +02:00
}
2022-01-08 04:22:29 +02:00
func TestBranchCheckout(t *testing.T) {
2021-04-10 03:40:42 +02:00
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",
oscommands.NewFakeRunner(t).ExpectGitArgs([]string{"checkout", "test"}, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
false,
},
{
"Checkout forced",
oscommands.NewFakeRunner(t).ExpectGitArgs([]string{"checkout", "--force", "test"}, "", nil),
2021-04-10 03:40:42 +02:00
func(err error) {
assert.NoError(t, err)
},
true,
},
}
for _, s := range scenarios {
2022-01-08 06:46:35 +02:00
s := s
2021-04-10 03:40:42 +02:00
t.Run(s.testName, func(t *testing.T) {
instance := buildBranchCommands(commonDeps{runner: s.runner})
2022-01-08 04:22:29 +02:00
s.test(instance.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
})
}
}
2022-01-08 04:22:29 +02:00
func TestBranchGetBranchGraph(t *testing.T) {
2022-01-03 06:15:26 +02:00
runner := oscommands.NewFakeRunner(t).ExpectGitArgs([]string{
"log", "--graph", "--color=always", "--abbrev-commit", "--decorate", "--date=relative", "--pretty=medium", "test", "--",
2021-12-30 08:19:01 +02:00
}, "", nil)
instance := buildBranchCommands(commonDeps{runner: runner})
2022-01-08 04:22:29 +02:00
_, err := instance.GetGraph("test")
2021-04-10 03:40:42 +02:00
assert.NoError(t, err)
}
2022-01-08 04:22:29 +02:00
func TestBranchGetAllBranchGraph(t *testing.T) {
2022-01-03 06:15:26 +02:00
runner := oscommands.NewFakeRunner(t).ExpectGitArgs([]string{
"log", "--graph", "--all", "--color=always", "--abbrev-commit", "--decorate", "--date=relative", "--pretty=medium",
2021-12-30 08:19:01 +02:00
}, "", nil)
instance := buildBranchCommands(commonDeps{runner: runner})
2022-01-08 04:22:29 +02:00
err := instance.AllBranchesLogCmdObj().Run()
2021-04-10 03:40:42 +02:00
assert.NoError(t, err)
}
func TestBranchCurrentBranchInfo(t *testing.T) {
2021-04-10 03:40:42 +02:00
type scenario struct {
testName string
2021-12-30 08:19:01 +02:00
runner *oscommands.FakeCmdObjRunner
test func(BranchInfo, error)
2021-04-10 03:40:42 +02:00
}
scenarios := []scenario{
{
"says we are on the master branch if we are",
oscommands.NewFakeRunner(t).ExpectGitArgs([]string{"symbolic-ref", "--short", "HEAD"}, "master", nil),
func(info BranchInfo, err error) {
2021-04-10 03:40:42 +02:00
assert.NoError(t, err)
assert.EqualValues(t, "master", info.RefName)
assert.EqualValues(t, "master", info.DisplayName)
assert.False(t, info.DetachedHead)
2021-04-10 03:40:42 +02:00
},
},
{
"falls back to git `git branch --points-at=HEAD` if symbolic-ref fails",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
ExpectGitArgs([]string{"symbolic-ref", "--short", "HEAD"}, "", errors.New("error")).
ExpectGitArgs([]string{"branch", "--points-at=HEAD", "--format=%(HEAD)%00%(objectname)%00%(refname)"},
"*\x006f71c57a8d4bd6c11399c3f55f42c815527a73a4\x00(HEAD detached at 6f71c57a)\n", nil),
func(info BranchInfo, err error) {
2021-04-10 03:40:42 +02:00
assert.NoError(t, err)
assert.EqualValues(t, "6f71c57a8d4bd6c11399c3f55f42c815527a73a4", info.RefName)
assert.EqualValues(t, "(HEAD detached at 6f71c57a)", info.DisplayName)
assert.True(t, info.DetachedHead)
2021-04-10 03:40:42 +02:00
},
},
{
"handles a detached head (LANG=zh_CN.UTF-8)",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
ExpectGitArgs([]string{"symbolic-ref", "--short", "HEAD"}, "", errors.New("error")).
ExpectGitArgs(
[]string{"branch", "--points-at=HEAD", "--format=%(HEAD)%00%(objectname)%00%(refname)"},
"*\x00679b0456f3db7c505b398def84e7d023e5b55a8d\x00(头指针在 679b0456 分离)\n"+
" \x00679b0456f3db7c505b398def84e7d023e5b55a8d\x00refs/heads/master\n",
nil),
func(info BranchInfo, err error) {
2021-04-10 03:40:42 +02:00
assert.NoError(t, err)
assert.EqualValues(t, "679b0456f3db7c505b398def84e7d023e5b55a8d", info.RefName)
assert.EqualValues(t, "(头指针在 679b0456 分离)", info.DisplayName)
assert.True(t, info.DetachedHead)
2021-04-10 03:40:42 +02:00
},
},
{
"bubbles up error if there is one",
2021-12-30 08:19:01 +02:00
oscommands.NewFakeRunner(t).
ExpectGitArgs([]string{"symbolic-ref", "--short", "HEAD"}, "", errors.New("error")).
ExpectGitArgs([]string{"branch", "--points-at=HEAD", "--format=%(HEAD)%00%(objectname)%00%(refname)"}, "", errors.New("error")),
func(info BranchInfo, err error) {
2021-04-10 03:40:42 +02:00
assert.Error(t, err)
assert.EqualValues(t, "", info.RefName)
assert.EqualValues(t, "", info.DisplayName)
assert.False(t, info.DetachedHead)
2021-04-10 03:40:42 +02:00
},
},
}
for _, s := range scenarios {
2022-01-08 06:46:35 +02:00
s := s
2021-04-10 03:40:42 +02:00
t.Run(s.testName, func(t *testing.T) {
instance := buildBranchCommands(commonDeps{runner: s.runner})
s.test(instance.CurrentBranchInfo())
2021-12-30 08:19:01 +02:00
s.runner.CheckForMissingCalls()
2021-04-10 03:40:42 +02:00
})
}
}