package main import ( "errors" "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 TestOpenPR(t *testing.T) { pr := PRProcessor{ config: &common.AutogitConfig{ Reviewers: []string{"reviewer1", "reviewer2"}, Branch: "branch", Organization: "test", GitProjectName: "prj#testing", }, } event := &common.PullRequestWebhookEvent{ Action: "opened", Number: 1, Pull_Request: &common.PullRequest{ Id: 1, Number: 1, Base: common.Head{ Ref: "branch", Sha: "testing", Repo: &common.Repository{ Name: "testRepo", Default_Branch: "main1", Owner: &common.Organization{ Username: "test", }, }, }, Head: common.Head{ Ref: "branch", Sha: "testing", Repo: &common.Repository{ Name: "testRepo", Default_Branch: "main1", }, }, }, Repository: &common.Repository{ Owner: &common.Organization{ Username: "test", }, }, } modelPR := &models.PullRequest{ ID: 1, Index: 1, State: "open", User: &models.User{UserName: "testuser"}, RequestedReviewers: []*models.User{}, Base: &models.PRBranchInfo{ Ref: "branch", Sha: "testing", Repo: &models.Repository{ Name: "testRepo", Owner: &models.User{ UserName: "test", }, }, }, Head: &models.PRBranchInfo{ Ref: "branch", Sha: "testing", Repo: &models.Repository{ Name: "testRepo", Owner: &models.User{ UserName: "test", }, }, }, } mockCreatePR := &models.PullRequest{ ID: 2, Index: 2, Body: "Forwarded PRs: testRepo\n\nPR: test/testRepo!1", User: &models.User{UserName: "testuser"}, RequestedReviewers: []*models.User{}, Base: &models.PRBranchInfo{ Name: "testing", Repo: &models.Repository{ Name: "prjcopy", Owner: &models.User{UserName: "test"}, }, }, Head: &models.PRBranchInfo{ Sha: "head", }, } CurrentUser = &models.User{ UserName: "testuser", } git := &common.GitHandlerImpl{ GitCommiter: "tester", GitEmail: "test@suse.com", } t.Run("PR git opened request against PrjGit == no action", func(t *testing.T) { ctl := gomock.NewController(t) gitea := mock_common.NewMockGitea(ctl) Gitea = gitea git.GitPath = t.TempDir() pr.config.GitProjectName = "testRepo#testing" event.Repository.Name = "testRepo" mockGit := mock_common.NewMockGit(ctl) pr.git = mockGit mockGitGen := mock_common.NewMockGitHandlerGenerator(ctl) GitHandler = mockGitGen mockGitGen.EXPECT().CreateGitHandler(gomock.Any()).Return(mockGit, nil).AnyTimes() mockGit.EXPECT().GitClone(gomock.Any(), gomock.Any(), gomock.Any()).Return("origin", nil).AnyTimes() mockGit.EXPECT().GitBranchHead(gomock.Any(), gomock.Any()).Return("head", nil).AnyTimes() mockGit.EXPECT().GitSubmoduleList(gomock.Any(), gomock.Any()).Return(map[string]string{"testRepo": "testing"}, nil).AnyTimes() mockGit.EXPECT().GitExecOrPanic(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() mockGit.EXPECT().GitCatFile(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() mockGit.EXPECT().Close().Return(nil).AnyTimes() gitea.EXPECT().GetTimeline(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.TimelineComment{}, nil).AnyTimes() gitea.EXPECT().GetPullRequest(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().UpdatePullRequest(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().SetLabels(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.Label{}, nil).AnyTimes() gitea.EXPECT().SetRepoOptions(gomock.Any(), gomock.Any(), gomock.Any()).Return(&models.Repository{SSHURL: "git@src.opensuse.org:test/prj.git"}, nil).AnyTimes() gitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes() gitea.EXPECT().GetRepository(gomock.Any(), gomock.Any()).Return(&models.Repository{ Owner: &models.User{UserName: "test"}, Name: "prjcopy", SSHURL: "git@src.opensuse.org:test/prj.git", }, nil).AnyTimes() gitea.EXPECT().CreateRepositoryIfNotExist(gomock.Any(), gomock.Any(), gomock.Any()).Return(&models.Repository{SSHURL: "git@src.opensuse.org:test/prj.git"}, nil).AnyTimes() gitea.EXPECT().CreatePullRequestIfNotExist(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockCreatePR, nil, true).AnyTimes() gitea.EXPECT().RequestReviews(gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() gitea.EXPECT().FetchMaintainershipDirFile(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, "", nil).AnyTimes() gitea.EXPECT().FetchMaintainershipFile(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, "", nil).AnyTimes() if err := pr.Process(modelPR); err != nil { t.Error("Error PrjGit opened request. Should be no error.", err) } }) t.Run("Open PrjGit PR", func(t *testing.T) { ctl := gomock.NewController(t) gitea := mock_common.NewMockGitea(ctl) Gitea = gitea event.Repository.Name = "testRepo" pr.config.GitProjectName = "prjcopy#testing" git.GitPath = t.TempDir() setupGitForTests(t, git) gitea.EXPECT().CreateRepositoryIfNotExist(gomock.Any(), gomock.Any(), gomock.Any()).Return(&models.Repository{SSHURL: "git@src.opensuse.org:test/prj.git"}, nil).AnyTimes() gitea.EXPECT().CreatePullRequestIfNotExist(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockCreatePR, nil, true).AnyTimes() gitea.EXPECT().GetPullRequest(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().RequestReviews(gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() gitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes() gitea.EXPECT().FetchMaintainershipDirFile(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, "", nil).AnyTimes() gitea.EXPECT().FetchMaintainershipFile(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, "", nil).AnyTimes() mockGit := mock_common.NewMockGit(ctl) pr.git = mockGit mockGitGen := mock_common.NewMockGitHandlerGenerator(ctl) GitHandler = mockGitGen mockGitGen.EXPECT().CreateGitHandler(gomock.Any()).Return(mockGit, nil).AnyTimes() mockGit.EXPECT().GitClone(gomock.Any(), gomock.Any(), gomock.Any()).Return("origin", nil).AnyTimes() mockGit.EXPECT().GitBranchHead(gomock.Any(), gomock.Any()).Return("head", nil).AnyTimes() mockGit.EXPECT().GitSubmoduleList(gomock.Any(), gomock.Any()).Return(map[string]string{"testRepo": "testing"}, nil).AnyTimes() mockGit.EXPECT().GitExecOrPanic(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() mockGit.EXPECT().GitCatFile(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() mockGit.EXPECT().Close().Return(nil).AnyTimes() gitea.EXPECT().GetTimeline(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.TimelineComment{}, nil).AnyTimes() gitea.EXPECT().GetPullRequest(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().UpdatePullRequest(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().SetLabels(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.Label{}, nil).AnyTimes() gitea.EXPECT().SetRepoOptions(gomock.Any(), gomock.Any(), gomock.Any()).Return(&models.Repository{SSHURL: "git@src.opensuse.org:test/prj.git"}, nil).AnyTimes() gitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes() gitea.EXPECT().GetRepository(gomock.Any(), gomock.Any()).Return(&models.Repository{ Owner: &models.User{UserName: "test"}, Name: "prjcopy", SSHURL: "git@src.opensuse.org:test/prj.git", }, nil).AnyTimes() err := pr.Process(modelPR) if err != nil { t.Error("error:", err) } }) t.Run("Cannot create prjgit repository", func(t *testing.T) { ctl := gomock.NewController(t) gitea := mock_common.NewMockGitea(ctl) Gitea = gitea event.Repository.Name = "testRepo" pr.config.GitProjectName = "prjcopy#testing" git.GitPath = t.TempDir() setupGitForTests(t, git) failedErr := errors.New("Returned error here") gitea.EXPECT().CreateRepositoryIfNotExist(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, failedErr).AnyTimes() gitea.EXPECT().CreatePullRequestIfNotExist(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockCreatePR, nil, true).AnyTimes() mockGit := mock_common.NewMockGit(ctl) pr.git = mockGit gitea.EXPECT().FetchMaintainershipDirFile(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, "", nil).AnyTimes() mockGitGen := mock_common.NewMockGitHandlerGenerator(ctl) GitHandler = mockGitGen mockGitGen.EXPECT().CreateGitHandler(gomock.Any()).Return(mockGit, nil).AnyTimes() mockGit.EXPECT().GitClone(gomock.Any(), gomock.Any(), gomock.Any()).Return("origin", nil).AnyTimes() mockGit.EXPECT().GitBranchHead(gomock.Any(), gomock.Any()).Return("head", nil).AnyTimes() mockGit.EXPECT().GitSubmoduleList(gomock.Any(), gomock.Any()).Return(map[string]string{"testRepo": "testing"}, nil).AnyTimes() mockGit.EXPECT().GitExecOrPanic(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() mockGit.EXPECT().GitCatFile(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() gitea.EXPECT().RequestReviews(gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() mockGit.EXPECT().Close().Return(nil).AnyTimes() gitea.EXPECT().GetTimeline(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.TimelineComment{}, nil).AnyTimes() gitea.EXPECT().GetPullRequest(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().UpdatePullRequest(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().SetLabels(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.Label{}, nil).AnyTimes() gitea.EXPECT().SetRepoOptions(gomock.Any(), gomock.Any(), gomock.Any()).Return(&models.Repository{SSHURL: "git@src.opensuse.org:test/prj.git"}, nil).AnyTimes() gitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes() gitea.EXPECT().GetRepository(gomock.Any(), gomock.Any()).Return(&models.Repository{ Owner: &models.User{UserName: "test"}, Name: "prjcopy", SSHURL: "git@src.opensuse.org:test/prj.git", }, nil).AnyTimes() err := pr.Process(modelPR) if err != nil { t.Error("error:", err) } }) t.Run("Cannot create PR", func(t *testing.T) { ctl := gomock.NewController(t) gitea := mock_common.NewMockGitea(ctl) Gitea = gitea event.Repository.Name = "testRepo" pr.config.GitProjectName = "prjcopy#testing" git.GitPath = t.TempDir() setupGitForTests(t, git) prjgit := &models.Repository{ SSHURL: "./prj", DefaultBranch: "testing", } failedErr := errors.New("Returned error here") gitea.EXPECT().CreateRepositoryIfNotExist(gomock.Any(), gomock.Any(), gomock.Any()).Return(prjgit, nil).AnyTimes() gitea.EXPECT().CreatePullRequestIfNotExist(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, failedErr, false) mockGit := mock_common.NewMockGit(ctl) pr.git = mockGit gitea.EXPECT().RequestReviews(gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() mockGitGen := mock_common.NewMockGitHandlerGenerator(ctl) GitHandler = mockGitGen mockGitGen.EXPECT().CreateGitHandler(gomock.Any()).Return(mockGit, nil).AnyTimes() mockGit.EXPECT().GitClone(gomock.Any(), gomock.Any(), gomock.Any()).Return("origin", nil).AnyTimes() mockGit.EXPECT().GitBranchHead(gomock.Any(), gomock.Any()).Return("head", nil).AnyTimes() mockGit.EXPECT().GitSubmoduleList(gomock.Any(), gomock.Any()).Return(map[string]string{"testRepo": "testing"}, nil).AnyTimes() mockGit.EXPECT().GitExecOrPanic(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() mockGit.EXPECT().GitCatFile(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() mockGit.EXPECT().Close().Return(nil).AnyTimes() gitea.EXPECT().GetTimeline(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.TimelineComment{}, nil).AnyTimes() gitea.EXPECT().GetPullRequest(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().UpdatePullRequest(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().SetLabels(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.Label{}, nil).AnyTimes() gitea.EXPECT().SetRepoOptions(gomock.Any(), gomock.Any(), gomock.Any()).Return(&models.Repository{SSHURL: "git@src.opensuse.org:test/prj.git"}, nil).AnyTimes() gitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes() gitea.EXPECT().GetRepository(gomock.Any(), gomock.Any()).Return(&models.Repository{ Owner: &models.User{UserName: "test"}, Name: "prjcopy", SSHURL: "git@src.opensuse.org:test/prj.git", }, nil).AnyTimes() err := pr.Process(modelPR) if err != failedErr { t.Error("error:", err) } }) t.Run("Open PrjGit PR", func(t *testing.T) { ctl := gomock.NewController(t) gitea := mock_common.NewMockGitea(ctl) Gitea = gitea event.Repository.Name = "testRepo" pr.config.GitProjectName = "prjcopy#testing" git.GitPath = t.TempDir() setupGitForTests(t, git) failedErr := errors.New("Returned error here") gitea.EXPECT().CreateRepositoryIfNotExist(gomock.Any(), gomock.Any(), gomock.Any()).Return(&models.Repository{SSHURL: "git@src.opensuse.org:test/prj.git"}, nil).AnyTimes() gitea.EXPECT().GetPullRequest(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes() gitea.EXPECT().CreatePullRequestIfNotExist(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockCreatePR, nil, true).AnyTimes() gitea.EXPECT().RequestReviews(gomock.Any(), gomock.Any()).Return(nil, failedErr).AnyTimes() gitea.EXPECT().FetchMaintainershipDirFile(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, "", nil).AnyTimes() gitea.EXPECT().FetchMaintainershipFile(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, "", nil).AnyTimes() mockGit := mock_common.NewMockGit(ctl) pr.git = mockGit mockGitGen := mock_common.NewMockGitHandlerGenerator(ctl) GitHandler = mockGitGen mockGitGen.EXPECT().CreateGitHandler(gomock.Any()).Return(mockGit, nil).AnyTimes() mockGit.EXPECT().GitClone(gomock.Any(), gomock.Any(), gomock.Any()).Return("origin", nil).AnyTimes() mockGit.EXPECT().GitBranchHead(gomock.Any(), gomock.Any()).Return("head", nil).AnyTimes() mockGit.EXPECT().GitSubmoduleList(gomock.Any(), gomock.Any()).Return(map[string]string{"testRepo": "testing"}, nil).AnyTimes() mockGit.EXPECT().GitExecOrPanic(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() mockGit.EXPECT().GitCatFile(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() mockGit.EXPECT().Close().Return(nil).AnyTimes() gitea.EXPECT().GetTimeline(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.TimelineComment{}, nil).AnyTimes() gitea.EXPECT().GetPullRequest(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().UpdatePullRequest(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelPR, nil).AnyTimes() gitea.EXPECT().SetLabels(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.Label{}, nil).AnyTimes() gitea.EXPECT().SetRepoOptions(gomock.Any(), gomock.Any(), gomock.Any()).Return(&models.Repository{SSHURL: "git@src.opensuse.org:test/prj.git"}, nil).AnyTimes() gitea.EXPECT().GetPullRequestReviews(gomock.Any(), gomock.Any(), gomock.Any()).Return([]*models.PullReview{}, nil).AnyTimes() gitea.EXPECT().GetRepository(gomock.Any(), gomock.Any()).Return(&models.Repository{ Owner: &models.User{UserName: "test"}, Name: "prjcopy", SSHURL: "git@src.opensuse.org:test/prj.git", }, nil).AnyTimes() err := pr.Process(modelPR) if err != nil { t.Error("error:", err) } }) }