feat(gitea): pull-request create/list/get/merge endpoints
This commit is contained in:
+149
@@ -376,3 +376,152 @@ func TestCommitStatusErrors(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// --- pull requests ------------------------------------------------------------
|
||||
|
||||
func TestPullRequestFlow(t *testing.T) {
|
||||
c, srv := newClient(t)
|
||||
srv.AddRepo("ukrrs", "MOPAC", "main", "main", "feat/quota")
|
||||
|
||||
pr, err := c.CreatePullRequest(context.Background(), "ukrrs", "MOPAC", gitea.PRParams{
|
||||
Title: "Quota accounting",
|
||||
Body: "## Scope\n- usage accounting",
|
||||
Base: "main",
|
||||
Head: "feat/quota",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("CreatePullRequest: %v", err)
|
||||
}
|
||||
if pr.Number != 1 || pr.State != "open" || !pr.Mergeable || pr.Merged {
|
||||
t.Fatalf("pr = %+v", pr)
|
||||
}
|
||||
if pr.Base.Ref != "main" || pr.Head.Ref != "feat/quota" || pr.Head.SHA == "" {
|
||||
t.Fatalf("pr ends = %+v %+v", pr.Base, pr.Head)
|
||||
}
|
||||
var post map[string]any
|
||||
if err := json.Unmarshal([]byte(srv.Requests()[0].Body), &post); err != nil {
|
||||
t.Fatalf("POST body not json: %v", err)
|
||||
}
|
||||
for _, k := range []string{"title", "body", "base", "head"} {
|
||||
if _, ok := post[k]; !ok {
|
||||
t.Errorf("POST body missing %q: %v", k, post)
|
||||
}
|
||||
}
|
||||
|
||||
// Green the head, then merge.
|
||||
if _, err := c.CreateCommitStatus(context.Background(), "ukrrs", "MOPAC", pr.Head.SHA, gitea.CommitStatusParams{
|
||||
State: gitea.StatusSuccess, Context: "ci/lint",
|
||||
}); err != nil {
|
||||
t.Fatalf("status on head: %v", err)
|
||||
}
|
||||
if err := c.MergePullRequest(context.Background(), "ukrrs", "MOPAC", pr.Number, gitea.MergeParams{Do: gitea.MergeSquash}); err != nil {
|
||||
t.Fatalf("MergePullRequest: %v", err)
|
||||
}
|
||||
stored, ok := srv.PullRequest("ukrrs", "MOPAC", pr.Number)
|
||||
if !ok || !stored.Merged || stored.State != "closed" {
|
||||
t.Fatalf("stored pr after merge = %+v ok=%v", stored, ok)
|
||||
}
|
||||
|
||||
// State filters.
|
||||
open, err := c.ListPullRequests(context.Background(), "ukrrs", "MOPAC", gitea.PRStateOpen)
|
||||
if err != nil {
|
||||
t.Fatalf("ListPullRequests open: %v", err)
|
||||
}
|
||||
if len(open) != 0 {
|
||||
t.Fatalf("open after merge = %+v", open)
|
||||
}
|
||||
closed, err := c.ListPullRequests(context.Background(), "ukrrs", "MOPAC", gitea.PRStateClosed)
|
||||
if err != nil {
|
||||
t.Fatalf("ListPullRequests closed: %v", err)
|
||||
}
|
||||
if len(closed) != 1 || closed[0].Number != pr.Number {
|
||||
t.Fatalf("closed = %+v", closed)
|
||||
}
|
||||
all, err := c.ListPullRequests(context.Background(), "ukrrs", "MOPAC", gitea.PRStateAll)
|
||||
if err != nil || len(all) != 1 {
|
||||
t.Fatalf("all = %+v err=%v", all, err)
|
||||
}
|
||||
|
||||
// Merging again is a 409 -> validation sentinel.
|
||||
if err := c.MergePullRequest(context.Background(), "ukrrs", "MOPAC", pr.Number, gitea.MergeParams{}); !errors.Is(err, gitea.ErrValidation) {
|
||||
t.Fatalf("re-merge err = %v, want ErrValidation", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetPullRequest(t *testing.T) {
|
||||
c, srv := newClient(t)
|
||||
srv.AddRepo("ukrrs", "MOPAC", "main", "main", "feat/quota")
|
||||
created, err := c.CreatePullRequest(context.Background(), "ukrrs", "MOPAC", gitea.PRParams{Title: "t", Base: "main", Head: "feat/quota"})
|
||||
if err != nil {
|
||||
t.Fatalf("create: %v", err)
|
||||
}
|
||||
got, err := c.GetPullRequest(context.Background(), "ukrrs", "MOPAC", created.Number)
|
||||
if err != nil {
|
||||
t.Fatalf("GetPullRequest: %v", err)
|
||||
}
|
||||
if got.Title != "t" || got.Number != created.Number {
|
||||
t.Fatalf("got = %+v", got)
|
||||
}
|
||||
if _, err := c.GetPullRequest(context.Background(), "ukrrs", "MOPAC", 999); !errors.Is(err, gitea.ErrNotFound) {
|
||||
t.Fatalf("err = %v, want ErrNotFound", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCreatePullRequestErrors(t *testing.T) {
|
||||
c, srv := newClient(t)
|
||||
srv.AddRepo("ukrrs", "MOPAC", "main", "main", "feat/quota")
|
||||
base := gitea.PRParams{Title: "t", Base: "main", Head: "feat/quota"}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
p gitea.PRParams
|
||||
want error
|
||||
}{
|
||||
{"missing title", gitea.PRParams{Base: "main", Head: "feat/quota"}, gitea.ErrValidation},
|
||||
{"missing base branch", gitea.PRParams{Title: "t", Base: "nope", Head: "feat/quota"}, gitea.ErrValidation},
|
||||
{"missing head branch", gitea.PRParams{Title: "t", Base: "main", Head: "nope"}, gitea.ErrValidation},
|
||||
{"head equals base", gitea.PRParams{Title: "t", Base: "main", Head: "main"}, gitea.ErrValidation},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if _, err := c.CreatePullRequest(context.Background(), "ukrrs", "MOPAC", tt.p); !errors.Is(err, tt.want) {
|
||||
t.Fatalf("err = %v, want %v", err, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Duplicate open PR -> 409.
|
||||
if _, err := c.CreatePullRequest(context.Background(), "ukrrs", "MOPAC", base); err != nil {
|
||||
t.Fatalf("first create: %v", err)
|
||||
}
|
||||
if _, err := c.CreatePullRequest(context.Background(), "ukrrs", "MOPAC", base); !errors.Is(err, gitea.ErrValidation) {
|
||||
t.Fatalf("duplicate err = %v, want ErrValidation (409)", err)
|
||||
}
|
||||
// Unknown repo -> 404.
|
||||
if _, err := c.CreatePullRequest(context.Background(), "ukrrs", "absent", base); !errors.Is(err, gitea.ErrNotFound) {
|
||||
t.Fatalf("err = %v, want ErrNotFound", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMergeStyles(t *testing.T) {
|
||||
for _, style := range []string{gitea.MergeMerge, gitea.MergeRebase, gitea.MergeRebaseMerge, gitea.MergeSquash, gitea.MergeFastForward, ""} {
|
||||
t.Run("style_"+style, func(t *testing.T) {
|
||||
c, srv := newClient(t)
|
||||
srv.AddRepo("ukrrs", "MOPAC", "main", "main", "feat/x")
|
||||
pr, err := c.CreatePullRequest(context.Background(), "ukrrs", "MOPAC", gitea.PRParams{Title: "t", Base: "main", Head: "feat/x"})
|
||||
if err != nil {
|
||||
t.Fatalf("create: %v", err)
|
||||
}
|
||||
if err := c.MergePullRequest(context.Background(), "ukrrs", "MOPAC", pr.Number, gitea.MergeParams{Do: style}); err != nil {
|
||||
t.Fatalf("merge %q: %v", style, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
// Invalid style -> 422.
|
||||
c, srv := newClient(t)
|
||||
srv.AddRepo("ukrrs", "MOPAC", "main", "main", "feat/x")
|
||||
pr, _ := c.CreatePullRequest(context.Background(), "ukrrs", "MOPAC", gitea.PRParams{Title: "t", Base: "main", Head: "feat/x"})
|
||||
if err := c.MergePullRequest(context.Background(), "ukrrs", "MOPAC", pr.Number, gitea.MergeParams{Do: "blend"}); !errors.Is(err, gitea.ErrValidation) {
|
||||
t.Fatalf("err = %v, want ErrValidation", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user