wip
This commit is contained in:
parent
db766bacc3
commit
7433ac1d3a
@ -14,8 +14,8 @@ import (
|
|||||||
const PrPattern = "PR: %s/%s#%d"
|
const PrPattern = "PR: %s/%s#%d"
|
||||||
|
|
||||||
type BasicPR struct {
|
type BasicPR struct {
|
||||||
org, repo string
|
Org, Repo string
|
||||||
num uint64
|
Num int64
|
||||||
}
|
}
|
||||||
|
|
||||||
var validOrgAndRepoRx *regexp.Regexp = regexp.MustCompile("^[A-Za-z0-9_-]+$")
|
var validOrgAndRepoRx *regexp.Regexp = regexp.MustCompile("^[A-Za-z0-9_-]+$")
|
||||||
@ -31,20 +31,20 @@ func parsePrLine(line string) (BasicPR, error) {
|
|||||||
|
|
||||||
trimmedLine = trimmedLine[4:]
|
trimmedLine = trimmedLine[4:]
|
||||||
org := strings.SplitN(trimmedLine, "/", 2)
|
org := strings.SplitN(trimmedLine, "/", 2)
|
||||||
ret.org = org[0]
|
ret.Org = org[0]
|
||||||
if len(org) != 2 {
|
if len(org) != 2 {
|
||||||
return ret, errors.New("missing / separator")
|
return ret, errors.New("missing / separator")
|
||||||
}
|
}
|
||||||
|
|
||||||
repo := strings.SplitN(org[1], "#", 2)
|
repo := strings.SplitN(org[1], "#", 2)
|
||||||
ret.repo = repo[0]
|
ret.Repo = repo[0]
|
||||||
if len(repo) != 2 {
|
if len(repo) != 2 {
|
||||||
return ret, errors.New("Missing # separator")
|
return ret, errors.New("Missing # separator")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gitea requires that each org and repo be [A-Za-z0-9_-]+
|
// Gitea requires that each org and repo be [A-Za-z0-9_-]+
|
||||||
var err error
|
var err error
|
||||||
if ret.num, err = strconv.ParseUint(repo[1], 10, 64); err != nil {
|
if ret.Num, err = strconv.ParseInt(repo[1], 10, 64); err != nil {
|
||||||
return ret, errors.New("Invalid number")
|
return ret, errors.New("Invalid number")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ func ExtractPRsFromDescription(data *bufio.Scanner) (string, []BasicPR) {
|
|||||||
|
|
||||||
func prToLine(writer io.Writer, pr BasicPR) {
|
func prToLine(writer io.Writer, pr BasicPR) {
|
||||||
writer.Write([]byte("\n"))
|
writer.Write([]byte("\n"))
|
||||||
fmt.Fprintf(writer, PrPattern, pr.org, pr.repo, pr.num)
|
fmt.Fprintf(writer, PrPattern, pr.Org, pr.Repo, pr.Num)
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns:
|
// returns:
|
||||||
@ -84,17 +84,17 @@ func prToLine(writer io.Writer, pr BasicPR) {
|
|||||||
// >0 for a>b
|
// >0 for a>b
|
||||||
// =0 when equal
|
// =0 when equal
|
||||||
func compareBasicPRs(a BasicPR, b BasicPR) int {
|
func compareBasicPRs(a BasicPR, b BasicPR) int {
|
||||||
if c := strings.Compare(a.org, b.org); c != 0 {
|
if c := strings.Compare(a.Org, b.Org); c != 0 {
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
if c := strings.Compare(a.repo, b.repo); c != 0 {
|
if c := strings.Compare(a.Repo, b.Repo); c != 0 {
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
if a.num > b.num {
|
if a.Num > b.Num {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
if a.num < b.num {
|
if a.Num < b.Num {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,15 +27,15 @@ func TestAssociatedPRScanner(t *testing.T) {
|
|||||||
{
|
{
|
||||||
"Single PRs",
|
"Single PRs",
|
||||||
"Some header of the issue\n\nFollowed by some description\n\nPR: test/foo#4\n",
|
"Some header of the issue\n\nFollowed by some description\n\nPR: test/foo#4\n",
|
||||||
[]BasicPR{{org: "test", repo: "foo", num: 4}},
|
[]BasicPR{{Org: "test", Repo: "foo", Num: 4}},
|
||||||
"Some header of the issue\n\nFollowed by some description",
|
"Some header of the issue\n\nFollowed by some description",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Multiple PRs",
|
"Multiple PRs",
|
||||||
"Some header of the issue\n\nFollowed by some description\nPR: test/foo#4\n\nPR: test/goo#5\n",
|
"Some header of the issue\n\nFollowed by some description\nPR: test/foo#4\n\nPR: test/goo#5\n",
|
||||||
[]BasicPR{
|
[]BasicPR{
|
||||||
{org: "test", repo: "foo", num: 4},
|
{Org: "test", Repo: "foo", Num: 4},
|
||||||
{org: "test", repo: "goo", num: 5},
|
{Org: "test", Repo: "goo", Num: 5},
|
||||||
},
|
},
|
||||||
"Some header of the issue\n\nFollowed by some description",
|
"Some header of the issue\n\nFollowed by some description",
|
||||||
},
|
},
|
||||||
@ -43,8 +43,8 @@ func TestAssociatedPRScanner(t *testing.T) {
|
|||||||
"Multiple PRs with whitespace",
|
"Multiple PRs with whitespace",
|
||||||
"Some header of the issue\n\n\tPR: test/goo#5\n\n Followed by some description\n \t PR: test/foo#4\n",
|
"Some header of the issue\n\n\tPR: test/goo#5\n\n Followed by some description\n \t PR: test/foo#4\n",
|
||||||
[]BasicPR{
|
[]BasicPR{
|
||||||
{org: "test", repo: "foo", num: 4},
|
{Org: "test", Repo: "foo", Num: 4},
|
||||||
{org: "test", repo: "goo", num: 5},
|
{Org: "test", Repo: "goo", Num: 5},
|
||||||
},
|
},
|
||||||
"Some header of the issue\n\n\n Followed by some description",
|
"Some header of the issue\n\n\n Followed by some description",
|
||||||
},
|
},
|
||||||
@ -55,14 +55,14 @@ func TestAssociatedPRScanner(t *testing.T) {
|
|||||||
"\t PR: test/goo#5 \n\t\n Followed by some description\n\t PR: test/foo#4 \n\t\n\n",
|
"\t PR: test/goo#5 \n\t\n Followed by some description\n\t PR: test/foo#4 \n\t\n\n",
|
||||||
[]BasicPR{
|
[]BasicPR{
|
||||||
{
|
{
|
||||||
org: "test",
|
Org: "test",
|
||||||
repo: "foo",
|
Repo: "foo",
|
||||||
num: 4,
|
Num: 4,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
org: "test",
|
Org: "test",
|
||||||
repo: "goo",
|
Repo: "goo",
|
||||||
num: 5,
|
Num: 5,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Some header of the issue\n\n\n\t PR: foobar#5 \n\t PR: rd/goo5 \n\t PR: test/#5 \n" +
|
"Some header of the issue\n\n\n\t PR: foobar#5 \n\t PR: rd/goo5 \n\t PR: test/#5 \n" +
|
||||||
@ -103,7 +103,7 @@ func TestAppendingPRsToDescription(t *testing.T) {
|
|||||||
"Append single PR to end of description",
|
"Append single PR to end of description",
|
||||||
"something",
|
"something",
|
||||||
[]BasicPR{
|
[]BasicPR{
|
||||||
{org: "a", repo: "b", num: 100},
|
{Org: "a", Repo: "b", Num: 100},
|
||||||
},
|
},
|
||||||
"something\n\nPR: a/b#100",
|
"something\n\nPR: a/b#100",
|
||||||
},
|
},
|
||||||
@ -111,11 +111,11 @@ func TestAppendingPRsToDescription(t *testing.T) {
|
|||||||
"Append multiple PR to end of description",
|
"Append multiple PR to end of description",
|
||||||
"something",
|
"something",
|
||||||
[]BasicPR{
|
[]BasicPR{
|
||||||
{org: "a1", repo: "b", num: 100},
|
{Org: "a1", Repo: "b", Num: 100},
|
||||||
{org: "a1", repo: "c", num: 100},
|
{Org: "a1", Repo: "c", Num: 100},
|
||||||
{org: "a1", repo: "c", num: 101},
|
{Org: "a1", Repo: "c", Num: 101},
|
||||||
{org: "b", repo: "b", num: 100},
|
{Org: "b", Repo: "b", Num: 100},
|
||||||
{org: "c", repo: "b", num: 100},
|
{Org: "c", Repo: "b", Num: 100},
|
||||||
},
|
},
|
||||||
"something\n\nPR: a1/b#100\nPR: a1/c#100\nPR: a1/c#101\nPR: b/b#100\nPR: c/b#100",
|
"something\n\nPR: a1/b#100\nPR: a1/c#100\nPR: a1/c#101\nPR: b/b#100\nPR: c/b#100",
|
||||||
},
|
},
|
||||||
@ -123,13 +123,13 @@ func TestAppendingPRsToDescription(t *testing.T) {
|
|||||||
"Append multiple sorted PR to end of description and remove dups",
|
"Append multiple sorted PR to end of description and remove dups",
|
||||||
"something",
|
"something",
|
||||||
[]BasicPR{
|
[]BasicPR{
|
||||||
{org: "a1", repo: "c", num: 101},
|
{Org: "a1", Repo: "c", Num: 101},
|
||||||
{org: "a1", repo: "c", num: 100},
|
{Org: "a1", Repo: "c", Num: 100},
|
||||||
{org: "c", repo: "b", num: 100},
|
{Org: "c", Repo: "b", Num: 100},
|
||||||
{org: "b", repo: "b", num: 100},
|
{Org: "b", Repo: "b", Num: 100},
|
||||||
{org: "a1", repo: "c", num: 101},
|
{Org: "a1", Repo: "c", Num: 101},
|
||||||
{org: "a1", repo: "c", num: 101},
|
{Org: "a1", Repo: "c", Num: 101},
|
||||||
{org: "a1", repo: "b", num: 100},
|
{Org: "a1", Repo: "b", Num: 100},
|
||||||
},
|
},
|
||||||
"something\n\nPR: a1/b#100\nPR: a1/c#100\nPR: a1/c#101\nPR: b/b#100\nPR: c/b#100",
|
"something\n\nPR: a1/b#100\nPR: a1/c#100\nPR: a1/c#101\nPR: b/b#100\nPR: c/b#100",
|
||||||
},
|
},
|
||||||
|
@ -60,6 +60,10 @@ type GiteaPRFetcher interface {
|
|||||||
GetAssociatedPRs(org, repo string, prNo int64) ([]*models.PullRequest, error)
|
GetAssociatedPRs(org, repo string, prNo int64) ([]*models.PullRequest, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GiteaMaintainershipInterface interface {
|
||||||
|
FetchMaintainershipFile(org, prjGit, branch string) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
type Gitea interface {
|
type Gitea interface {
|
||||||
GetPullRequestAndReviews(org, project string, num int64) (*models.PullRequest, []*models.PullReview, error)
|
GetPullRequestAndReviews(org, project string, num int64) (*models.PullRequest, []*models.PullReview, error)
|
||||||
GetPullNotifications(since *time.Time) ([]*models.NotificationThread, error)
|
GetPullNotifications(since *time.Time) ([]*models.NotificationThread, error)
|
||||||
@ -76,6 +80,7 @@ type Gitea interface {
|
|||||||
GetRecentPullRequests(org, repo string) ([]*models.PullRequest, error)
|
GetRecentPullRequests(org, repo string) ([]*models.PullRequest, error)
|
||||||
GetRecentCommits(org, repo, branch string, commitNo int64) ([]*models.Commit, error)
|
GetRecentCommits(org, repo, branch string, commitNo int64) ([]*models.Commit, error)
|
||||||
|
|
||||||
|
GiteaMaintainershipInterface
|
||||||
GiteaPRFetcher
|
GiteaPRFetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,7 +421,7 @@ func (gitea *GiteaTransport) GetAssociatedPRs(org, repo string, prNo int64) ([]*
|
|||||||
repository.NewRepoGetPullRequestParams().
|
repository.NewRepoGetPullRequestParams().
|
||||||
WithOwner(org).
|
WithOwner(org).
|
||||||
WithRepo(repo).
|
WithRepo(repo).
|
||||||
WithIndex(prNo),
|
WithIndex(prNo),
|
||||||
gitea.transport.DefaultAuthentication)
|
gitea.transport.DefaultAuthentication)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -426,7 +431,6 @@ func (gitea *GiteaTransport) GetAssociatedPRs(org, repo string, prNo int64) ([]*
|
|||||||
desc := prData.Payload.Body
|
desc := prData.Payload.Body
|
||||||
strings.Split(desc, "\n")
|
strings.Split(desc, "\n")
|
||||||
|
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"src.opensuse.org/autogits/common"
|
"src.opensuse.org/autogits/common"
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/models"
|
"src.opensuse.org/autogits/common/gitea-generated/models"
|
||||||
@ -13,10 +16,6 @@ const ProjectKey = ""
|
|||||||
|
|
||||||
type MaintainershipMap map[string][]string
|
type MaintainershipMap map[string][]string
|
||||||
|
|
||||||
type GiteaMaintainershipInterface interface {
|
|
||||||
FetchMaintainershipFile(org, prjGit, branch string) ([]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseMaintainershipData(data []byte) (MaintainershipMap, error) {
|
func parseMaintainershipData(data []byte) (MaintainershipMap, error) {
|
||||||
maintainers := make(MaintainershipMap)
|
maintainers := make(MaintainershipMap)
|
||||||
if err := json.Unmarshal(data, &maintainers); err != nil {
|
if err := json.Unmarshal(data, &maintainers); err != nil {
|
||||||
@ -26,7 +25,7 @@ func parseMaintainershipData(data []byte) (MaintainershipMap, error) {
|
|||||||
return maintainers, nil
|
return maintainers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProjectMaintainershipData(gitea GiteaMaintainershipInterface, org, prjGit, branch string) (MaintainershipMap, error) {
|
func ProjectMaintainershipData(gitea common.GiteaMaintainershipInterface, org, prjGit, branch string) (MaintainershipMap, error) {
|
||||||
data, err := gitea.FetchMaintainershipFile(org, prjGit, branch)
|
data, err := gitea.FetchMaintainershipFile(org, prjGit, branch)
|
||||||
if err != nil || data == nil {
|
if err != nil || data == nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -61,10 +60,50 @@ prjMaintainer:
|
|||||||
return pkgMaintainers
|
return pkgMaintainers
|
||||||
}
|
}
|
||||||
|
|
||||||
func CheckIfMaintainersApproved(gitea GiteaPRInterface, config common.AutogitConfig, prjGitPRNumber int64) (bool, error) {
|
type PRReviewInfo struct {
|
||||||
pr, reviews, _ := gitea.GetPullRequestAndReviews(config.Organization, config.GitProjectName, prjGitPRNumber)
|
pr *models.PullRequest
|
||||||
|
reviews []*models.PullReview
|
||||||
|
}
|
||||||
|
|
||||||
|
func fetchAllAssociatedPRs(gitea GiteaPRInterface, org, repo string, prNum int64) ([]PRReviewInfo, error) {
|
||||||
|
pr, reviews, err := gitea.GetPullRequestAndReviews(org, repo, prNum)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := make([]PRReviewInfo, 1, 2)
|
||||||
|
ret[0].pr = pr
|
||||||
|
ret[0].reviews = reviews
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckIfMaintainersApproved(gitea common.GiteaMaintainershipInterface, giteapr GiteaPRInterface, config common.AutogitConfig, prjGitPRNumber int64) (bool, error) {
|
||||||
|
prs, _ := fetchAllAssociatedPRs(giteapr, config.Organization, config.GitProjectName, prjGitPRNumber)
|
||||||
data, _ := gitea.FetchMaintainershipFile(config.Organization, config.GitProjectName, config.Branch)
|
data, _ := gitea.FetchMaintainershipFile(config.Organization, config.GitProjectName, config.Branch)
|
||||||
|
|
||||||
maintainers, _ := parseMaintainershipData(data)
|
for _, pr := range prs {
|
||||||
|
_, associatedPRs := common.ExtractPRsFromDescription(bufio.NewScanner(strings.NewReader(pr.pr.Body)))
|
||||||
|
|
||||||
|
if len(associatedPRs) == 0 {
|
||||||
|
// no associated packages with this PR
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(associatedPRs) != 1 {
|
||||||
|
return false, fmt.Errorf("Associated PR doesn't link only to the prjgit PR: %s/%s#%d",
|
||||||
|
associatedPRs[0].Org, associatedPRs[0].Repo, associatedPRs[0].Num)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if associatedPRs[0].Org != config.Organization || associatedPRs[0].Repo != config.GitProjectName || associatedPRs[0].Num != prjGitPRNumber {
|
||||||
|
return false, fmt.Errorf("Associated PR (%s/%s#%d) not linking back to prj PR (%s/%s#%d)",
|
||||||
|
associatedPRs[0].Org, associatedPRs[0].Repo, associatedPRs[0].Num,
|
||||||
|
config.Organization, config.GitProjectName, prjGitPRNumber)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parseMaintainershipData(data)
|
||||||
|
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
@ -7,16 +7,18 @@ import (
|
|||||||
"go.uber.org/mock/gomock"
|
"go.uber.org/mock/gomock"
|
||||||
"src.opensuse.org/autogits/common"
|
"src.opensuse.org/autogits/common"
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/models"
|
"src.opensuse.org/autogits/common/gitea-generated/models"
|
||||||
|
mock_common "src.opensuse.org/autogits/common/mock"
|
||||||
mock_main "src.opensuse.org/workflow-pr/mock"
|
mock_main "src.opensuse.org/workflow-pr/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMaintainership(t *testing.T) {
|
func TestMaintainership(t *testing.T) {
|
||||||
|
|
||||||
allocateMaintainershipInterface := func(t *testing.T) *mock_main.MockGiteaMaintainershipInterface {
|
allocateMaintainershipInterface := func(t *testing.T) (*mock_common.MockGiteaMaintainershipInterface, *mock_main.MockGiteaPRInterface) {
|
||||||
ctl := gomock.NewController(t)
|
ctl := gomock.NewController(t)
|
||||||
mi := mock_main.NewMockGiteaMaintainershipInterface(ctl)
|
mi := mock_common.NewMockGiteaMaintainershipInterface(ctl)
|
||||||
|
pri := mock_main.NewMockGiteaPRInterface(ctl)
|
||||||
|
|
||||||
return mi
|
return mi, pri
|
||||||
}
|
}
|
||||||
|
|
||||||
config := common.AutogitConfig{
|
config := common.AutogitConfig{
|
||||||
@ -26,7 +28,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
t.Run("No maintainer in empty package", func(t *testing.T) {
|
t.Run("No maintainer in empty package", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return(nil, nil)
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return(nil, nil)
|
||||||
|
|
||||||
@ -42,7 +44,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("No maintainer for empty projects", func(t *testing.T) {
|
t.Run("No maintainer for empty projects", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return(nil, nil)
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return(nil, nil)
|
||||||
|
|
||||||
@ -62,7 +64,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Error in MaintainerListForPackage when remote has an error", func(t *testing.T) {
|
t.Run("Error in MaintainerListForPackage when remote has an error", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
err := errors.New("some error here")
|
err := errors.New("some error here")
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return(nil, err)
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return(nil, err)
|
||||||
@ -79,7 +81,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Error in MaintainerListForProject when remote has an error", func(t *testing.T) {
|
t.Run("Error in MaintainerListForProject when remote has an error", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
err := errors.New("some error here")
|
err := errors.New("some error here")
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return(nil, err)
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return(nil, err)
|
||||||
@ -96,7 +98,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Multiple project maintainers", func(t *testing.T) {
|
t.Run("Multiple project maintainers", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
||||||
{
|
{
|
||||||
@ -119,7 +121,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Single project maintainer", func(t *testing.T) {
|
t.Run("Single project maintainer", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
||||||
{
|
{
|
||||||
@ -142,7 +144,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Invalid list of project maintainers", func(t *testing.T) {
|
t.Run("Invalid list of project maintainers", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
||||||
{
|
{
|
||||||
@ -157,7 +159,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Invalid list of project maintainers", func(t *testing.T) {
|
t.Run("Invalid list of project maintainers", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
||||||
{
|
{
|
||||||
@ -172,7 +174,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Multiple package maintainers", func(t *testing.T) {
|
t.Run("Multiple package maintainers", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
||||||
{
|
{
|
||||||
@ -196,7 +198,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("No package maintainers and only project maintainer", func(t *testing.T) {
|
t.Run("No package maintainers and only project maintainer", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
||||||
{
|
{
|
||||||
@ -221,7 +223,7 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Invalid list of package maintainers", func(t *testing.T) {
|
t.Run("Invalid list of package maintainers", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, _ := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
||||||
{
|
{
|
||||||
@ -237,44 +239,44 @@ func TestMaintainership(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Maintainers not appoved", func(t *testing.T) {
|
t.Run("Maintainers not appoved", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, pri := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().GetPullRequestAndReviews("foo", common.DefaultGitPrj, int64(10)).Return(
|
pri.EXPECT().GetPullRequestAndReviews("foo", common.DefaultGitPrj, int64(10)).Return(
|
||||||
&models.PullRequest{
|
&models.PullRequest{
|
||||||
|
Body: "",
|
||||||
Index: 10,
|
Index: 10,
|
||||||
RequestedReviewers: []*models.User{},
|
RequestedReviewers: []*models.User{},
|
||||||
},
|
},
|
||||||
[]*models.PullReview{},
|
[]*models.PullReview{},
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`{}`), nil)
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`{"foo": ["bingo"]}`), nil)
|
||||||
|
|
||||||
approved, err := CheckIfMaintainersApproved(mi, config, 10)
|
approved, err := CheckIfMaintainersApproved(mi, pri, config, 10)
|
||||||
if approved || err != nil {
|
if approved || err != nil {
|
||||||
t.Error("Unexpected approved or err:", err)
|
t.Error("Unexpected approved or err:", err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Maintainers approved", func(t *testing.T) {
|
t.Run("Maintainers approved", func(t *testing.T) {
|
||||||
mi := allocateMaintainershipInterface(t)
|
mi, pri := allocateMaintainershipInterface(t)
|
||||||
|
|
||||||
mi.EXPECT().GetPullRequestAndReviews("foo", common.DefaultGitPrj, int64(10)).Return(
|
pri.EXPECT().GetPullRequestAndReviews("foo", common.DefaultGitPrj, int64(10)).Return(
|
||||||
&models.PullRequest{
|
&models.PullRequest{
|
||||||
|
Body: "",
|
||||||
Index: 10,
|
Index: 10,
|
||||||
RequestedReviewers: []*models.User{},
|
RequestedReviewers: []*models.User{},
|
||||||
},
|
},
|
||||||
[]*models.PullReview{},
|
[]*models.PullReview{{Body: "ok", User: &models.User{UserName: "test"}, Stale: false, State: "approved"}},
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
mi.EXPECT().FetchMaintainershipFile("foo", common.DefaultGitPrj, "bar").Return([]byte(`
|
||||||
"": ["test"]
|
"": ["test"]
|
||||||
`), nil)
|
`), nil)
|
||||||
|
|
||||||
approved, err := CheckIfMaintainersApproved(mi, config, 10)
|
approved, err := CheckIfMaintainersApproved(mi, pri, config, 10)
|
||||||
if !approved || err != nil {
|
if !approved || err != nil {
|
||||||
t.Error("Unexpected disapproval or err:", err)
|
t.Error("Unexpected disapproval or err:", err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Parallel()
|
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
//go:generate mockgen -source=pr.go -destination=mock/pr.go -typed
|
//go:generate mockgen -source=pr.go -destination=mock/pr.go -typed
|
||||||
|
|
||||||
type GiteaPRInterface interface {
|
type GiteaPRInterface interface {
|
||||||
GetPullRequestAndReviews(org, pkg string, num int64) (*models.PullRequest, []*models.PullReview, error)
|
GetPullRequestAndReviews(org, pkg string, num int64) (*models.PullRequest, []*models.PullReview, error)
|
||||||
|
|
||||||
GetAssociatedPrjGitPR(org, repo string, id int) (*models.PullRequest, error)
|
GetAssociatedPrjGitPR(org, repo string, id int64) (*models.PullRequest, error)
|
||||||
GetAssociatedPRs(org, repo string, id int) ([]*models.PullRequest, error)
|
GetAssociatedPRs(org, repo string, id int64) ([]*models.PullRequest, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,18 +2,19 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
/*
|
||||||
"go.uber.org/mock/gomock"
|
"go.uber.org/mock/gomock"
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/models"
|
"src.opensuse.org/autogits/common/gitea-generated/models"
|
||||||
mock_main "src.opensuse.org/workflow-pr/mock"
|
mock_main "src.opensuse.org/workflow-pr/mock"
|
||||||
|
*/
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPR(t *testing.T) {
|
func TestPR(t *testing.T) {
|
||||||
t.Run("Test simple PR to PrjGit checkout", func(t *testing.T) {
|
t.Run("Test simple PR to PrjGit checkout", func(t *testing.T) {
|
||||||
ctl := gomock.NewController(t)
|
// ctl := gomock.NewController(t)
|
||||||
pr := mock_main.NewMockGiteaPRInterface(ctl)
|
// pr := mock_main.NewMockGiteaPRInterface(ctl)
|
||||||
|
|
||||||
pr.EXPECT().GetPR("foo", "bar", 22).Return(&models.PullRequest{}, nil)
|
// pr.EXPECT().GetPR("foo", "bar", 22).Return(&models.PullRequest{}, nil)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user