We want to share the NewController logging setup with other tests across utilities
125 lines
4.1 KiB
Go
125 lines
4.1 KiB
Go
package common_test
|
|
|
|
import (
|
|
"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"
|
|
"src.opensuse.org/autogits/common/test_utils"
|
|
)
|
|
|
|
func TestFetchPRSet_Linkage(t *testing.T) {
|
|
config := &common.AutogitConfig{
|
|
Organization: "target-org",
|
|
GitProjectName: "test-org/prjgit#main",
|
|
}
|
|
|
|
// 1. Mock a package PR
|
|
pkgPR := &models.PullRequest{
|
|
Index: 101,
|
|
State: "open",
|
|
Base: &models.PRBranchInfo{
|
|
Ref: "main",
|
|
Repo: &models.Repository{
|
|
Name: "pkg1",
|
|
Owner: &models.User{UserName: "target-org"},
|
|
},
|
|
},
|
|
Head: &models.PRBranchInfo{Sha: "pkg-sha"},
|
|
}
|
|
|
|
// 2. Mock a ProjectGit PR that references the package PR
|
|
prjGitPR := &models.PullRequest{
|
|
Index: 500,
|
|
State: "open",
|
|
Base: &models.PRBranchInfo{
|
|
Ref: "main",
|
|
Name: "main",
|
|
Repo: &models.Repository{
|
|
Name: "prjgit",
|
|
Owner: &models.User{UserName: "test-org"},
|
|
},
|
|
},
|
|
Body: "Forwarded PRs: pkg1\n\nPR: target-org/pkg1!101",
|
|
}
|
|
|
|
t.Run("Fetch from ProjectGit PR", func(t *testing.T) {
|
|
ctl := test_utils.NewController(t)
|
|
defer ctl.Finish()
|
|
mockGitea := mock_common.NewMockGiteaPRTimelineReviewFetcher(ctl)
|
|
mockGitea.EXPECT().ResetTimelineCache(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes()
|
|
|
|
// Expect fetch of prjGitPR
|
|
mockGitea.EXPECT().GetPullRequest("test-org", "prjgit", int64(500)).Return(prjGitPR, nil)
|
|
// Expect fetch of pkgPR because it's linked in body
|
|
mockGitea.EXPECT().GetPullRequest("target-org", "pkg1", int64(101)).Return(pkgPR, nil)
|
|
|
|
// Expect review fetching (part of FetchPRSet)
|
|
mockGitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes()
|
|
mockGitea.EXPECT().GetTimeline(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.TimelineComment{}, nil).AnyTimes()
|
|
|
|
prset, err := common.FetchPRSet("bot", mockGitea, "test-org", "prjgit", 500, config)
|
|
if err != nil {
|
|
t.Fatalf("FetchPRSet failed: %v", err)
|
|
}
|
|
|
|
if len(prset.PRs) != 2 {
|
|
t.Errorf("Expected 2 PRs in set, got %d", len(prset.PRs))
|
|
}
|
|
|
|
if !prset.IsConsistent() {
|
|
t.Error("PR set should be consistent")
|
|
}
|
|
})
|
|
|
|
t.Run("Fetch from Package PR via Timeline", func(t *testing.T) {
|
|
ctl := test_utils.NewController(t)
|
|
defer ctl.Finish()
|
|
mockGitea := mock_common.NewMockGiteaPRTimelineReviewFetcher(ctl)
|
|
mockGitea.EXPECT().ResetTimelineCache(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes()
|
|
|
|
// 1. FetchPRSet for pkgPR will call LastPrjGitRefOnTimeline
|
|
mockGitea.EXPECT().GetTimeline("target-org", "pkg1", int64(101)).Return([]*models.TimelineComment{
|
|
{
|
|
Type: common.TimelineCommentType_PullRequestRef,
|
|
RefIssue: &models.Issue{
|
|
Index: 500,
|
|
Body: "PR: target-org/pkg1!101",
|
|
Repository: &models.RepositoryMeta{
|
|
Owner: "test-org",
|
|
Name: "prjgit",
|
|
},
|
|
User: &models.User{UserName: "bot"},
|
|
},
|
|
},
|
|
}, nil)
|
|
|
|
// 2. It will then fetch the prjGitPR found in timeline (twice in LastPrjGitRefOnTimeline)
|
|
mockGitea.EXPECT().GetPullRequest("test-org", "prjgit", int64(500)).Return(prjGitPR, nil).Times(2)
|
|
|
|
// 3. Then it will recursively fetch linked PRs from prjGitPR body in readPRData
|
|
mockGitea.EXPECT().GetPullRequest("target-org", "pkg1", int64(101)).Return(pkgPR, nil)
|
|
|
|
// Review fetching for all PRs in the set
|
|
mockGitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes()
|
|
mockGitea.EXPECT().GetTimeline("test-org", "prjgit", int64(500)).Return([]*models.TimelineComment{}, nil).AnyTimes()
|
|
mockGitea.EXPECT().GetTimeline("target-org", "pkg1", int64(101)).Return([]*models.TimelineComment{}, nil).AnyTimes()
|
|
|
|
prset, err := common.FetchPRSet("bot", mockGitea, "target-org", "pkg1", 101, config)
|
|
if err != nil {
|
|
t.Fatalf("FetchPRSet failed: %v", err)
|
|
}
|
|
|
|
if len(prset.PRs) != 2 {
|
|
t.Errorf("Expected 2 PRs in set, got %d", len(prset.PRs))
|
|
}
|
|
|
|
prjPRInfo, err := prset.GetPrjGitPR()
|
|
if err != nil || prjPRInfo.PR.Index != 500 {
|
|
t.Errorf("Expected ProjectGit PR 500 to be found, got %v", prjPRInfo)
|
|
}
|
|
})
|
|
}
|