diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2023-02-21 21:49:48 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2023-02-21 21:50:03 +1100 |
commit | bfde06d049f99cb8a544d56e24bf5412b7628bcf (patch) | |
tree | 09412e5eca11f428e800fa2079fe0d9bcc3ca650 /pkg/integration | |
parent | 6b8abb7887000a1f69b664841dce4385ec79289b (diff) |
migrate push tests
Diffstat (limited to 'pkg/integration')
-rw-r--r-- | pkg/integration/components/shell.go | 4 | ||||
-rw-r--r-- | pkg/integration/tests/sync/push.go | 57 | ||||
-rw-r--r-- | pkg/integration/tests/sync/push_and_auto_set_upstream.go | 33 | ||||
-rw-r--r-- | pkg/integration/tests/sync/push_and_set_upstream.go | 35 | ||||
-rw-r--r-- | pkg/integration/tests/sync/push_follow_tags.go | 56 | ||||
-rw-r--r-- | pkg/integration/tests/sync/push_no_follow_tags.go | 55 | ||||
-rw-r--r-- | pkg/integration/tests/sync/push_tag.go | 59 | ||||
-rw-r--r-- | pkg/integration/tests/sync/push_with_credential_prompt.go | 75 | ||||
-rw-r--r-- | pkg/integration/tests/tests_gen.go | 7 |
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, |