mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-12 11:15:00 +02:00
228 lines
6.2 KiB
Go
228 lines
6.2 KiB
Go
package commands
|
|
|
|
import (
|
|
"os/exec"
|
|
"testing"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
|
"github.com/jesseduffield/lazygit/pkg/secureexec"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// TestGitCommandGetStatusFiles is a function.
|
|
func TestGitCommandGetStatusFiles(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
command func(string, ...string) *exec.Cmd
|
|
test func([]*models.File)
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
"No files found",
|
|
func(cmd string, args ...string) *exec.Cmd {
|
|
return secureexec.Command("echo")
|
|
},
|
|
func(files []*models.File) {
|
|
assert.Len(t, files, 0)
|
|
},
|
|
},
|
|
{
|
|
"Several files found",
|
|
func(cmd string, args ...string) *exec.Cmd {
|
|
return secureexec.Command(
|
|
"printf",
|
|
`MM file1.txt\0A file3.txt\0AM file2.txt\0?? file4.txt\0UU file5.txt`,
|
|
)
|
|
},
|
|
func(files []*models.File) {
|
|
assert.Len(t, files, 5)
|
|
|
|
expected := []*models.File{
|
|
{
|
|
Name: "file1.txt",
|
|
HasStagedChanges: true,
|
|
HasUnstagedChanges: true,
|
|
Tracked: true,
|
|
Added: false,
|
|
Deleted: false,
|
|
HasMergeConflicts: false,
|
|
HasInlineMergeConflicts: false,
|
|
DisplayString: "MM file1.txt",
|
|
Type: "other",
|
|
ShortStatus: "MM",
|
|
},
|
|
{
|
|
Name: "file3.txt",
|
|
HasStagedChanges: true,
|
|
HasUnstagedChanges: false,
|
|
Tracked: false,
|
|
Added: true,
|
|
Deleted: false,
|
|
HasMergeConflicts: false,
|
|
HasInlineMergeConflicts: false,
|
|
DisplayString: "A file3.txt",
|
|
Type: "other",
|
|
ShortStatus: "A ",
|
|
},
|
|
{
|
|
Name: "file2.txt",
|
|
HasStagedChanges: true,
|
|
HasUnstagedChanges: true,
|
|
Tracked: false,
|
|
Added: true,
|
|
Deleted: false,
|
|
HasMergeConflicts: false,
|
|
HasInlineMergeConflicts: false,
|
|
DisplayString: "AM file2.txt",
|
|
Type: "other",
|
|
ShortStatus: "AM",
|
|
},
|
|
{
|
|
Name: "file4.txt",
|
|
HasStagedChanges: false,
|
|
HasUnstagedChanges: true,
|
|
Tracked: false,
|
|
Added: true,
|
|
Deleted: false,
|
|
HasMergeConflicts: false,
|
|
HasInlineMergeConflicts: false,
|
|
DisplayString: "?? file4.txt",
|
|
Type: "other",
|
|
ShortStatus: "??",
|
|
},
|
|
{
|
|
Name: "file5.txt",
|
|
HasStagedChanges: false,
|
|
HasUnstagedChanges: true,
|
|
Tracked: true,
|
|
Added: false,
|
|
Deleted: false,
|
|
HasMergeConflicts: true,
|
|
HasInlineMergeConflicts: true,
|
|
DisplayString: "UU file5.txt",
|
|
Type: "other",
|
|
ShortStatus: "UU",
|
|
},
|
|
}
|
|
|
|
assert.EqualValues(t, expected, files)
|
|
},
|
|
},
|
|
{
|
|
"File with new line char",
|
|
func(cmd string, args ...string) *exec.Cmd {
|
|
return secureexec.Command(
|
|
"printf",
|
|
`MM a\nb.txt`,
|
|
)
|
|
},
|
|
func(files []*models.File) {
|
|
assert.Len(t, files, 1)
|
|
|
|
expected := []*models.File{
|
|
{
|
|
Name: "a\nb.txt",
|
|
HasStagedChanges: true,
|
|
HasUnstagedChanges: true,
|
|
Tracked: true,
|
|
Added: false,
|
|
Deleted: false,
|
|
HasMergeConflicts: false,
|
|
HasInlineMergeConflicts: false,
|
|
DisplayString: "MM a\nb.txt",
|
|
Type: "other",
|
|
ShortStatus: "MM",
|
|
},
|
|
}
|
|
|
|
assert.EqualValues(t, expected, files)
|
|
},
|
|
},
|
|
{
|
|
"Renamed files",
|
|
func(cmd string, args ...string) *exec.Cmd {
|
|
return secureexec.Command(
|
|
"printf",
|
|
`R after1.txt\0before1.txt\0RM after2.txt\0before2.txt`,
|
|
)
|
|
},
|
|
func(files []*models.File) {
|
|
assert.Len(t, files, 2)
|
|
|
|
expected := []*models.File{
|
|
{
|
|
Name: "after1.txt",
|
|
PreviousName: "before1.txt",
|
|
HasStagedChanges: true,
|
|
HasUnstagedChanges: false,
|
|
Tracked: true,
|
|
Added: false,
|
|
Deleted: false,
|
|
HasMergeConflicts: false,
|
|
HasInlineMergeConflicts: false,
|
|
DisplayString: "R before1.txt -> after1.txt",
|
|
Type: "other",
|
|
ShortStatus: "R ",
|
|
},
|
|
{
|
|
Name: "after2.txt",
|
|
PreviousName: "before2.txt",
|
|
HasStagedChanges: true,
|
|
HasUnstagedChanges: true,
|
|
Tracked: true,
|
|
Added: false,
|
|
Deleted: false,
|
|
HasMergeConflicts: false,
|
|
HasInlineMergeConflicts: false,
|
|
DisplayString: "RM before2.txt -> after2.txt",
|
|
Type: "other",
|
|
ShortStatus: "RM",
|
|
},
|
|
}
|
|
|
|
assert.EqualValues(t, expected, files)
|
|
},
|
|
},
|
|
{
|
|
"File with arrow in name",
|
|
func(cmd string, args ...string) *exec.Cmd {
|
|
return secureexec.Command(
|
|
"printf",
|
|
`?? a -> b.txt`,
|
|
)
|
|
},
|
|
func(files []*models.File) {
|
|
assert.Len(t, files, 1)
|
|
|
|
expected := []*models.File{
|
|
{
|
|
Name: "a -> b.txt",
|
|
HasStagedChanges: false,
|
|
HasUnstagedChanges: true,
|
|
Tracked: false,
|
|
Added: true,
|
|
Deleted: false,
|
|
HasMergeConflicts: false,
|
|
HasInlineMergeConflicts: false,
|
|
DisplayString: "?? a -> b.txt",
|
|
Type: "other",
|
|
ShortStatus: "??",
|
|
},
|
|
}
|
|
|
|
assert.EqualValues(t, expected, files)
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
gitCmd := NewDummyGitCommand()
|
|
gitCmd.OSCommand.Command = s.command
|
|
|
|
s.test(gitCmd.GetStatusFiles(GetStatusFileOptions{}))
|
|
})
|
|
}
|
|
}
|