250 lines
6.8 KiB
Go
250 lines
6.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"log"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
// "go.uber.org/mock/gomock"
|
|
"go.uber.org/mock/gomock"
|
|
"src.opensuse.org/autogits/common"
|
|
mock_common "src.opensuse.org/autogits/common/mock"
|
|
mock_main "src.opensuse.org/workflow-pr/mock"
|
|
// "src.opensuse.org/autogits/common/mock"
|
|
)
|
|
|
|
func TestProjectBranchName(t *testing.T) {
|
|
req := common.PullRequestWebhookEvent{
|
|
Repository: &common.Repository{
|
|
Name: "testingRepo",
|
|
},
|
|
Pull_Request: &common.PullRequest{
|
|
Number: 10,
|
|
},
|
|
}
|
|
|
|
branchName := prGitBranchNameForPR(&req)
|
|
if branchName != "PR_testingRepo#10" {
|
|
t.Error("Unexpected branch name:", branchName)
|
|
}
|
|
}
|
|
|
|
func TestProjctGitSync(t *testing.T) {
|
|
req := common.PullRequestWebhookEvent{
|
|
Action: "pull",
|
|
Number: 0,
|
|
}
|
|
|
|
if err := processPrjGitPullRequestSync(&req); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
const LocalCMD = "---"
|
|
|
|
func gitExecs(t *testing.T, git *common.GitHandler, cmds [][]string) {
|
|
for _, cmd := range cmds {
|
|
if cmd[0] == LocalCMD {
|
|
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"}
|
|
_, err := command.CombinedOutput()
|
|
if err != nil {
|
|
t.Errorf(" *** error: %v\n", err)
|
|
}
|
|
} else {
|
|
git.GitExecOrPanic(cmd[0], cmd[1:]...)
|
|
}
|
|
}
|
|
}
|
|
|
|
func commandsForPackages(dir, prefix string, startN, endN int) [][]string {
|
|
commands := make([][]string, (endN - startN + 2) * 6)
|
|
|
|
if dir == "" {
|
|
dir = "."
|
|
}
|
|
cmdIdx := 0
|
|
for idx := startN; idx <= endN; idx++ {
|
|
pkgDir := fmt.Sprintf("%s%d", prefix, idx)
|
|
|
|
commands[cmdIdx+0] = []string{"", "init", "-q", "--object-format", "sha256", "-b", "testing", pkgDir}
|
|
commands[cmdIdx+1] = []string{LocalCMD, pkgDir, "/usr/bin/touch", "testFile"}
|
|
commands[cmdIdx+2] = []string{pkgDir, "add", "testFile"}
|
|
commands[cmdIdx+3] = []string{pkgDir, "commit", "-m", "added testFile"}
|
|
commands[cmdIdx+4] = []string{pkgDir, "config", "receive.denyCurrentBranch", "ignore"}
|
|
commands[cmdIdx+5] = []string{"prj", "submodule", "add", filepath.Join("..", pkgDir), filepath.Join(dir, pkgDir)}
|
|
|
|
cmdIdx += 6
|
|
}
|
|
|
|
// add all the submodules to the prj
|
|
commands[cmdIdx+0] = []string{"prj", "commit", "-a", "-m", "adding subpackages"}
|
|
|
|
return commands
|
|
}
|
|
|
|
func setupGitForTests(t *testing.T, git *common.GitHandler) {
|
|
common.ExtraGitParams = []string{
|
|
"GIT_CONFIG_COUNT=1",
|
|
"GIT_CONFIG_KEY_0=protocol.file.allow",
|
|
"GIT_CONFIG_VALUE_0=always",
|
|
}
|
|
|
|
gitExecs(t, git, [][]string{
|
|
{"", "init", "-q", "--object-format", "sha256", "-b", "testing", "prj"},
|
|
{"", "init", "-q", "--object-format", "sha256", "-b", "testing", "foo"},
|
|
{LocalCMD, "foo", "/usr/bin/touch", "file1"},
|
|
{"foo", "add", "file1"},
|
|
{"foo", "commit", "-m", "first commit"},
|
|
{"prj", "config", "receive.denyCurrentBranch", "ignore"},
|
|
{"prj", "submodule", "init"},
|
|
{"prj", "submodule", "add", filepath.Join(git.GitPath, "foo"), "testRepo"},
|
|
{"prj", "add", ".gitmodules", "testRepo"},
|
|
{"prj", "commit", "-m", "First instance"},
|
|
{"prj", "submodule", "deinit", "testRepo"},
|
|
{"", "clone", "prj", common.DefaultGitPrj},
|
|
{LocalCMD, "foo", "/usr/bin/touch", "file2"},
|
|
{"foo", "add", "file2"},
|
|
{"foo", "commit", "-m", "added file2"},
|
|
})
|
|
}
|
|
|
|
func TestUpdatePrBranch(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
origLogger := log.Writer()
|
|
log.SetOutput(&buf)
|
|
defer log.SetOutput(origLogger)
|
|
|
|
req := &common.PullRequestWebhookEvent{
|
|
Repository: &common.Repository{
|
|
Name: "testRepo",
|
|
},
|
|
Pull_Request: &common.PullRequest {
|
|
},
|
|
}
|
|
|
|
git := &common.GitHandler{
|
|
DebugLogger: true,
|
|
GitCommiter: "TestCommiter",
|
|
GitEmail: "test@testing",
|
|
GitPath: t.TempDir(),
|
|
}
|
|
|
|
setupGitForTests(t, git)
|
|
revs := strings.Split(git.GitExecWithOutputOrPanic("foo", "rev-list", "HEAD"), "\n")
|
|
req.Pull_Request.Base.Sha = strings.TrimSpace(revs[1])
|
|
req.Pull_Request.Head.Sha = strings.TrimSpace(revs[0])
|
|
|
|
if err := updateOrCreatePRBranch(req, git, "created commit", "testing"); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
git.GitExecOrPanic("prj", "reset", "--hard", "testing")
|
|
rev := strings.TrimSpace(git.GitExecWithOutputOrPanic(filepath.Join(common.DefaultGitPrj, "testRepo"), "rev-list", "-1", "HEAD"))
|
|
if rev != req.Pull_Request.Head.Sha {
|
|
t.Error("prj/testRepo not updated to", req.Pull_Request.Head.Sha, "but is at", rev)
|
|
t.Error(buf.String())
|
|
}
|
|
}
|
|
|
|
func TestCreatePrBranch(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
origLogger := log.Writer()
|
|
log.SetOutput(&buf)
|
|
defer log.SetOutput(origLogger)
|
|
|
|
req := &common.PullRequestWebhookEvent{
|
|
Repository: &common.Repository{
|
|
Name: "testRepo",
|
|
},
|
|
Pull_Request: &common.PullRequest {
|
|
},
|
|
}
|
|
|
|
git := &common.GitHandler{
|
|
DebugLogger: true,
|
|
GitCommiter: "TestCommiter",
|
|
GitEmail: "test@testing",
|
|
GitPath: t.TempDir(),
|
|
}
|
|
|
|
setupGitForTests(t, git)
|
|
revs := strings.Split(git.GitExecWithOutputOrPanic("foo", "rev-list", "HEAD"), "\n")
|
|
req.Pull_Request.Base.Sha = strings.TrimSpace(revs[1])
|
|
req.Pull_Request.Head.Sha = strings.TrimSpace(revs[0])
|
|
|
|
if err := updateOrCreatePRBranch(req, git, "created commit", "testingCreated"); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
rev := strings.TrimSpace(git.GitExecWithOutputOrPanic(filepath.Join(common.DefaultGitPrj, "testRepo"), "rev-list", "-1", "HEAD"))
|
|
if rev != req.Pull_Request.Head.Sha {
|
|
t.Error("prj/testRepo not updated to", req.Pull_Request.Head.Sha, "but is at", rev)
|
|
t.Error(buf.String())
|
|
}
|
|
|
|
git.GitExecOrPanic("prj", "reset", "--hard", "testingCreated")
|
|
rev = strings.TrimSpace(git.GitExecWithOutputOrPanic("prj", "submodule", "status", "testRepo"))[1:len(req.Pull_Request.Head.Sha)+1]
|
|
if rev != req.Pull_Request.Head.Sha {
|
|
t.Error("prj/testRepo not updated to", req.Pull_Request.Head.Sha, "but is at", rev)
|
|
t.Error(buf.String())
|
|
// os.CopyFS("/tmp/test", os.DirFS(git.GitPath))
|
|
}
|
|
}
|
|
|
|
|
|
func TestPRProcessor(t *testing.T) {
|
|
ctl := gomock.NewController(t)
|
|
defer ctl.Finish()
|
|
|
|
var logBuf bytes.Buffer
|
|
oldOut := log.Writer()
|
|
log.SetOutput(&logBuf)
|
|
defer log.SetOutput(oldOut)
|
|
|
|
req := &RequestProcessor {
|
|
Opened: mock_main.NewMockPullRequestProcessor(ctl),
|
|
Closed: mock_main.NewMockPullRequestProcessor(ctl),
|
|
Synced: mock_main.NewMockPullRequestProcessor(ctl),
|
|
}
|
|
|
|
gitea = mock_common.NewMockGitea(ctl)
|
|
pr_opened := mock_main.NewMockPullRequestProcessor(ctl)
|
|
|
|
pr_opened.EXPECT().Process(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
|
|
|
|
event := &common.PullRequestWebhookEvent {
|
|
Action: "opened",
|
|
Number: 1,
|
|
Pull_Request: &common.PullRequest {
|
|
Id: 1,
|
|
Base: common.Head {
|
|
Ref: "HEAD",
|
|
Sha: "abc",
|
|
Repo: nil,
|
|
},
|
|
Head: common.Head {
|
|
Ref: "HEAD",
|
|
Sha: "abc",
|
|
Repo: nil,
|
|
},
|
|
},
|
|
}
|
|
|
|
err := req.ProcessFunc(&common.Request{
|
|
Data: event,
|
|
})
|
|
|
|
if err != nil {
|
|
t.Error("Error processing open PR", err)
|
|
t.Error(logBuf.String())
|
|
}
|
|
}
|
|
|