diff --git a/bots-common/git_utils.go b/bots-common/git_utils.go index 08e9a92..755fd2d 100644 --- a/bots-common/git_utils.go +++ b/bots-common/git_utils.go @@ -41,10 +41,10 @@ type GitHandler struct { } type GitHandlerGenerator interface { - CreateGitHandler(git_author, email, prj_name string) (*GitHandler, error); + CreateGitHandler(git_author, email, prj_name string) (*GitHandler, error) } -type GitHandlerImpl struct {} +type GitHandlerImpl struct{} func (*GitHandlerImpl) CreateGitHandler(git_author, email, prj_name string) (*GitHandler, error) { var err error diff --git a/workflow-pr/main_test.go b/workflow-pr/main_test.go index f25ced7..3755622 100644 --- a/workflow-pr/main_test.go +++ b/workflow-pr/main_test.go @@ -49,7 +49,7 @@ func gitExecs(t *testing.T, git *common.GitHandler, cmds [][]string) { command := exec.Command(cmd[2], cmd[3:]...) command.Dir = filepath.Join(git.GitPath, cmd[1]) command.Stdin = nil - command.Env = []string{"GIT_CONFIG_COUNT=1", "GIT_CONFIG_KEY_1=protocol.file.allow", "GIT_CONFIG_VALUE_1=always"} + command.Env = append([]string{"GIT_CONFIG_COUNT=1", "GIT_CONFIG_KEY_1=protocol.file.allow", "GIT_CONFIG_VALUE_1=always"}, common.ExtraGitParams...) _, err := command.CombinedOutput() if err != nil { t.Errorf(" *** error: %v\n", err) @@ -91,6 +91,13 @@ func setupGitForTests(t *testing.T, git *common.GitHandler) { "GIT_CONFIG_COUNT=1", "GIT_CONFIG_KEY_0=protocol.file.allow", "GIT_CONFIG_VALUE_0=always", + + "GIT_AUTHOR_NAME=testname", + "GIT_AUTHOR_EMAIL=test@suse.com", + "GIT_AUTHOR_DATE='2005-04-07T22:13:13'", + "GIT_COMMITTER_NAME=testname", + "GIT_COMMITTER_EMAIL=test@suse.com", + "GIT_COMMITTER_DATE='2005-04-07T22:13:13'", } gitExecs(t, git, [][]string{ @@ -101,7 +108,7 @@ func setupGitForTests(t *testing.T, git *common.GitHandler) { {"foo", "commit", "-m", "first commit"}, {"prj", "config", "receive.denyCurrentBranch", "ignore"}, {"prj", "submodule", "init"}, - {"prj", "submodule", "add", filepath.Join(git.GitPath, "foo"), "testRepo"}, + {"prj", "submodule", "add", "../foo", "testRepo"}, {"prj", "add", ".gitmodules", "testRepo"}, {"prj", "commit", "-m", "First instance"}, {"prj", "submodule", "deinit", "testRepo"}, diff --git a/workflow-pr/pr_sync.go b/workflow-pr/pr_sync.go index e31e023..1c7922d 100644 --- a/workflow-pr/pr_sync.go +++ b/workflow-pr/pr_sync.go @@ -29,8 +29,6 @@ func (o *PullRequestSynced) Process(req *common.PullRequestWebhookEvent, git *co return fmt.Errorf("Cannot get associated PrjGit PR in processPullRequestSync. Err: %w", err) } - log.Println("associated pr:", prjPr) - common.PanicOnError(git.GitExec("", "clone", "--branch", prjPr.Head.Name, "--depth", "1", prjPr.Head.Repo.SSHURL, common.DefaultGitPrj)) commitId, ok := git.GitSubmoduleCommitId(common.DefaultGitPrj, req.Repository.Name, prjPr.Head.Sha) @@ -56,4 +54,3 @@ Update to %s`, req.Pull_Request.Head.Sha) branchName := prGitBranchNameForPR(req) return updateOrCreatePRBranch(req, git, commitMsg, branchName) } - diff --git a/workflow-pr/pr_sync_test.go b/workflow-pr/pr_sync_test.go new file mode 100644 index 0000000..297c552 --- /dev/null +++ b/workflow-pr/pr_sync_test.go @@ -0,0 +1,202 @@ +package main + +import ( + "bytes" + "errors" + "log" + "os" + "path" + "strings" + "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 TestSyncPR(t *testing.T) { + pr := PullRequestSynced{} + + config := &common.AutogitConfig{ + Reviewers: []string{"reviewer1", "reviewer2"}, + Branch: "testing", + Organization: "test", + GitProjectName: "prj", + } + + event := &common.PullRequestWebhookEvent{ + Action: "syncronized", + Number: 42, + Pull_Request: &common.PullRequest{ + Number: 42, + Base: common.Head{ + Ref: "branch", + Sha: "8a6a69a4232cabda04a4d9563030aa888ff5482f75aa4c6519da32a951a072e2", + Repo: &common.Repository{ + Name: "testRepo", + Default_Branch: "main1", + }, + }, + Head: common.Head{ + Ref: "branch", + Sha: "11eb36d5a58d7bb376cac59ac729a1986c6a7bfc63e7818e14382f545ccda985", + Repo: &common.Repository{ + Name: "testRepo", + Default_Branch: "main1", + }, + }, + }, + Repository: &common.Repository{ + Owner: &common.Organization{ + Username: "test", + }, + }, + } + + PrjGitPR := &models.PullRequest{ + Title: "some pull request", + Head: &models.PRBranchInfo{ + Name: "testing", + Sha: "db8adab91edb476b9762097d10c6379aa71efd6b60933a1c0e355ddacf419a95", + Repo: &models.Repository{ + SSHURL: "./prj", + }, + }, + } + + git := &common.GitHandler{ + GitCommiter: "tester", + GitEmail: "test@suse.com", + } + + t.Run("PR sync request against PrjGit == no action", func(t *testing.T) { + ctl := gomock.NewController(t) + pr.gitea = mock_common.NewMockGitea(ctl) + + git.GitPath = t.TempDir() + + config.GitProjectName = "testRepo" + event.Repository.Name = "testRepo" + + if err := pr.Process(event, git, config); err != nil { + t.Error("Error PrjGit sync request. Should be no error.", err) + } + }) + + t.Run("Missing submodule in prjgit", func(t *testing.T) { + ctl := gomock.NewController(t) + mock := mock_common.NewMockGitea(ctl) + + pr.gitea = mock + git.GitPath = t.TempDir() + + config.GitProjectName = "prjGit" + event.Repository.Name = "tester" + + setupGitForTests(t, git) + + mock.EXPECT().GetAssociatedPrjGitPR(event).Return(PrjGitPR, nil) + + err := pr.Process(event, git, config) + + if err == nil || err.Error() != "Cannot fetch submodule commit id in prjgit for 'tester'" { + t.Error("Invalid error received.", err) + } + }) + + t.Run("Missing PrjGit PR for the sync", func(t *testing.T) { + ctl := gomock.NewController(t) + mock := mock_common.NewMockGitea(ctl) + + pr.gitea = mock + git.GitPath = t.TempDir() + + config.GitProjectName = "prjGit" + event.Repository.Name = "tester" + + setupGitForTests(t, git) + + expectedErr := errors.New("Missing PR should throw error") + mock.EXPECT().GetAssociatedPrjGitPR(event).Return(PrjGitPR, expectedErr) + + err := pr.Process(event, git, config) + + if err == nil || errors.Unwrap(err) != expectedErr { + t.Error("Invalid error received.", err) + } + }) + + t.Run("PR sync", func(t *testing.T) { + var b bytes.Buffer + w := log.Writer() + log.SetOutput(&b) + defer log.SetOutput(w) + + ctl := gomock.NewController(t) + mock := mock_common.NewMockGitea(ctl) + + pr.gitea = mock + git.GitPath = t.TempDir() + + config.GitProjectName = "prjGit" + event.Repository.Name = "testRepo" + + setupGitForTests(t, git) + + git.DebugLogger = true + DebugMode = true + mock.EXPECT().GetAssociatedPrjGitPR(event).Return(PrjGitPR, nil) + + err := pr.Process(event, git, config) + + if err != nil { + t.Error("Invalid error received.", err) + t.Error(b.String()) + } + + // check that we actually created the branch in the prjgit + id, ok := git.GitSubmoduleCommitId("prj", "testRepo", "c097b9d1d69892d0ef2afa66d4e8abf0a1612c6f95d271a6e15d6aff1ad2854c") + if id != "11eb36d5a58d7bb376cac59ac729a1986c6a7bfc63e7818e14382f545ccda985" || !ok { + t.Error("Failed creating PR") + t.Error(b.String()) + } + + // does nothing on next sync of already synced data -- PR is updated + os.RemoveAll(path.Join(git.GitPath, common.DefaultGitPrj)) + mock.EXPECT().GetAssociatedPrjGitPR(event).Return(&models.PullRequest{ + Title: "some pull request", + Head: &models.PRBranchInfo{ + Name: "testing", + Sha: "c097b9d1d69892d0ef2afa66d4e8abf0a1612c6f95d271a6e15d6aff1ad2854c", + Repo: &models.Repository{ + SSHURL: "./prj", + }, + }, + }, nil) + + err = pr.Process(event, git, config) + + if err != nil { + t.Error("Invalid error received.", err) + t.Error(b.String()) + } + + // check that we actually created the branch in the prjgit + id, ok = git.GitSubmoduleCommitId("prj", "testRepo", "c097b9d1d69892d0ef2afa66d4e8abf0a1612c6f95d271a6e15d6aff1ad2854c") + if id != "11eb36d5a58d7bb376cac59ac729a1986c6a7bfc63e7818e14382f545ccda985" || !ok { + t.Error("Failed creating PR") + t.Error(b.String()) + } + + if id, err := git.GitBranchHead("prj", "PR_testRepo#42"); id != "c097b9d1d69892d0ef2afa66d4e8abf0a1612c6f95d271a6e15d6aff1ad2854c" || err != nil { + t.Error("no branch?", err) + t.Error(b.String()) + } + + if !strings.Contains(b.String(), "commitID already match - nothing to do") { + os.CopyFS("/tmp/test", os.DirFS(git.GitPath)) + t.Log(b.String()) + } + }) +}