Skip to content

Commit ec146b4

Browse files
GiteaBotlunnysilverwind
authored
Fix bug webhook milestone is not right. (#34419) (#34429)
Backport #34419 by @lunny Fix #34400 --------- Co-authored-by: Lunny Xiao <[email protected]> Co-authored-by: silverwind <[email protected]>
1 parent 51fa86f commit ec146b4

File tree

5 files changed

+105
-0
lines changed

5 files changed

+105
-0
lines changed

routers/api/v1/repo/issue.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,15 @@ func EditIssue(ctx *context.APIContext) {
895895
issue.MilestoneID != *form.Milestone {
896896
oldMilestoneID := issue.MilestoneID
897897
issue.MilestoneID = *form.Milestone
898+
if issue.MilestoneID > 0 {
899+
issue.Milestone, err = issues_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, *form.Milestone)
900+
if err != nil {
901+
ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err)
902+
return
903+
}
904+
} else {
905+
issue.Milestone = nil
906+
}
898907
if err = issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
899908
ctx.Error(http.StatusInternalServerError, "ChangeMilestoneAssign", err)
900909
return

routers/api/v1/repo/pull.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,11 @@ func EditPullRequest(ctx *context.APIContext) {
694694
issue.MilestoneID != form.Milestone {
695695
oldMilestoneID := issue.MilestoneID
696696
issue.MilestoneID = form.Milestone
697+
issue.Milestone, err = issues_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, form.Milestone)
698+
if err != nil {
699+
ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err)
700+
return
701+
}
697702
if err = issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
698703
ctx.Error(http.StatusInternalServerError, "ChangeMilestoneAssign", err)
699704
return

routers/web/repo/issue.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,16 @@ func UpdateIssueMilestone(ctx *context.Context) {
418418
continue
419419
}
420420
issue.MilestoneID = milestoneID
421+
if milestoneID > 0 {
422+
var err error
423+
issue.Milestone, err = issues_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, milestoneID)
424+
if err != nil {
425+
ctx.ServerError("GetMilestoneByRepoID", err)
426+
return
427+
}
428+
} else {
429+
issue.Milestone = nil
430+
}
421431
if err := issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
422432
ctx.ServerError("ChangeMilestoneAssign", err)
423433
return

tests/integration/issue_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,15 @@ func testIssueAddComment(t *testing.T, session *TestSession, issueURL, content,
185185
return int64(id)
186186
}
187187

188+
func testIssueChangeMilestone(t *testing.T, session *TestSession, repoLink string, issueID, milestoneID int64) {
189+
req := NewRequestWithValues(t, "POST", fmt.Sprintf(repoLink+"/issues/milestone?issue_ids=%d", issueID), map[string]string{
190+
"_csrf": GetUserCSRFToken(t, session),
191+
"id": strconv.FormatInt(milestoneID, 10),
192+
})
193+
resp := session.MakeRequest(t, req, http.StatusOK)
194+
assert.Equal(t, `{"ok":true}`, strings.TrimSpace(resp.Body.String()))
195+
}
196+
188197
func TestNewIssue(t *testing.T) {
189198
defer tests.PrepareTestEnv(t)()
190199
session := loginUser(t, "user2")

tests/integration/repo_webhook_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,78 @@ func Test_WebhookIssue(t *testing.T) {
353353
})
354354
}
355355

356+
func Test_WebhookIssueMilestone(t *testing.T) {
357+
var payloads []api.IssuePayload
358+
var triggeredEvent string
359+
provider := newMockWebhookProvider(func(r *http.Request) {
360+
content, _ := io.ReadAll(r.Body)
361+
var payload api.IssuePayload
362+
err := json.Unmarshal(content, &payload)
363+
assert.NoError(t, err)
364+
payloads = append(payloads, payload)
365+
triggeredEvent = "issues"
366+
}, http.StatusOK)
367+
defer provider.Close()
368+
369+
onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
370+
// create a new webhook with special webhook for repo1
371+
session := loginUser(t, "user2")
372+
repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1})
373+
testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "issue_milestone")
374+
375+
t.Run("assign a milestone", func(t *testing.T) {
376+
// trigger the webhook
377+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 1)
378+
379+
// validate the webhook is triggered
380+
assert.Equal(t, "issues", triggeredEvent)
381+
assert.Len(t, payloads, 1)
382+
assert.Equal(t, "milestoned", string(payloads[0].Action))
383+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
384+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
385+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
386+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
387+
assert.EqualValues(t, 1, payloads[0].Issue.Milestone.ID)
388+
})
389+
390+
t.Run("change a milestong", func(t *testing.T) {
391+
// trigger the webhook again
392+
triggeredEvent = ""
393+
payloads = make([]api.IssuePayload, 0, 1)
394+
// change milestone to 2
395+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 2)
396+
397+
// validate the webhook is triggered
398+
assert.Equal(t, "issues", triggeredEvent)
399+
assert.Len(t, payloads, 1)
400+
assert.Equal(t, "milestoned", string(payloads[0].Action))
401+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
402+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
403+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
404+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
405+
assert.EqualValues(t, 2, payloads[0].Issue.Milestone.ID)
406+
})
407+
408+
t.Run("remove a milestone", func(t *testing.T) {
409+
// trigger the webhook again
410+
triggeredEvent = ""
411+
payloads = make([]api.IssuePayload, 0, 1)
412+
// change milestone to 0
413+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 0)
414+
415+
// validate the webhook is triggered
416+
assert.Equal(t, "issues", triggeredEvent)
417+
assert.Len(t, payloads, 1)
418+
assert.Equal(t, "demilestoned", string(payloads[0].Action))
419+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
420+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
421+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
422+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
423+
assert.Nil(t, payloads[0].Issue.Milestone)
424+
})
425+
})
426+
}
427+
356428
func Test_WebhookPullRequest(t *testing.T) {
357429
var payloads []api.PullRequestPayload
358430
var triggeredEvent string

0 commit comments

Comments
 (0)