summaryrefslogtreecommitdiffstats
path: root/pkg/integration
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2023-02-21 21:49:48 +1100
committerJesse Duffield <jessedduffield@gmail.com>2023-02-21 21:50:03 +1100
commitbfde06d049f99cb8a544d56e24bf5412b7628bcf (patch)
tree09412e5eca11f428e800fa2079fe0d9bcc3ca650 /pkg/integration
parent6b8abb7887000a1f69b664841dce4385ec79289b (diff)
migrate push tests
Diffstat (limited to 'pkg/integration')
-rw-r--r--pkg/integration/components/shell.go4
-rw-r--r--pkg/integration/tests/sync/push.go57
-rw-r--r--pkg/integration/tests/sync/push_and_auto_set_upstream.go33
-rw-r--r--pkg/integration/tests/sync/push_and_set_upstream.go35
-rw-r--r--pkg/integration/tests/sync/push_follow_tags.go56
-rw-r--r--pkg/integration/tests/sync/push_no_follow_tags.go55
-rw-r--r--pkg/integration/tests/sync/push_tag.go59
-rw-r--r--pkg/integration/tests/sync/push_with_credential_prompt.go75
-rw-r--r--pkg/integration/tests/tests_gen.go7
9 files changed, 381 insertions, 0 deletions
diff --git a/pkg/integration/components/shell.go b/pkg/integration/components/shell.go
index bacd23a45..2087cd389 100644
--- a/pkg/integration/components/shell.go
+++ b/pkg/integration/components/shell.go
@@ -140,6 +140,10 @@ func (self *Shell) CreateLightweightTag(name string, ref string) *Shell {
return self.RunCommand(fmt.Sprintf("git tag %s %s", name, ref))
}
+func (self *Shell) CreateAnnotatedTag(name string, message string, ref string) *Shell {
+ return self.RunCommand(fmt.Sprintf("git tag -a %s -m \"%s\" %s", name, message, ref))
+}
+
// convenience method for creating a file and adding it
func (self *Shell) CreateFileAndAdd(fileName string, fileContents string) *Shell {
return self.
diff --git a/pkg/integration/tests/sync/push.go b/pkg/integration/tests/sync/push.go
new file mode 100644
index 000000000..9fa095697
--- /dev/null
+++ b/pkg/integration/tests/sync/push.go
@@ -0,0 +1,57 @@
+package sync
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var Push = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Push a commit to a pre-configured upstream",
+ ExtraCmdArgs: "",
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {
+ },
+ SetupRepo: func(shell *Shell) {
+ shell.EmptyCommit("one")
+
+ shell.CloneIntoRemote("origin")
+
+ shell.SetBranchUpstream("master", "origin/master")
+
+ shell.EmptyCommit("two")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ t.Views().Status().Content(Contains("↑1 repo → master"))
+
+ t.Views().Files().
+ IsFocused().
+ Press(keys.Universal.Push)
+
+ assertSuccessfullyPushed(t)
+ },
+})
+
+func assertSuccessfullyPushed(t *TestDriver) {
+ t.Views().Status().Content(Contains("✓ repo → master"))
+
+ t.Views().Remotes().
+ Focus().
+ Lines(
+ Contains("origin"),
+ ).
+ PressEnter()
+
+ t.Views().RemoteBranches().
+ IsFocused().
+ Lines(
+ Contains("master"),
+ ).
+ PressEnter()
+
+ t.Views().SubCommits().
+ IsFocused().
+ Lines(
+ Contains("two"),
+ Contains("one"),
+ )
+}
diff --git a/pkg/integration/tests/sync/push_and_auto_set_upstream.go b/pkg/integration/tests/sync/push_and_auto_set_upstream.go
new file mode 100644
index 000000000..e8c8560e6
--- /dev/null
+++ b/pkg/integration/tests/sync/push_and_auto_set_upstream.go
@@ -0,0 +1,33 @@
+package sync
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var PushAndAutoSetUpstream = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Push a commit and set the upstream automatically as configured by git",
+ ExtraCmdArgs: "",
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {
+ },
+ SetupRepo: func(shell *Shell) {
+ shell.EmptyCommit("one")
+
+ shell.CloneIntoRemote("origin")
+
+ shell.EmptyCommit("two")
+
+ shell.SetConfig("push.default", "current")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ // assert no mention of upstream/downstream changes
+ t.Views().Status().Content(MatchesRegexp(`^\s+repo → master`))
+
+ t.Views().Files().
+ IsFocused().
+ Press(keys.Universal.Push)
+
+ assertSuccessfullyPushed(t)
+ },
+})
diff --git a/pkg/integration/tests/sync/push_and_set_upstream.go b/pkg/integration/tests/sync/push_and_set_upstream.go
new file mode 100644
index 000000000..a682832e1
--- /dev/null
+++ b/pkg/integration/tests/sync/push_and_set_upstream.go
@@ -0,0 +1,35 @@
+package sync
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var PushAndSetUpstream = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Push a commit and set the upstream via a prompt",
+ ExtraCmdArgs: "",
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {},
+ SetupRepo: func(shell *Shell) {
+ shell.EmptyCommit("one")
+
+ shell.CloneIntoRemote("origin")
+
+ shell.EmptyCommit("two")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ // assert no mention of upstream/downstream changes
+ t.Views().Status().Content(MatchesRegexp(`^\s+repo → master`))
+
+ t.Views().Files().
+ IsFocused().
+ Press(keys.Universal.Push)
+
+ t.ExpectPopup().Prompt().
+ Title(Equals("Enter upstream as '<remote> <branchname>'")).
+ SuggestionLines(Equals("origin master")).
+ ConfirmFirstSuggestion()
+
+ assertSuccessfullyPushed(t)
+ },
+})
diff --git a/pkg/integration/tests/sync/push_follow_tags.go b/pkg/integration/tests/sync/push_follow_tags.go
new file mode 100644
index 000000000..92a1074dc
--- /dev/null
+++ b/pkg/integration/tests/sync/push_follow_tags.go
@@ -0,0 +1,56 @@
+package sync
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var PushFollowTags = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Push with --follow-tags configured in git config",
+ ExtraCmdArgs: "",
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {
+ },
+ SetupRepo: func(shell *Shell) {
+ shell.EmptyCommit("one")
+
+ shell.CloneIntoRemote("origin")
+
+ shell.SetBranchUpstream("master", "origin/master")
+
+ shell.EmptyCommit("two")
+ shell.CreateAnnotatedTag("mytag", "message", "HEAD")
+
+ shell.SetConfig("push.followTags", "true")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ t.Views().Status().Content(Contains("↑1 repo → master"))
+
+ t.Views().Files().
+ IsFocused().
+ Press(keys.Universal.Push)
+
+ t.Views().Status().Content(Contains("✓ repo → master"))
+
+ t.Views().Remotes().
+ Focus().
+ Lines(
+ Contains("origin"),
+ ).
+ PressEnter()
+
+ t.Views().RemoteBranches().
+ IsFocused().
+ Lines(
+ Contains("master"),
+ ).
+ PressEnter()
+
+ t.Views().SubCommits().
+ IsFocused().
+ Lines(
+ Contains("two").Contains("mytag"),
+ Contains("one"),
+ )
+ },
+})
diff --git a/pkg/integration/tests/sync/push_no_follow_tags.go b/pkg/integration/tests/sync/push_no_follow_tags.go
new file mode 100644
index 000000000..eb7d04dff
--- /dev/null
+++ b/pkg/integration/tests/sync/push_no_follow_tags.go
@@ -0,0 +1,55 @@
+package sync
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var PushNoFollowTags = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Push with --follow-tags NOT configured in git config",
+ ExtraCmdArgs: "",
+ Skip: true, // turns out this actually DOES push the tag. I have no idea why
+ SetupConfig: func(config *config.AppConfig) {
+ },
+ SetupRepo: func(shell *Shell) {
+ shell.EmptyCommit("one")
+ shell.EmptyCommit("two")
+
+ shell.CloneIntoRemote("origin")
+
+ shell.SetBranchUpstream("master", "origin/master")
+
+ shell.CreateAnnotatedTag("mytag", "message", "HEAD")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ t.Views().Status().Content(Contains("✓ repo → master"))
+
+ t.Views().Files().
+ IsFocused().
+ Press(keys.Universal.Push)
+
+ t.Views().Status().Content(Contains("✓ repo → master"))
+
+ t.Views().Remotes().
+ Focus().
+ Lines(
+ Contains("origin"),
+ ).
+ PressEnter()
+
+ t.Views().RemoteBranches().
+ IsFocused().
+ Lines(
+ Contains("master"),
+ ).
+ PressEnter()
+
+ t.Views().SubCommits().
+ IsFocused().
+ Lines(
+ // tag was not pushed to upstream
+ Contains("two").DoesNotContain("mytag"),
+ Contains("one"),
+ )
+ },
+})
diff --git a/pkg/integration/tests/sync/push_tag.go b/pkg/integration/tests/sync/push_tag.go
new file mode 100644
index 000000000..3a6739278
--- /dev/null
+++ b/pkg/integration/tests/sync/push_tag.go
@@ -0,0 +1,59 @@
+package sync
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var PushTag = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Push a specific tag",
+ ExtraCmdArgs: "",
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {
+ },
+ SetupRepo: func(shell *Shell) {
+ shell.EmptyCommit("one")
+ shell.EmptyCommit("two")
+
+ shell.CloneIntoRemote("origin")
+
+ shell.CreateAnnotatedTag("mytag", "message", "HEAD")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ t.Views().Tags().
+ Focus().
+ Lines(
+ Contains("mytag"),
+ ).
+ Press(keys.Branches.PushTag)
+
+ t.ExpectPopup().Prompt().
+ Title(Equals("remote to push tag 'mytag' to:")).
+ InitialText(Equals("origin")).
+ SuggestionLines(
+ Contains("origin"),
+ ).
+ Confirm()
+
+ t.Views().Remotes().
+ Focus().
+ Lines(
+ Contains("origin"),
+ ).
+ PressEnter()
+
+ t.Views().RemoteBranches().
+ IsFocused().
+ Lines(
+ Contains("master"),
+ ).
+ PressEnter()
+
+ t.Views().SubCommits().
+ IsFocused().
+ Lines(
+ Contains("two").Contains("mytag"),
+ Contains("one"),
+ )
+ },
+})
diff --git a/pkg/integration/tests/sync/push_with_credential_prompt.go b/pkg/integration/tests/sync/push_with_credential_prompt.go
new file mode 100644
index 000000000..8c5341716
--- /dev/null
+++ b/pkg/integration/tests/sync/push_with_credential_prompt.go
@@ -0,0 +1,75 @@
+package sync
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var PushWithCredentialPrompt = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Push a commit to a pre-configured upstream, where credentials are required",
+ ExtraCmdArgs: "",
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {
+ },
+ SetupRepo: func(shell *Shell) {
+ shell.EmptyCommit("one")
+
+ shell.CloneIntoRemote("origin")
+
+ shell.SetBranchUpstream("master", "origin/master")
+
+ shell.EmptyCommit("two")
+
+ // actually getting a password prompt is tricky: it requires SSH'ing into localhost under a newly created, restricted, user.
+ // This is not easy to do in a cross-platform way, nor is it easy to do in a docker container.
+ // If you can think of a way to do it, please let me know!
+ shell.RunCommand("cp ../../../../../hooks/pre-push .git/hooks/pre-push")
+ shell.RunCommand("chmod +x .git/hooks/pre-push")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ t.Views().Status().Content(Contains("↑1 repo → master"))
+
+ t.Views().Files().
+ IsFocused().
+ Press(keys.Universal.Push)
+
+ // correct credentials are: username=username, password=password
+
+ t.ExpectPopup().Prompt().
+ Title(Equals("Username")).
+ Type("username").
+ Confirm()
+
+ // enter incorrect password
+ t.ExpectPopup().Prompt().
+ Title(Equals("Password")).
+ Type("incorrect password").
+ Confirm()
+
+ t.ExpectPopup().Alert().
+ Title(Equals("Error")).
+ Content(Contains("incorrect username/password")).
+ Confirm()
+
+ t.Views().Status().Content(Contains("↑1 repo → master"))
+
+ // try again with correct password
+ t.Views().Files().
+ IsFocused().
+ Press(keys.Universal.Push)
+
+ t.ExpectPopup().Prompt().
+ Title(Equals("Username")).
+ Type("username").
+ Confirm()
+
+ t.ExpectPopup().Prompt().
+ Title(Equals("Password")).
+ Type("password").
+ Confirm()
+
+ t.Views().Status().Content(Contains("✓ repo → master"))
+
+ assertSuccessfullyPushed(t)
+ },
+})
diff --git a/pkg/integration/tests/tests_gen.go b/pkg/integration/tests/tests_gen.go
index c7cf462fe..815939599 100644
--- a/pkg/integration/tests/tests_gen.go
+++ b/pkg/integration/tests/tests_gen.go
@@ -103,6 +103,13 @@ var tests = []*components.IntegrationTest{
sync.ForcePushMultipleUpstream,
sync.Pull,
sync.PullAndSetUpstream,
+ sync.Push,
+ sync.PushAndAutoSetUpstream,
+ sync.PushAndSetUpstream,
+ sync.PushFollowTags,
+ sync.PushNoFollowTags,
+ sync.PushTag,
+ sync.PushWithCredentialPrompt,
sync.RenameBranchAndPull,
tag.Checkout,
tag.CrudAnnotated,