diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2022-09-16 22:15:02 -0700 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2022-09-16 22:15:16 -0700 |
commit | 74acb3e86a3b171c79c06e3d5d02abcfe5c8cdd0 (patch) | |
tree | a68f7659fab9157d74bd39e9a296b26531ee1f66 /pkg/integration/tests | |
parent | 9351af382933d456de65acab1451b17677ddb171 (diff) |
add integration tests for cherry picking
Diffstat (limited to 'pkg/integration/tests')
-rw-r--r-- | pkg/integration/tests/branch/rebase.go | 47 | ||||
-rw-r--r-- | pkg/integration/tests/branch/rebase_and_drop.go | 3 | ||||
-rw-r--r-- | pkg/integration/tests/cherry_pick/cherry_pick.go | 66 | ||||
-rw-r--r-- | pkg/integration/tests/cherry_pick/cherry_pick_conflicts.go | 87 | ||||
-rw-r--r-- | pkg/integration/tests/shared/README.md | 1 | ||||
-rw-r--r-- | pkg/integration/tests/shared/conflicts.go | 49 | ||||
-rw-r--r-- | pkg/integration/tests/tests.go | 8 |
7 files changed, 215 insertions, 46 deletions
diff --git a/pkg/integration/tests/branch/rebase.go b/pkg/integration/tests/branch/rebase.go index 8b414b794..efaa07c88 100644 --- a/pkg/integration/tests/branch/rebase.go +++ b/pkg/integration/tests/branch/rebase.go @@ -3,59 +3,16 @@ package branch import ( "github.com/jesseduffield/lazygit/pkg/config" . "github.com/jesseduffield/lazygit/pkg/integration/components" + "github.com/jesseduffield/lazygit/pkg/integration/tests/shared" ) -var originalFileContent = ` -This -Is -The -Original -File -` - -var firstChangeFileContent = ` -This -Is -The -First Change -File -` - -var secondChangeFileContent = ` -This -Is -The -Second Change -File -` - -// prepares us for a rebase that has conflicts -var commonRebaseSetup = func(shell *Shell) { - shell. - NewBranch("original-branch"). - EmptyCommit("one"). - EmptyCommit("two"). - EmptyCommit("three"). - CreateFileAndAdd("file", originalFileContent). - Commit("original"). - NewBranch("first-change-branch"). - UpdateFileAndAdd("file", firstChangeFileContent). - Commit("first change"). - Checkout("original-branch"). - NewBranch("second-change-branch"). - UpdateFileAndAdd("file", secondChangeFileContent). - Commit("second change"). - EmptyCommit("second-change-branch unrelated change"). - Checkout("first-change-branch") -} - var Rebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rebase onto another branch, deal with the conflicts.", ExtraCmdArgs: "", Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { - commonRebaseSetup(shell) + shared.MergeConflictsSetup(shell) }, Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) { input.SwitchToBranchesWindow() diff --git a/pkg/integration/tests/branch/rebase_and_drop.go b/pkg/integration/tests/branch/rebase_and_drop.go index d87919a0a..853ed692d 100644 --- a/pkg/integration/tests/branch/rebase_and_drop.go +++ b/pkg/integration/tests/branch/rebase_and_drop.go @@ -3,6 +3,7 @@ package branch import ( "github.com/jesseduffield/lazygit/pkg/config" . "github.com/jesseduffield/lazygit/pkg/integration/components" + "github.com/jesseduffield/lazygit/pkg/integration/tests/shared" ) var RebaseAndDrop = NewIntegrationTest(NewIntegrationTestArgs{ @@ -11,7 +12,7 @@ var RebaseAndDrop = NewIntegrationTest(NewIntegrationTestArgs{ Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { - commonRebaseSetup(shell) + shared.MergeConflictsSetup(shell) // addin a couple additional commits so that we can drop one shell.EmptyCommit("to remove") shell.EmptyCommit("to keep") diff --git a/pkg/integration/tests/cherry_pick/cherry_pick.go b/pkg/integration/tests/cherry_pick/cherry_pick.go new file mode 100644 index 000000000..0f5715434 --- /dev/null +++ b/pkg/integration/tests/cherry_pick/cherry_pick.go @@ -0,0 +1,66 @@ +package cherry_pick + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var CherryPick = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Cherry pick commits from the subcommits view, without conflicts", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell. + EmptyCommit("base"). + NewBranch("first-branch"). + NewBranch("second-branch"). + Checkout("first-branch"). + EmptyCommit("one"). + EmptyCommit("two"). + Checkout("second-branch"). + EmptyCommit("three"). + EmptyCommit("four"). + Checkout("first-branch") + }, + Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) { + input.SwitchToBranchesWindow() + assert.CurrentViewName("localBranches") + + assert.MatchSelectedLine(Contains("first-branch")) + input.NextItem() + assert.MatchSelectedLine(Contains("second-branch")) + + input.Enter() + + assert.CurrentViewName("subCommits") + assert.MatchSelectedLine(Contains("four")) + input.PressKeys(keys.Commits.CherryPickCopy) + assert.MatchViewContent("information", Contains("1 commit copied")) + + input.NextItem() + assert.MatchSelectedLine(Contains("three")) + input.PressKeys(keys.Commits.CherryPickCopy) + assert.MatchViewContent("information", Contains("2 commits copied")) + + input.SwitchToCommitsWindow() + assert.CurrentViewName("commits") + + assert.MatchSelectedLine(Contains("two")) + input.PressKeys(keys.Commits.PasteCommits) + assert.InAlert() + assert.MatchCurrentViewContent(Contains("Are you sure you want to cherry-pick the copied commits onto this branch?")) + + input.Confirm() + assert.CurrentViewName("commits") + assert.MatchSelectedLine(Contains("four")) + input.NextItem() + assert.MatchSelectedLine(Contains("three")) + input.NextItem() + assert.MatchSelectedLine(Contains("two")) + + assert.MatchViewContent("information", Contains("2 commits copied")) + input.PressKeys(keys.Universal.Return) + assert.MatchViewContent("information", NotContains("commits copied")) + }, +}) diff --git a/pkg/integration/tests/cherry_pick/cherry_pick_conflicts.go b/pkg/integration/tests/cherry_pick/cherry_pick_conflicts.go new file mode 100644 index 000000000..e747d8e4d --- /dev/null +++ b/pkg/integration/tests/cherry_pick/cherry_pick_conflicts.go @@ -0,0 +1,87 @@ +package cherry_pick + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" + "github.com/jesseduffield/lazygit/pkg/integration/tests/shared" +) + +var CherryPickConflicts = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Cherry pick commits from the subcommits view, with conflicts", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shared.MergeConflictsSetup(shell) + }, + Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) { + input.SwitchToBranchesWindow() + assert.CurrentViewName("localBranches") + + assert.MatchSelectedLine(Contains("first-change-branch")) + input.NextItem() + assert.MatchSelectedLine(Contains("second-change-branch")) + + input.Enter() + + assert.CurrentViewName("subCommits") + assert.MatchSelectedLine(Contains("second-change-branch unrelated change")) + input.PressKeys(keys.Commits.CherryPickCopy) + assert.MatchViewContent("information", Contains("1 commit copied")) + + input.NextItem() + assert.MatchSelectedLine(Contains("second change")) + input.PressKeys(keys.Commits.CherryPickCopy) + assert.MatchViewContent("information", Contains("2 commits copied")) + + input.SwitchToCommitsWindow() + assert.CurrentViewName("commits") + + assert.MatchSelectedLine(Contains("first change")) + input.PressKeys(keys.Commits.PasteCommits) + assert.InAlert() + assert.MatchCurrentViewContent(Contains("Are you sure you want to cherry-pick the copied commits onto this branch?")) + + input.Confirm() + + assert.MatchCurrentViewContent(Contains("Conflicts!")) + input.Confirm() + + assert.CurrentViewName("files") + assert.MatchSelectedLine(Contains("file")) + + // not using Confirm() convenience method because I suspect we might change this + // keybinding to something more bespoke + input.PressKeys(keys.Universal.Confirm) + + assert.CurrentViewName("mergeConflicts") + // picking 'Second change' + input.NextItem() + input.PrimaryAction() + + assert.InConfirm() + assert.MatchCurrentViewContent(Contains("all merge conflicts resolved. Continue?")) + input.Confirm() + + assert.CurrentViewName("files") + assert.WorkingTreeFileCount(0) + + input.SwitchToCommitsWindow() + assert.CurrentViewName("commits") + + assert.MatchSelectedLine(Contains("second-change-branch unrelated change")) + input.NextItem() + assert.MatchSelectedLine(Contains("second change")) + // because we picked 'Second change' when resolving the conflict, + // we now see this commit as having replaced First Change with Second Change, + // as opposed to replacing 'Original' with 'Second change' + assert.MatchMainViewContent(Contains("-First Change")) + assert.MatchMainViewContent(Contains("+Second Change")) + input.NextItem() + assert.MatchSelectedLine(Contains("first change")) + + assert.MatchViewContent("information", Contains("2 commits copied")) + input.PressKeys(keys.Universal.Return) + assert.MatchViewContent("information", NotContains("commits copied")) + }, +}) diff --git a/pkg/integration/tests/shared/README.md b/pkg/integration/tests/shared/README.md new file mode 100644 index 000000000..2dc27a428 --- /dev/null +++ b/pkg/integration/tests/shared/README.md @@ -0,0 +1 @@ +This package contains shared helper functions for tests. It is not intended to contain any actual tests itself. diff --git a/pkg/integration/tests/shared/conflicts.go b/pkg/integration/tests/shared/conflicts.go new file mode 100644 index 000000000..f01125c91 --- /dev/null +++ b/pkg/integration/tests/shared/conflicts.go @@ -0,0 +1,49 @@ +package shared + +import ( + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var OriginalFileContent = ` +This +Is +The +Original +File +` + +var FirstChangeFileContent = ` +This +Is +The +First Change +File +` + +var SecondChangeFileContent = ` +This +Is +The +Second Change +File +` + +// prepares us for a rebase/merge that has conflicts +var MergeConflictsSetup = func(shell *Shell) { + shell. + NewBranch("original-branch"). + EmptyCommit("one"). + EmptyCommit("two"). + EmptyCommit("three"). + CreateFileAndAdd("file", OriginalFileContent). + Commit("original"). + NewBranch("first-change-branch"). + UpdateFileAndAdd("file", FirstChangeFileContent). + Commit("first change"). + Checkout("original-branch"). + NewBranch("second-change-branch"). + UpdateFileAndAdd("file", SecondChangeFileContent). + Commit("second change"). + EmptyCommit("second-change-branch unrelated change"). + Checkout("first-change-branch") +} diff --git a/pkg/integration/tests/tests.go b/pkg/integration/tests/tests.go index 0721fbf17..9280347be 100644 --- a/pkg/integration/tests/tests.go +++ b/pkg/integration/tests/tests.go @@ -11,6 +11,7 @@ import ( "github.com/jesseduffield/lazygit/pkg/integration/components" "github.com/jesseduffield/lazygit/pkg/integration/tests/bisect" "github.com/jesseduffield/lazygit/pkg/integration/tests/branch" + "github.com/jesseduffield/lazygit/pkg/integration/tests/cherry_pick" "github.com/jesseduffield/lazygit/pkg/integration/tests/commit" "github.com/jesseduffield/lazygit/pkg/integration/tests/custom_commands" "github.com/jesseduffield/lazygit/pkg/integration/tests/interactive_rebase" @@ -33,6 +34,8 @@ var tests = []*components.IntegrationTest{ custom_commands.MenuFromCommand, bisect.Basic, bisect.FromOtherBranch, + cherry_pick.CherryPick, + cherry_pick.CherryPickConflicts, } func GetTests() []*components.IntegrationTest { @@ -55,6 +58,11 @@ func GetTests() []*components.IntegrationTest { return nil } + // the shared directory won't itself contain tests: only shared helper functions + if filepath.Base(filepath.Dir(path)) == "shared" { + return nil + } + nameFromPath := components.TestNameFromFilePath(path) if !testNamesSet.Includes(nameFromPath) { missingTestNames = append(missingTestNames, nameFromPath) |