138 lines
3.5 KiB
Go
138 lines
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"go.uber.org/mock/gomock"
|
|
|
|
"src.opensuse.org/autogits/common"
|
|
mock_common "src.opensuse.org/autogits/common/mock"
|
|
)
|
|
|
|
func TestLinkParsing(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
data []byte
|
|
links []*OrgLinks
|
|
expected_err string
|
|
}{
|
|
{
|
|
name: "No links file",
|
|
},
|
|
{
|
|
name: "Empty links file",
|
|
data: []byte("[]"),
|
|
},
|
|
{
|
|
name: "Single package linked",
|
|
data: []byte(`[{"Pkg": "foo"}]`),
|
|
links: []*OrgLinks{
|
|
&OrgLinks{
|
|
Pkg: "foo",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Multiple packages linked, resorted",
|
|
data: []byte(`[{"Pkg": "foo"}, {"Pkg": "abc", "TargetBranch": "m"}, {"Pkg": "aaa", "SourceBranch": "q", TargetBranch": "w"}]`),
|
|
links: []*OrgLinks{
|
|
&OrgLinks{
|
|
Pkg: "aaa",
|
|
SourceBranch: "q",
|
|
TargetBranch: "w",
|
|
},
|
|
&OrgLinks{
|
|
Pkg: "abc",
|
|
TargetBranch: "m",
|
|
},
|
|
&OrgLinks{
|
|
Pkg: "foo",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "Broken source file",
|
|
data: []byte(`[{"Source": "pool/foo#m"}, Source": "pool/abc#m", "Target": "abc#m"}, {"Source": "abc/aaa#m", "Target": "zzz#m"}]`),
|
|
expected_err: "invalid character 'S' looking for beginning of value",
|
|
},
|
|
{
|
|
name: "Missing target",
|
|
data: []byte(`[{"Source": "abc/aaa#m"}]`),
|
|
expected_err: "Missing Target for Source link: abc/aaa",
|
|
},
|
|
{
|
|
name: "Bad source link",
|
|
data: []byte(`[{"Source": "abc"}]`),
|
|
expected_err: "Invalid Source: abc",
|
|
},
|
|
{
|
|
name: "Bad source link",
|
|
data: []byte(`[{"Source": "/foo"}]`),
|
|
expected_err: "Invalid Source: /foo",
|
|
},
|
|
{
|
|
name: "Bad source link",
|
|
data: []byte(`[{"Source": "foo/"}]`),
|
|
expected_err: "Invalid Source: foo/",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
ctl := gomock.NewController(t)
|
|
gitea_mock := mock_common.NewMockGitea(ctl)
|
|
gitea_mock.EXPECT().GetRepositoryFileContent("org", "repo", "branch", common.PrjLinksFile).Return(test.data, "", nil)
|
|
|
|
res, _, err := ProcessProjectLinks(gitea_mock, "org", "repo", "branch")
|
|
if len(test.expected_err) > 0 && err == nil {
|
|
t.Error("Expected an error:", test.expected_err, "; but got nothing")
|
|
} else if err != nil && len(test.expected_err) == 0 {
|
|
t.Fatal("Unexpected error:", err)
|
|
} else if err != nil && !strings.Contains(err.Error(), test.expected_err) {
|
|
t.Fatal("Expected an error:", test.expected_err, "; but got:", err)
|
|
}
|
|
|
|
if len(res) != len(test.links) {
|
|
t.Fatal("len of result", len(res), "vs. expected", len(test.links))
|
|
}
|
|
|
|
// verify that returned data is present and in expected order
|
|
for i := range test.links {
|
|
if *test.links[i] != *res[i] {
|
|
t.Error("index", i, "expected", *test.links[i], "received", *res[i])
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestLinkUpdater(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
mock_setup func(*mock_common.MockGit, *mock_common.MockGitea)
|
|
link *OrgLinks
|
|
}{
|
|
{
|
|
name: "no-op update",
|
|
mock_setup: func(git *mock_common.MockGit, gitea *mock_common.MockGitea) {
|
|
|
|
git.EXPECT().GitExecWithOutputOrPanic(gomock.Any(), "rev-list", "upstream/main", "^pkg_hash").Return("")
|
|
},
|
|
link: &OrgLinks{
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
ctl := gomock.NewController(t)
|
|
git := mock_common.NewMockGit(ctl)
|
|
gitea := mock_common.NewMockGitea(ctl)
|
|
|
|
test.mock_setup(git, gitea)
|
|
test.link.StateUpdater(git, gitea)
|
|
})
|
|
}
|
|
}
|