2022-03-30 15:33:15 -07:00
|
|
|
package segments
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
2023-01-05 12:57:38 -08:00
|
|
|
"github.com/jandedobbeleer/oh-my-posh/src/properties"
|
2024-07-02 03:02:57 -07:00
|
|
|
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
|
2024-07-03 00:04:11 -07:00
|
|
|
"github.com/jandedobbeleer/oh-my-posh/src/runtime/mock"
|
2022-12-28 08:30:48 -08:00
|
|
|
|
2022-03-30 15:33:15 -07:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestSvnEnabledToolNotFound(t *testing.T) {
|
2024-07-03 00:04:11 -07:00
|
|
|
env := new(mock.Environment)
|
2022-03-30 15:33:15 -07:00
|
|
|
env.On("InWSLSharedDrive").Return(false)
|
|
|
|
env.On("HasCommand", "svn").Return(false)
|
|
|
|
env.On("GOOS").Return("")
|
|
|
|
env.On("IsWsl").Return(false)
|
|
|
|
s := &Svn{
|
|
|
|
scm: scm{
|
|
|
|
env: env,
|
|
|
|
props: properties.Map{},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
assert.False(t, s.Enabled())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSvnEnabledInWorkingDirectory(t *testing.T) {
|
2024-07-02 03:02:57 -07:00
|
|
|
fileInfo := &runtime.FileInfo{
|
2022-03-30 15:33:15 -07:00
|
|
|
Path: "/dir/hello",
|
|
|
|
ParentFolder: "/dir",
|
|
|
|
IsDir: true,
|
|
|
|
}
|
2024-07-03 00:04:11 -07:00
|
|
|
env := new(mock.Environment)
|
2022-03-30 15:33:15 -07:00
|
|
|
env.On("InWSLSharedDrive").Return(false)
|
|
|
|
env.On("HasCommand", "svn").Return(true)
|
|
|
|
env.On("GOOS").Return("")
|
|
|
|
env.On("FileContent", "/dir/hello/trunk").Return("")
|
|
|
|
env.MockSvnCommand(fileInfo.Path, "", "info", "--tags", "--exact-match")
|
2022-12-27 05:27:58 -08:00
|
|
|
env.On("RunCommand", "svn", []string{"info", "/dir/hello", "--show-item", "revision"}).Return("", nil)
|
|
|
|
env.On("RunCommand", "svn", []string{"info", "/dir/hello", "--show-item", "relative-url"}).Return("", nil)
|
2022-03-30 15:33:15 -07:00
|
|
|
env.On("IsWsl").Return(false)
|
2024-07-08 22:46:03 -07:00
|
|
|
env.On("HasParentFilePath", ".svn", false).Return(fileInfo, nil)
|
2022-03-30 15:33:15 -07:00
|
|
|
s := &Svn{
|
|
|
|
scm: scm{
|
|
|
|
env: env,
|
|
|
|
props: properties.Map{},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
assert.True(t, s.Enabled())
|
2022-08-28 06:34:08 -07:00
|
|
|
assert.Equal(t, fileInfo.Path, s.workingDir)
|
|
|
|
assert.Equal(t, fileInfo.Path, s.realDir)
|
2022-03-30 15:33:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestSvnTemplateString(t *testing.T) {
|
|
|
|
cases := []struct {
|
|
|
|
Case string
|
|
|
|
Expected string
|
|
|
|
Template string
|
|
|
|
Svn *Svn
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
Case: "Default template",
|
2022-12-25 11:12:09 -08:00
|
|
|
Expected: "\ue0a0trunk r2 ?9 +2 ~3 -7 >13 x5 !1",
|
2022-03-30 15:33:15 -07:00
|
|
|
Template: " \ue0a0{{.Branch}} r{{.BaseRev}} {{.Working.String}} ",
|
|
|
|
Svn: &Svn{
|
|
|
|
Branch: "trunk",
|
|
|
|
BaseRev: 2,
|
|
|
|
Working: &SvnStatus{
|
|
|
|
ScmStatus: ScmStatus{
|
2022-12-25 11:12:09 -08:00
|
|
|
Untracked: 9,
|
2022-03-30 15:33:15 -07:00
|
|
|
Added: 2,
|
|
|
|
Conflicted: 1,
|
|
|
|
Deleted: 7,
|
|
|
|
Modified: 3,
|
|
|
|
Moved: 13,
|
|
|
|
Unmerged: 5,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "Only Branch name",
|
|
|
|
Expected: "trunk",
|
|
|
|
Template: "{{ .Branch }}",
|
|
|
|
Svn: &Svn{
|
|
|
|
Branch: "trunk",
|
|
|
|
BaseRev: 2,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "Working area changes",
|
|
|
|
Expected: "trunk \uF044 +2 ~3",
|
|
|
|
Template: "{{ .Branch }}{{ if .Working.Changed }} \uF044 {{ .Working.String }}{{ end }}",
|
|
|
|
Svn: &Svn{
|
|
|
|
Branch: "trunk",
|
|
|
|
Working: &SvnStatus{
|
|
|
|
ScmStatus: ScmStatus{
|
|
|
|
Added: 2,
|
|
|
|
Modified: 3,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "No working area changes (using changed flag)",
|
|
|
|
Expected: "trunk",
|
|
|
|
Template: "{{ .Branch }}{{ if .Working.Changed }} \uF044 {{ .Working.String }}{{ end }}",
|
|
|
|
Svn: &Svn{
|
|
|
|
Branch: "trunk",
|
|
|
|
Working: &SvnStatus{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "No working area changes",
|
|
|
|
Expected: "trunk",
|
|
|
|
Template: "{{ .Branch }}{{ .Working.String }}",
|
|
|
|
Svn: &Svn{
|
|
|
|
Branch: "trunk",
|
|
|
|
Working: &SvnStatus{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "Base revision with Working changes",
|
|
|
|
Expected: "trunk - 2 \uF044 +2 ~3",
|
|
|
|
Template: "{{ .Branch }} - {{ .BaseRev }}{{ if .Working.Changed }} \uF044 {{ .Working.String }}{{ end }}",
|
|
|
|
Svn: &Svn{
|
|
|
|
Branch: "trunk",
|
|
|
|
BaseRev: 2,
|
|
|
|
Working: &SvnStatus{
|
|
|
|
ScmStatus: ScmStatus{
|
|
|
|
Added: 2,
|
|
|
|
Modified: 3,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "Working and staging area changes with separator and stash count",
|
|
|
|
Expected: "trunk CONFLICTED \uF044 +2 ~3 !7",
|
|
|
|
Template: "{{ .Branch }}{{ if .Working.HasConflicts }} CONFLICTED{{ end }}{{ if .Working.Changed }} \uF044 {{ .Working.String }}{{ end }}",
|
|
|
|
Svn: &Svn{
|
|
|
|
Branch: "trunk",
|
|
|
|
BaseRev: 2,
|
|
|
|
Working: &SvnStatus{
|
|
|
|
ScmStatus: ScmStatus{
|
|
|
|
Added: 2,
|
|
|
|
Modified: 3,
|
|
|
|
Conflicted: 7,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, tc := range cases {
|
|
|
|
props := properties.Map{
|
|
|
|
FetchStatus: true,
|
|
|
|
}
|
2024-07-03 00:04:11 -07:00
|
|
|
env := new(mock.Environment)
|
2022-03-30 15:33:15 -07:00
|
|
|
tc.Svn.env = env
|
|
|
|
tc.Svn.props = props
|
|
|
|
assert.Equal(t, tc.Expected, renderTemplate(env, tc.Template, tc.Svn), tc.Case)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSetSvnStatus(t *testing.T) {
|
|
|
|
cases := []struct {
|
|
|
|
Case string
|
|
|
|
StatusOutput string
|
|
|
|
RefOutput string
|
|
|
|
BranchOutput string
|
|
|
|
ExpectedWorking *SvnStatus
|
|
|
|
ExpectedBranch string
|
|
|
|
ExpectedRef int
|
|
|
|
ExpectedConflicts bool
|
|
|
|
ExpectedChanged bool
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
Case: "changed",
|
|
|
|
StatusOutput: `
|
2022-12-25 11:12:09 -08:00
|
|
|
? Untracked.File
|
|
|
|
! Missing.File
|
2022-03-30 15:33:15 -07:00
|
|
|
A FileHasBeen.Added
|
|
|
|
D FileMarkedAs.Deleted
|
|
|
|
M Modified.File
|
2022-12-25 11:12:09 -08:00
|
|
|
C Conflicted.File
|
2022-03-30 15:33:15 -07:00
|
|
|
R Moved.File`,
|
|
|
|
ExpectedWorking: &SvnStatus{ScmStatus: ScmStatus{
|
2022-12-25 11:12:09 -08:00
|
|
|
Modified: 1,
|
|
|
|
Added: 1,
|
|
|
|
Deleted: 1,
|
|
|
|
Moved: 2,
|
|
|
|
Untracked: 1,
|
|
|
|
Conflicted: 1,
|
2023-06-25 23:44:17 -07:00
|
|
|
Formats: map[string]string{},
|
2022-03-30 15:33:15 -07:00
|
|
|
}},
|
2022-12-25 11:12:09 -08:00
|
|
|
RefOutput: "1133",
|
|
|
|
ExpectedRef: 1133,
|
|
|
|
BranchOutput: "^/trunk",
|
|
|
|
ExpectedBranch: "trunk",
|
|
|
|
ExpectedChanged: true,
|
|
|
|
ExpectedConflicts: true,
|
2022-03-30 15:33:15 -07:00
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "conflict",
|
|
|
|
StatusOutput: `C build.cake`,
|
|
|
|
ExpectedWorking: &SvnStatus{ScmStatus: ScmStatus{
|
|
|
|
Conflicted: 1,
|
2023-06-25 23:44:17 -07:00
|
|
|
Formats: map[string]string{},
|
2022-03-30 15:33:15 -07:00
|
|
|
}},
|
|
|
|
ExpectedChanged: true,
|
|
|
|
ExpectedConflicts: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "no change",
|
2023-06-25 23:44:17 -07:00
|
|
|
ExpectedWorking: &SvnStatus{ScmStatus: ScmStatus{Formats: map[string]string{}}},
|
2022-03-30 15:33:15 -07:00
|
|
|
ExpectedChanged: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "not an integer ref",
|
2023-06-25 23:44:17 -07:00
|
|
|
ExpectedWorking: &SvnStatus{ScmStatus: ScmStatus{Formats: map[string]string{}}},
|
2022-03-30 15:33:15 -07:00
|
|
|
ExpectedChanged: false,
|
|
|
|
RefOutput: "not an integer",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range cases {
|
2024-07-02 03:02:57 -07:00
|
|
|
fileInfo := &runtime.FileInfo{
|
2022-03-30 15:33:15 -07:00
|
|
|
Path: "/dir/hello",
|
|
|
|
ParentFolder: "/dir",
|
|
|
|
IsDir: true,
|
|
|
|
}
|
2024-07-03 00:04:11 -07:00
|
|
|
env := new(mock.Environment)
|
2022-03-30 15:33:15 -07:00
|
|
|
env.On("InWSLSharedDrive").Return(false)
|
|
|
|
env.On("IsWsl").Return(false)
|
|
|
|
env.On("HasCommand", "svn").Return(true)
|
|
|
|
env.On("GOOS").Return("")
|
|
|
|
env.On("FileContent", "/dir/hello/trunk").Return("")
|
|
|
|
env.MockSvnCommand(fileInfo.Path, "", "info", "--tags", "--exact-match")
|
2024-07-08 22:46:03 -07:00
|
|
|
env.On("HasParentFilePath", ".svn", false).Return(fileInfo, nil)
|
2022-03-30 15:33:15 -07:00
|
|
|
env.On("RunCommand", "svn", []string{"info", "", "--show-item", "revision"}).Return(tc.RefOutput, nil)
|
|
|
|
env.On("RunCommand", "svn", []string{"info", "", "--show-item", "relative-url"}).Return(tc.BranchOutput, nil)
|
|
|
|
env.On("RunCommand", "svn", []string{"status", ""}).Return(tc.StatusOutput, nil)
|
|
|
|
|
|
|
|
s := &Svn{
|
|
|
|
scm: scm{
|
2022-12-27 05:27:58 -08:00
|
|
|
env: env,
|
|
|
|
props: properties.Map{
|
|
|
|
FetchStatus: true,
|
|
|
|
},
|
2022-09-14 05:50:08 -07:00
|
|
|
command: SVNCOMMAND,
|
2022-03-30 15:33:15 -07:00
|
|
|
},
|
|
|
|
}
|
|
|
|
s.setSvnStatus()
|
|
|
|
if tc.ExpectedWorking == nil {
|
|
|
|
tc.ExpectedWorking = &SvnStatus{}
|
|
|
|
}
|
|
|
|
assert.Equal(t, tc.ExpectedWorking, s.Working, tc.Case)
|
|
|
|
assert.Equal(t, tc.ExpectedRef, s.BaseRev, tc.Case)
|
|
|
|
assert.Equal(t, tc.ExpectedBranch, s.Branch, tc.Case)
|
|
|
|
assert.Equal(t, tc.ExpectedChanged, s.Working.Changed(), tc.Case)
|
|
|
|
assert.Equal(t, tc.ExpectedConflicts, s.Working.HasConflicts(), tc.Case)
|
|
|
|
}
|
|
|
|
}
|
2024-04-08 12:39:47 -07:00
|
|
|
|
|
|
|
func TestRepo(t *testing.T) {
|
|
|
|
cases := []struct {
|
|
|
|
Case string
|
|
|
|
Repo string
|
|
|
|
Expected string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
Case: "No repo",
|
|
|
|
Repo: "",
|
|
|
|
Expected: "",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "Repo with trailing slash",
|
|
|
|
Repo: "http://example.com/",
|
|
|
|
Expected: "example.com",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "Repo without trailing slash",
|
|
|
|
Repo: "http://example.com",
|
|
|
|
Expected: "example.com",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Case: "Repo with a path",
|
|
|
|
Repo: "http://example.com/test/repo",
|
|
|
|
Expected: "repo",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range cases {
|
2024-07-03 00:04:11 -07:00
|
|
|
env := new(mock.Environment)
|
2024-04-08 12:39:47 -07:00
|
|
|
env.On("RunCommand", "svn", []string{"info", "", "--show-item", "repos-root-url"}).Return(tc.Repo, nil)
|
|
|
|
s := &Svn{
|
|
|
|
scm: scm{
|
|
|
|
env: env,
|
|
|
|
command: SVNCOMMAND,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.Equal(t, tc.Expected, s.Repo(), tc.Case)
|
|
|
|
}
|
|
|
|
}
|