mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-04 10:34:55 +02:00
Add GitVersion field to NewIntegrationTestArgs
It can be used to specify which git versions a given test should or should not run on.
This commit is contained in:
parent
227b0b781c
commit
a304fed68c
@ -32,7 +32,7 @@ func ParseGitVersion(versionStr string) (*GitVersion, error) {
|
|||||||
// versionStr should be something like:
|
// versionStr should be something like:
|
||||||
// git version 2.39.0
|
// git version 2.39.0
|
||||||
// git version 2.37.1 (Apple Git-137.1)
|
// git version 2.37.1 (Apple Git-137.1)
|
||||||
re := regexp.MustCompile(`[^\d]+(\d+)(\.\d+)?(\.\d+)?(.*)`)
|
re := regexp.MustCompile(`[^\d]*(\d+)(\.\d+)?(\.\d+)?(.*)`)
|
||||||
matches := re.FindStringSubmatch(versionStr)
|
matches := re.FindStringSubmatch(versionStr)
|
||||||
|
|
||||||
if len(matches) < 5 {
|
if len(matches) < 5 {
|
||||||
@ -65,3 +65,7 @@ func (v *GitVersion) IsOlderThan(major, minor, patch int) bool {
|
|||||||
required := major*1000*1000 + minor*1000 + patch
|
required := major*1000*1000 + minor*1000 + patch
|
||||||
return actual < required
|
return actual < required
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v *GitVersion) IsOlderThanVersion(version *GitVersion) bool {
|
||||||
|
return v.IsOlderThan(version.Major, version.Minor, version.Patch)
|
||||||
|
}
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/jesseduffield/lazycore/pkg/utils"
|
"github.com/jesseduffield/lazycore/pkg/utils"
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/commands/git_commands"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -42,6 +43,11 @@ func RunTests(
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gitVersion, err := getGitVersion()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
test := test
|
test := test
|
||||||
|
|
||||||
@ -51,7 +57,7 @@ func RunTests(
|
|||||||
)
|
)
|
||||||
|
|
||||||
for i := 0; i < maxAttempts; i++ {
|
for i := 0; i < maxAttempts; i++ {
|
||||||
err := runTest(test, paths, projectRootDir, logf, runCmd, sandbox, keyPressDelay)
|
err := runTest(test, paths, projectRootDir, logf, runCmd, sandbox, keyPressDelay, gitVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if i == maxAttempts-1 {
|
if i == maxAttempts-1 {
|
||||||
return err
|
return err
|
||||||
@ -77,12 +83,18 @@ func runTest(
|
|||||||
runCmd func(cmd *exec.Cmd) error,
|
runCmd func(cmd *exec.Cmd) error,
|
||||||
sandbox bool,
|
sandbox bool,
|
||||||
keyPressDelay int,
|
keyPressDelay int,
|
||||||
|
gitVersion *git_commands.GitVersion,
|
||||||
) error {
|
) error {
|
||||||
if test.Skip() {
|
if test.Skip() {
|
||||||
logf("Skipping test %s", test.Name())
|
logf("Skipping test %s", test.Name())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !test.ShouldRunForGitVersion(gitVersion) {
|
||||||
|
logf("Skipping test %s for git version %d.%d.%d", test.Name(), gitVersion.Major, gitVersion.Minor, gitVersion.Patch)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
logf("path: %s", paths.Root())
|
logf("path: %s", paths.Root())
|
||||||
|
|
||||||
if err := prepareTestDir(test, paths, projectRootDir); err != nil {
|
if err := prepareTestDir(test, paths, projectRootDir); err != nil {
|
||||||
@ -144,6 +156,16 @@ func globalGitConfigPath(rootDir string) string {
|
|||||||
return filepath.Join(rootDir, "test", "global_git_config")
|
return filepath.Join(rootDir, "test", "global_git_config")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getGitVersion() (*git_commands.GitVersion, error) {
|
||||||
|
osCommand := oscommands.NewDummyOSCommand()
|
||||||
|
cmdObj := osCommand.Cmd.New("git --version")
|
||||||
|
versionStr, err := cmdObj.RunWithOutput()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return git_commands.ParseGitVersion(versionStr)
|
||||||
|
}
|
||||||
|
|
||||||
func getLazygitCommand(test *IntegrationTest, paths Paths, rootDir string, sandbox bool, keyPressDelay int) (*exec.Cmd, error) {
|
func getLazygitCommand(test *IntegrationTest, paths Paths, rootDir string, sandbox bool, keyPressDelay int) (*exec.Cmd, error) {
|
||||||
osCommand := oscommands.NewDummyOSCommand()
|
osCommand := oscommands.NewDummyOSCommand()
|
||||||
|
|
||||||
|
@ -5,6 +5,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/jesseduffield/generics/slices"
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/commands/git_commands"
|
||||||
"github.com/jesseduffield/lazygit/pkg/config"
|
"github.com/jesseduffield/lazygit/pkg/config"
|
||||||
"github.com/jesseduffield/lazygit/pkg/env"
|
"github.com/jesseduffield/lazygit/pkg/env"
|
||||||
integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types"
|
integrationTypes "github.com/jesseduffield/lazygit/pkg/integration/types"
|
||||||
@ -28,6 +30,7 @@ type IntegrationTest struct {
|
|||||||
testDriver *TestDriver,
|
testDriver *TestDriver,
|
||||||
keys config.KeybindingConfig,
|
keys config.KeybindingConfig,
|
||||||
)
|
)
|
||||||
|
gitVersion GitVersionRestriction
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ integrationTypes.IntegrationTest = &IntegrationTest{}
|
var _ integrationTypes.IntegrationTest = &IntegrationTest{}
|
||||||
@ -45,6 +48,56 @@ type NewIntegrationTestArgs struct {
|
|||||||
ExtraCmdArgs string
|
ExtraCmdArgs string
|
||||||
// for when a test is flakey
|
// for when a test is flakey
|
||||||
Skip bool
|
Skip bool
|
||||||
|
// to run a test only on certain git versions
|
||||||
|
GitVersion GitVersionRestriction
|
||||||
|
}
|
||||||
|
|
||||||
|
type GitVersionRestriction struct {
|
||||||
|
// Only one of these fields can be non-empty; use functions below to construct
|
||||||
|
from string
|
||||||
|
before string
|
||||||
|
includes []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verifies the version is at least the given version (inclusive)
|
||||||
|
func From(version string) GitVersionRestriction {
|
||||||
|
return GitVersionRestriction{from: version}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verifies the version is before the given version (exclusive)
|
||||||
|
func Before(version string) GitVersionRestriction {
|
||||||
|
return GitVersionRestriction{before: version}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Includes(versions ...string) GitVersionRestriction {
|
||||||
|
return GitVersionRestriction{includes: versions}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self GitVersionRestriction) shouldRunOnVersion(version *git_commands.GitVersion) bool {
|
||||||
|
if self.from != "" {
|
||||||
|
from, err := git_commands.ParseGitVersion(self.from)
|
||||||
|
if err != nil {
|
||||||
|
panic("Invalid git version string: " + self.from)
|
||||||
|
}
|
||||||
|
return !version.IsOlderThanVersion(from)
|
||||||
|
}
|
||||||
|
if self.before != "" {
|
||||||
|
before, err := git_commands.ParseGitVersion(self.before)
|
||||||
|
if err != nil {
|
||||||
|
panic("Invalid git version string: " + self.before)
|
||||||
|
}
|
||||||
|
return version.IsOlderThanVersion(before)
|
||||||
|
}
|
||||||
|
if len(self.includes) != 0 {
|
||||||
|
return slices.Some(self.includes, func(str string) bool {
|
||||||
|
v, err := git_commands.ParseGitVersion(str)
|
||||||
|
if err != nil {
|
||||||
|
panic("Invalid git version string: " + str)
|
||||||
|
}
|
||||||
|
return version.Major == v.Major && version.Minor == v.Minor && version.Patch == v.Patch
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewIntegrationTest(args NewIntegrationTestArgs) *IntegrationTest {
|
func NewIntegrationTest(args NewIntegrationTestArgs) *IntegrationTest {
|
||||||
@ -63,6 +116,7 @@ func NewIntegrationTest(args NewIntegrationTestArgs) *IntegrationTest {
|
|||||||
setupRepo: args.SetupRepo,
|
setupRepo: args.SetupRepo,
|
||||||
setupConfig: args.SetupConfig,
|
setupConfig: args.SetupConfig,
|
||||||
run: args.Run,
|
run: args.Run,
|
||||||
|
gitVersion: args.GitVersion,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,6 +136,10 @@ func (self *IntegrationTest) Skip() bool {
|
|||||||
return self.skip
|
return self.skip
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *IntegrationTest) ShouldRunForGitVersion(version *git_commands.GitVersion) bool {
|
||||||
|
return self.gitVersion.shouldRunOnVersion(version)
|
||||||
|
}
|
||||||
|
|
||||||
func (self *IntegrationTest) SetupConfig(config *config.AppConfig) {
|
func (self *IntegrationTest) SetupConfig(config *config.AppConfig) {
|
||||||
self.setupConfig(config)
|
self.setupConfig(config)
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/jesseduffield/gocui"
|
"github.com/jesseduffield/gocui"
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/commands/git_commands"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
||||||
"github.com/jesseduffield/lazygit/pkg/config"
|
"github.com/jesseduffield/lazygit/pkg/config"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||||
@ -87,3 +88,65 @@ func TestSuccess(t *testing.T) {
|
|||||||
assert.EqualValues(t, []string{"a", "b"}, driver.pressedKeys)
|
assert.EqualValues(t, []string{"a", "b"}, driver.pressedKeys)
|
||||||
assert.Equal(t, "", driver.failureMessage)
|
assert.Equal(t, "", driver.failureMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGitVersionRestriction(t *testing.T) {
|
||||||
|
scenarios := []struct {
|
||||||
|
testName string
|
||||||
|
gitVersion GitVersionRestriction
|
||||||
|
expectedShouldRun bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
testName: "From, current is newer",
|
||||||
|
gitVersion: From("2.24.9"),
|
||||||
|
expectedShouldRun: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
testName: "From, current is same",
|
||||||
|
gitVersion: From("2.25.0"),
|
||||||
|
expectedShouldRun: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
testName: "From, current is older",
|
||||||
|
gitVersion: From("2.26.0"),
|
||||||
|
expectedShouldRun: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
testName: "Before, current is older",
|
||||||
|
gitVersion: Before("2.24.9"),
|
||||||
|
expectedShouldRun: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
testName: "Before, current is same",
|
||||||
|
gitVersion: Before("2.25.0"),
|
||||||
|
expectedShouldRun: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
testName: "Before, current is newer",
|
||||||
|
gitVersion: Before("2.26.0"),
|
||||||
|
expectedShouldRun: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
testName: "Includes, current is included",
|
||||||
|
gitVersion: Includes("2.23.0", "2.25.0"),
|
||||||
|
expectedShouldRun: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
testName: "Includes, current is not included",
|
||||||
|
gitVersion: Includes("2.23.0", "2.27.0"),
|
||||||
|
expectedShouldRun: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
currentGitVersion := git_commands.GitVersion{Major: 2, Minor: 25, Patch: 0}
|
||||||
|
|
||||||
|
for _, s := range scenarios {
|
||||||
|
t.Run(s.testName, func(t *testing.T) {
|
||||||
|
test := NewIntegrationTest(NewIntegrationTestArgs{
|
||||||
|
Description: unitTestDescription,
|
||||||
|
GitVersion: s.gitVersion,
|
||||||
|
})
|
||||||
|
shouldRun := test.ShouldRunForGitVersion(¤tGitVersion)
|
||||||
|
assert.Equal(t, shouldRun, s.expectedShouldRun)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user