summaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2022-09-16 22:15:02 -0700
committerJesse Duffield <jessedduffield@gmail.com>2022-09-16 22:15:16 -0700
commit74acb3e86a3b171c79c06e3d5d02abcfe5c8cdd0 (patch)
treea68f7659fab9157d74bd39e9a296b26531ee1f66 /pkg
parent9351af382933d456de65acab1451b17677ddb171 (diff)
add integration tests for cherry picking
Diffstat (limited to 'pkg')
-rw-r--r--pkg/gui/modes.go11
-rw-r--r--pkg/i18n/english.go4
-rw-r--r--pkg/integration/components/assert.go2
-rw-r--r--pkg/integration/components/input.go5
-rw-r--r--pkg/integration/tests/branch/rebase.go47
-rw-r--r--pkg/integration/tests/branch/rebase_and_drop.go3
-rw-r--r--pkg/integration/tests/cherry_pick/cherry_pick.go66
-rw-r--r--pkg/integration/tests/cherry_pick/cherry_pick_conflicts.go87
-rw-r--r--pkg/integration/tests/shared/README.md1
-rw-r--r--pkg/integration/tests/shared/conflicts.go49
-rw-r--r--pkg/integration/tests/tests.go8
11 files changed, 234 insertions, 49 deletions
diff --git a/pkg/gui/modes.go b/pkg/gui/modes.go
index 3a3bc51a6..70d403db2 100644
--- a/pkg/gui/modes.go
+++ b/pkg/gui/modes.go
@@ -53,10 +53,17 @@ func (gui *Gui) modeStatuses() []modeStatus {
{
isActive: gui.State.Modes.CherryPicking.Active,
description: func() string {
+ copiedCount := len(gui.State.Modes.CherryPicking.CherryPickedCommits)
+ text := gui.c.Tr.LcCommitsCopied
+ if copiedCount == 1 {
+ text = gui.c.Tr.LcCommitCopied
+ }
+
return gui.withResetButton(
fmt.Sprintf(
- "%d commits copied",
- len(gui.State.Modes.CherryPicking.CherryPickedCommits),
+ "%d %s",
+ copiedCount,
+ text,
),
style.FgCyan,
)
diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go
index 608ad2f45..08f737a51 100644
--- a/pkg/i18n/english.go
+++ b/pkg/i18n/english.go
@@ -507,6 +507,8 @@ type TranslationSet struct {
EmptyOutput string
Patch string
CustomPatch string
+ LcCommitsCopied string
+ LcCommitCopied string
Actions Actions
Bisect Bisect
}
@@ -1147,6 +1149,8 @@ func EnglishTranslationSet() TranslationSet {
EmptyOutput: "<empty output>",
Patch: "Patch",
CustomPatch: "Custom patch",
+ LcCommitsCopied: "commits copied",
+ LcCommitCopied: "commit copied",
Actions: Actions{
// TODO: combine this with the original keybinding descriptions (those are all in lowercase atm)
CheckoutCommit: "Checkout commit",
diff --git a/pkg/integration/components/assert.go b/pkg/integration/components/assert.go
index 28be134a6..daa376c66 100644
--- a/pkg/integration/components/assert.go
+++ b/pkg/integration/components/assert.go
@@ -217,7 +217,7 @@ func (self *Assert) matchString(matcher *matcher, context string, getValue func(
}
func (self *Assert) assertWithRetries(test func() (bool, string)) {
- waitTimes := []int{0, 1, 5, 10, 200, 500, 1000, 2000}
+ waitTimes := []int{0, 1, 5, 10, 200, 500, 1000, 2000, 4000}
var message string
for _, waitTime := range waitTimes {
diff --git a/pkg/integration/components/input.go b/pkg/integration/components/input.go
index 45ffdfc5d..61c78e9eb 100644
--- a/pkg/integration/components/input.go
+++ b/pkg/integration/components/input.go
@@ -76,6 +76,11 @@ func (self *Input) Confirm() {
self.pressKey(self.keys.Universal.Confirm)
}
+// i.e. same as Confirm
+func (self *Input) Enter() {
+ self.pressKey(self.keys.Universal.Confirm)
+}
+
// i.e. pressing escape
func (self *Input) Cancel() {
self.pressKey(self.keys.Universal.Return)
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)