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) } }) }