wip
This commit is contained in:
parent
fe2a577b3b
commit
72d5f64f90
@ -23,6 +23,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
transport "github.com/go-openapi/runtime/client"
|
transport "github.com/go-openapi/runtime/client"
|
||||||
@ -59,8 +60,12 @@ type GiteaMaintainershipInterface interface {
|
|||||||
FetchMaintainershipFile(org, prjGit, branch string) ([]byte, error)
|
FetchMaintainershipFile(org, prjGit, branch string) ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type GiteaPRReviewFetcher interface {
|
type GiteaPRFetcher interface {
|
||||||
GetPullRequestAndReviews(org, project string, num int64) (*models.PullRequest, []*models.PullReview, error)
|
GetPullRequest(org, project string, num int64) (*models.PullRequest, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type GiteaReviewFetcher interface {
|
||||||
|
GetPullRequestReviews(org, project string, num int64) ([]*models.PullReview, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type GiteaReviewRequester interface {
|
type GiteaReviewRequester interface {
|
||||||
@ -74,7 +79,7 @@ type GiteaReviewer interface {
|
|||||||
type Gitea interface {
|
type Gitea interface {
|
||||||
GiteaReviewRequester
|
GiteaReviewRequester
|
||||||
GiteaReviewer
|
GiteaReviewer
|
||||||
GiteaPRReviewFetcher
|
GiteaPRFetcher
|
||||||
|
|
||||||
GetPullNotifications(since *time.Time) ([]*models.NotificationThread, error)
|
GetPullNotifications(since *time.Time) ([]*models.NotificationThread, error)
|
||||||
SetNotificationRead(notificationId int64) error
|
SetNotificationRead(notificationId int64) error
|
||||||
@ -110,7 +115,7 @@ func (gitea *GiteaTransport) FetchMaintainershipFile(org, repo, branch string) (
|
|||||||
return gitea.GetRepositoryFileContent(org, repo, branch, MaintainershipFile)
|
return gitea.GetRepositoryFileContent(org, repo, branch, MaintainershipFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gitea *GiteaTransport) GetPullRequestAndReviews(org, project string, num int64) (*models.PullRequest, []*models.PullReview, error) {
|
func (gitea *GiteaTransport) GetPullRequest(org, project string, num int64) (*models.PullRequest, error) {
|
||||||
pr, err := gitea.client.Repository.RepoGetPullRequest(
|
pr, err := gitea.client.Repository.RepoGetPullRequest(
|
||||||
repository.NewRepoGetPullRequestParams().
|
repository.NewRepoGetPullRequestParams().
|
||||||
WithDefaults().
|
WithDefaults().
|
||||||
@ -120,26 +125,39 @@ func (gitea *GiteaTransport) GetPullRequestAndReviews(org, project string, num i
|
|||||||
gitea.transport.DefaultAuthentication,
|
gitea.transport.DefaultAuthentication,
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
return pr.Payload, err
|
||||||
return nil, nil, err
|
}
|
||||||
|
|
||||||
|
func (gitea *GiteaTransport) GetPullReviews(org, project string, num int64) ([]*models.PullReview, error) {
|
||||||
|
limit := int64(20)
|
||||||
|
var page int64
|
||||||
|
|
||||||
|
var allReviews []*models.PullReview
|
||||||
|
|
||||||
|
for {
|
||||||
|
reviews, err := gitea.client.Repository.RepoListPullReviews(
|
||||||
|
repository.NewRepoListPullReviewsParams().
|
||||||
|
WithDefaults().
|
||||||
|
WithOwner(org).
|
||||||
|
WithRepo(project).
|
||||||
|
WithIndex(num).
|
||||||
|
WithPage(&page).
|
||||||
|
WithLimit(&limit),
|
||||||
|
gitea.transport.DefaultAuthentication,
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
allReviews = slices.Concat(allReviews, reviews.Payload)
|
||||||
|
if len(reviews.Payload) < int(limit) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
page++
|
||||||
}
|
}
|
||||||
|
|
||||||
limit := int64(1000)
|
return allReviews, nil
|
||||||
reviews, err := gitea.client.Repository.RepoListPullReviews(
|
|
||||||
repository.NewRepoListPullReviewsParams().
|
|
||||||
WithDefaults().
|
|
||||||
WithOwner(org).
|
|
||||||
WithRepo(project).
|
|
||||||
WithIndex(num).
|
|
||||||
WithLimit(&limit),
|
|
||||||
gitea.transport.DefaultAuthentication,
|
|
||||||
)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return pr.Payload, reviews.Payload, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gitea *GiteaTransport) GetPullNotifications(since *time.Time) ([]*models.NotificationThread, error) {
|
func (gitea *GiteaTransport) GetPullNotifications(since *time.Time) ([]*models.NotificationThread, error) {
|
||||||
|
@ -1,15 +1,60 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"errors"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"src.opensuse.org/autogits/common"
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/models"
|
"src.opensuse.org/autogits/common/gitea-generated/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:generate mockgen -source=pr.go -destination=mock/pr.go -typed
|
type PRInfo struct {
|
||||||
type GiteaPRInterface interface {
|
pr *models.PullRequest
|
||||||
GetPullRequestAndReviews(org, pkg string, num int64) (*models.PullRequest, []*models.PullReview, error)
|
reviews []*models.PullReview
|
||||||
|
|
||||||
GetAssociatedPrjGitPR(org, repo string, id int64) (*models.PullRequest, error)
|
|
||||||
GetAssociatedPRs(org, repo string, id int64) ([]*models.PullRequest, error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ReviewSet struct {
|
||||||
|
maintainers MaintainershipData
|
||||||
|
prs []PRInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func readPRData(gitea common.GiteaPRFetcher, org, repo string, num int64, currentSet []PRInfo) ([]PRInfo, error) {
|
||||||
|
for _, p := range currentSet {
|
||||||
|
if num == p.pr.Index && repo == p.pr.Base.Repo.Name && org == p.pr.Base.Repo.Owner.UserName {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pr, err := gitea.GetPullRequest(org, repo, num)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
_, refPRs := common.ExtractDescriptionAndPRs(bufio.NewScanner(strings.NewReader(pr.Body)))
|
||||||
|
if len(refPRs) < 1 {
|
||||||
|
return nil, errors.New("missing links")
|
||||||
|
}
|
||||||
|
|
||||||
|
retSet := []PRInfo{PRInfo{pr: pr}}
|
||||||
|
|
||||||
|
for _, prdata := range refPRs {
|
||||||
|
data, err := readPRData(gitea, prdata.Org, prdata.Repo, prdata.Num, slices.Concat(currentSet, retSet))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
retSet = slices.Concat(retSet, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
return retSet, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func FetchReviewSet(gitea common.GiteaPRFetcher, org, repo string, num int64, config *common.AutogitConfig) (*ReviewSet, error) {
|
||||||
|
prs, err := readPRData(gitea, org, repo, num, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ReviewSet{prs: prs}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ func (o *PullRequestSynced) Process(req *common.PullRequestWebhookEvent, git com
|
|||||||
|
|
||||||
// need to verify that submodule in the PR for prjgit
|
// need to verify that submodule in the PR for prjgit
|
||||||
// is still pointing to the HEAD of the PR
|
// is still pointing to the HEAD of the PR
|
||||||
pr, _, err := o.gitea.GetPullRequestAndReviews(req.Repository.Owner.Username, req.Repository.Name, req.Number)
|
pr, err := o.gitea.GetPullRequest(req.Repository.Owner.Username, req.Repository.Name, req.Number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Cannot fetch PR data from gitea: %w", err)
|
return fmt.Errorf("Cannot fetch PR data from gitea: %w", err)
|
||||||
}
|
}
|
||||||
@ -49,7 +49,7 @@ func (o *PullRequestSynced) Process(req *common.PullRequestWebhookEvent, git com
|
|||||||
return fmt.Errorf("Package update associated with invalid number of projects. Expected 1. Got %d", len(prs))
|
return fmt.Errorf("Package update associated with invalid number of projects. Expected 1. Got %d", len(prs))
|
||||||
}
|
}
|
||||||
|
|
||||||
prjPr, _, err := o.gitea.GetPullRequestAndReviews(prs[0].Org, prs[0].Repo, prs[0].Num)
|
prjPr, err := o.gitea.GetPullRequest(prs[0].Org, prs[0].Repo, prs[0].Num)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Cannot get PrjGit PR in processPullRequestSync. Err: %w", err)
|
return fmt.Errorf("Cannot get PrjGit PR in processPullRequestSync. Err: %w", err)
|
||||||
|
@ -132,8 +132,8 @@ func TestSyncPR(t *testing.T) {
|
|||||||
defer func() { PrjGitPR.Head.Sha = oldSha }()
|
defer func() { PrjGitPR.Head.Sha = oldSha }()
|
||||||
PrjGitPR.Head.Sha = "ab8adab91edb476b9762097d10c6379aa71efd6b60933a1c0e355ddacf419a95"
|
PrjGitPR.Head.Sha = "ab8adab91edb476b9762097d10c6379aa71efd6b60933a1c0e355ddacf419a95"
|
||||||
|
|
||||||
mock.EXPECT().GetPullRequestAndReviews(config.Organization, "testRepo", event.Pull_Request.Number).Return(modelPR, nil, nil)
|
mock.EXPECT().GetPullRequest(config.Organization, "testRepo", event.Pull_Request.Number).Return(modelPR, nil)
|
||||||
mock.EXPECT().GetPullRequestAndReviews(config.Organization, "prj", int64(24)).Return(PrjGitPR, nil, nil)
|
mock.EXPECT().GetPullRequest(config.Organization, "prj", int64(24)).Return(PrjGitPR, nil)
|
||||||
|
|
||||||
err := pr.Process(event, git, config)
|
err := pr.Process(event, git, config)
|
||||||
|
|
||||||
@ -155,7 +155,7 @@ func TestSyncPR(t *testing.T) {
|
|||||||
setupGitForTests(t, git)
|
setupGitForTests(t, git)
|
||||||
|
|
||||||
expectedErr := errors.New("Missing PR should throw error")
|
expectedErr := errors.New("Missing PR should throw error")
|
||||||
mock.EXPECT().GetPullRequestAndReviews(config.Organization, "tester", event.Pull_Request.Number).Return(modelPR, nil, expectedErr)
|
mock.EXPECT().GetPullRequest(config.Organization, "tester", event.Pull_Request.Number).Return(modelPR, expectedErr)
|
||||||
|
|
||||||
err := pr.Process(event, git, config)
|
err := pr.Process(event, git, config)
|
||||||
|
|
||||||
@ -184,8 +184,8 @@ func TestSyncPR(t *testing.T) {
|
|||||||
git.DebugLogger = true
|
git.DebugLogger = true
|
||||||
DebugMode = true
|
DebugMode = true
|
||||||
// mock.EXPECT().GetAssociatedPrjGitPR(event).Return(PrjGitPR, nil)
|
// mock.EXPECT().GetAssociatedPrjGitPR(event).Return(PrjGitPR, nil)
|
||||||
mock.EXPECT().GetPullRequestAndReviews(config.Organization, "testRepo", event.Pull_Request.Number).Return(modelPR, nil, nil)
|
mock.EXPECT().GetPullRequest(config.Organization, "testRepo", event.Pull_Request.Number).Return(modelPR, nil)
|
||||||
mock.EXPECT().GetPullRequestAndReviews(config.Organization, "prj", int64(24)).Return(PrjGitPR, nil, nil)
|
mock.EXPECT().GetPullRequest(config.Organization, "prj", int64(24)).Return(PrjGitPR, nil)
|
||||||
|
|
||||||
err := pr.Process(event, git, config)
|
err := pr.Process(event, git, config)
|
||||||
|
|
||||||
@ -206,8 +206,8 @@ func TestSyncPR(t *testing.T) {
|
|||||||
*/
|
*/
|
||||||
os.RemoveAll(path.Join(git.GitPath, common.DefaultGitPrj))
|
os.RemoveAll(path.Join(git.GitPath, common.DefaultGitPrj))
|
||||||
|
|
||||||
mock.EXPECT().GetPullRequestAndReviews(config.Organization, "testRepo", event.Pull_Request.Number).Return(modelPR, nil, nil)
|
mock.EXPECT().GetPullRequest(config.Organization, "testRepo", event.Pull_Request.Number).Return(modelPR, nil)
|
||||||
mock.EXPECT().GetPullRequestAndReviews(config.Organization, "prj", int64(24)).Return(PrjGitPR, nil, nil)
|
mock.EXPECT().GetPullRequest(config.Organization, "prj", int64(24)).Return(PrjGitPR, nil)
|
||||||
err = pr.Process(event, git, config)
|
err = pr.Process(event, git, config)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1,20 +1,127 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path"
|
||||||
"testing"
|
"testing"
|
||||||
/*
|
|
||||||
"go.uber.org/mock/gomock"
|
"go.uber.org/mock/gomock"
|
||||||
|
"src.opensuse.org/autogits/common"
|
||||||
"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_common "src.opensuse.org/autogits/common/mock"
|
||||||
*/
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPR(t *testing.T) {
|
func TestPR(t *testing.T) {
|
||||||
t.Run("Test simple PR to PrjGit checkout", func(t *testing.T) {
|
cwd, _ := os.Getwd()
|
||||||
// ctl := gomock.NewController(t)
|
cmd := exec.Command("/usr/bin/bash", path.Join(cwd, "test_repo_setup.sh"))
|
||||||
// pr := mock_main.NewMockGiteaPRInterface(ctl)
|
cmd.Dir = t.TempDir()
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
// pr.EXPECT().GetPR("foo", "bar", 22).Return(&models.PullRequest{}, nil)
|
t.Fatal(string(out))
|
||||||
})
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
baseConfig := common.AutogitConfig{
|
||||||
|
Reviewers: []string{"super1", "super2"},
|
||||||
|
Branch: "branch",
|
||||||
|
Organization: "test",
|
||||||
|
GitProjectName: "barPrj",
|
||||||
|
}
|
||||||
|
|
||||||
|
type prdata struct {
|
||||||
|
pr *models.PullRequest
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
data []prdata
|
||||||
|
api_error string
|
||||||
|
|
||||||
|
resLen int
|
||||||
|
reviewed bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Error fetching ReviewSet if there are missing links",
|
||||||
|
data: []prdata{
|
||||||
|
{pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}, err: errors.New("Missing PR")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name: "Error fetching is missing links",
|
||||||
|
data: []prdata{
|
||||||
|
{pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
|
||||||
|
}, api_error: "missing links",
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name: "Review set is not consistent",
|
||||||
|
data: []prdata{
|
||||||
|
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
|
||||||
|
{pr: &models.PullRequest{Body: "", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
|
||||||
|
},
|
||||||
|
api_error: "missing links",
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name: "Review set is consistent: 1pkg",
|
||||||
|
data: []prdata{
|
||||||
|
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
|
||||||
|
{pr: &models.PullRequest{Body: "PR: test/repo#42", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
|
||||||
|
},
|
||||||
|
resLen: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Review set is consistent: 2pkg",
|
||||||
|
data: []prdata{
|
||||||
|
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
|
||||||
|
{pr: &models.PullRequest{Body: "PR: test/repo#42\nPR: test/repo2#41", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
|
||||||
|
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 41, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo2", Owner: &models.User{UserName: "test"}}}}},
|
||||||
|
},
|
||||||
|
resLen: 3,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
ctl := gomock.NewController(t)
|
||||||
|
mock := mock_common.NewMockGiteaPRFetcher(ctl)
|
||||||
|
|
||||||
|
var test_err error
|
||||||
|
for _, data := range test.data {
|
||||||
|
mock.EXPECT().GetPullRequest(data.pr.Base.Repo.Owner.UserName, data.pr.Base.Repo.Name, data.pr.Index).Return(data.pr, data.err)
|
||||||
|
if data.err != nil {
|
||||||
|
test_err = data.err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := FetchReviewSet(mock, "test", "repo", 42, &baseConfig)
|
||||||
|
if err == nil {
|
||||||
|
if test_err != nil {
|
||||||
|
t.Fatal("Expected", test_err, "but got", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if test.api_error != "" {
|
||||||
|
if err.Error() != test.api_error {
|
||||||
|
t.Fatal("expected", test.api_error, "but got", err)
|
||||||
|
}
|
||||||
|
} else if test_err != err {
|
||||||
|
t.Fatal("expected", test_err, "but got", err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Log(res)
|
||||||
|
|
||||||
|
if test.resLen != len(res.prs) {
|
||||||
|
t.Error("expected result len", test.resLen, "but got", len(res.prs))
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if res.IsReviewed() != test.reviewed {
|
||||||
|
t.Error("expected reviewed to be NOT", res.IsReviewed())
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"errors"
|
|
||||||
"slices"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"src.opensuse.org/autogits/common"
|
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/models"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Review interface {
|
|
||||||
IsApproved() (bool, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type PRInfo struct {
|
|
||||||
pr *models.PullRequest
|
|
||||||
reviews []*models.PullReview
|
|
||||||
}
|
|
||||||
|
|
||||||
type ReviewSet struct {
|
|
||||||
maintainers MaintainershipData
|
|
||||||
prs []PRInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func readPRData(gitea common.GiteaPRReviewFetcher, org, repo string, num int64, currentSet []PRInfo) ([]PRInfo, error) {
|
|
||||||
for _, p := range currentSet {
|
|
||||||
if num == p.pr.Index && repo == p.pr.Base.Repo.Name && org == p.pr.Base.Repo.Owner.UserName {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pr, _, err := gitea.GetPullRequestAndReviews(org, repo, num)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
_, refPRs := common.ExtractDescriptionAndPRs(bufio.NewScanner(strings.NewReader(pr.Body)))
|
|
||||||
if len(refPRs) < 1 {
|
|
||||||
return nil, errors.New("missing links")
|
|
||||||
}
|
|
||||||
|
|
||||||
retSet := []PRInfo{PRInfo{pr: pr}}
|
|
||||||
|
|
||||||
for _, prdata := range refPRs {
|
|
||||||
data, err := readPRData(gitea, prdata.Org, prdata.Repo, prdata.Num, slices.Concat(currentSet, retSet))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
retSet = slices.Concat(retSet, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
return retSet, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func FetchReviewSet(gitea common.GiteaPRReviewFetcher, org, repo string, num int64, config *common.AutogitConfig) (*ReviewSet, error) {
|
|
||||||
prs, err := readPRData(gitea, org, repo, num, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &ReviewSet{prs: prs}, nil
|
|
||||||
}
|
|
@ -1,5 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
|
/*
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"slices"
|
"slices"
|
||||||
@ -8,7 +9,6 @@ import (
|
|||||||
"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"
|
||||||
)
|
)
|
||||||
|
|
||||||
func fetchPRInfo(gitea GiteaPRInterface, pr common.BasicPR) PRInfo {
|
func fetchPRInfo(gitea GiteaPRInterface, pr common.BasicPR) PRInfo {
|
||||||
data, reviews, _ := gitea.GetPullRequestAndReviews(pr.Org, pr.Repo, pr.Num)
|
data, reviews, _ := gitea.GetPullRequestAndReviews(pr.Org, pr.Repo, pr.Num)
|
||||||
return PRInfo{
|
return PRInfo{
|
||||||
@ -73,4 +73,4 @@ func (rs *ReviewSet) IsMaintainerApproved() (bool, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
package main
|
package main
|
||||||
|
/*
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"strings"
|
"strings"
|
||||||
@ -282,3 +282,4 @@ func TestReviewApproval(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
@ -1,121 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"path"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"src.opensuse.org/autogits/common"
|
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/models"
|
|
||||||
mock_common "src.opensuse.org/autogits/common/mock"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestReview(t *testing.T) {
|
|
||||||
cwd, _ := os.Getwd()
|
|
||||||
cmd := exec.Command("/usr/bin/bash", path.Join(cwd, "test_repo_setup.sh"))
|
|
||||||
cmd.Dir = t.TempDir()
|
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
|
||||||
t.Fatal(string(out))
|
|
||||||
}
|
|
||||||
|
|
||||||
baseConfig := common.AutogitConfig{
|
|
||||||
Reviewers: []string{"super1", "super2"},
|
|
||||||
Branch: "branch",
|
|
||||||
Organization: "test",
|
|
||||||
GitProjectName: "barPrj",
|
|
||||||
}
|
|
||||||
|
|
||||||
type prdata struct {
|
|
||||||
pr *models.PullRequest
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
data []prdata
|
|
||||||
api_error string
|
|
||||||
|
|
||||||
resLen int
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "Error fetching ReviewSet if there are missing links",
|
|
||||||
data: []prdata{
|
|
||||||
{pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}, err: errors.New("Missing PR")},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
name: "Error fetching is missing links",
|
|
||||||
data: []prdata{
|
|
||||||
{pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
|
|
||||||
}, api_error: "missing links",
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
name: "Review set is not consistent",
|
|
||||||
data: []prdata{
|
|
||||||
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
|
|
||||||
{pr: &models.PullRequest{Body: "", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
|
|
||||||
},
|
|
||||||
api_error: "missing links",
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
name: "Review set is consistent: 1pkg",
|
|
||||||
data: []prdata{
|
|
||||||
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
|
|
||||||
{pr: &models.PullRequest{Body: "PR: test/repo#42", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
|
|
||||||
},
|
|
||||||
resLen: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Review set is consistent: 2pkg",
|
|
||||||
data: []prdata{
|
|
||||||
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
|
|
||||||
{pr: &models.PullRequest{Body: "PR: test/repo#42\nPR: test/repo2#41", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
|
|
||||||
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 41, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo2", Owner: &models.User{UserName: "test"}}}}},
|
|
||||||
},
|
|
||||||
resLen: 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
t.Run(test.name, func(t *testing.T) {
|
|
||||||
ctl := gomock.NewController(t)
|
|
||||||
mock := mock_common.NewMockGiteaPRReviewFetcher(ctl)
|
|
||||||
|
|
||||||
var test_err error
|
|
||||||
for _, data := range test.data {
|
|
||||||
mock.EXPECT().GetPullRequestAndReviews(data.pr.Base.Repo.Owner.UserName, data.pr.Base.Repo.Name, data.pr.Index).Return(data.pr, nil, data.err)
|
|
||||||
if data.err != nil {
|
|
||||||
test_err = data.err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := FetchReviewSet(mock, "test", "repo", 42, &baseConfig)
|
|
||||||
if err == nil {
|
|
||||||
if test_err != nil {
|
|
||||||
t.Fatal("Expected", test_err, "but got", err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if test.api_error != "" {
|
|
||||||
if err.Error() != test.api_error {
|
|
||||||
t.Fatal("expected", test.api_error, "but got", err)
|
|
||||||
}
|
|
||||||
} else if test_err != err {
|
|
||||||
t.Fatal("expected", test_err, "but got", err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Log(res)
|
|
||||||
|
|
||||||
if test.resLen != len(res.prs) {
|
|
||||||
t.Error("expected result len", test.resLen, "but got", len(res.prs))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user