Skip to content

Commit 34281bc

Browse files
lunnysilverwind
andauthored
Fix bug webhook milestone is not right. (#34419)
Fix #34400 --------- Co-authored-by: silverwind <[email protected]>
1 parent 780e92e commit 34281bc

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.APIErrorInternal(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.APIErrorInternal(err)
900909
return

routers/api/v1/repo/pull.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,11 @@ func EditPullRequest(ctx *context.APIContext) {
706706
issue.MilestoneID != form.Milestone {
707707
oldMilestoneID := issue.MilestoneID
708708
issue.MilestoneID = form.Milestone
709+
issue.Milestone, err = issues_model.GetMilestoneByRepoID(ctx, ctx.Repo.Repository.ID, form.Milestone)
710+
if err != nil {
711+
ctx.APIErrorInternal(err)
712+
return
713+
}
709714
if err = issue_service.ChangeMilestoneAssign(ctx, issue, ctx.Doer, oldMilestoneID); err != nil {
710715
ctx.APIErrorInternal(err)
711716
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
@@ -184,6 +184,15 @@ func testIssueAddComment(t *testing.T, session *TestSession, issueURL, content,
184184
return int64(id)
185185
}
186186

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

tests/integration/repo_webhook_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,78 @@ func Test_WebhookIssue(t *testing.T) {
404404
})
405405
}
406406

407+
func Test_WebhookIssueMilestone(t *testing.T) {
408+
var payloads []api.IssuePayload
409+
var triggeredEvent string
410+
provider := newMockWebhookProvider(func(r *http.Request) {
411+
content, _ := io.ReadAll(r.Body)
412+
var payload api.IssuePayload
413+
err := json.Unmarshal(content, &payload)
414+
assert.NoError(t, err)
415+
payloads = append(payloads, payload)
416+
triggeredEvent = "issues"
417+
}, http.StatusOK)
418+
defer provider.Close()
419+
420+
onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
421+
// create a new webhook with special webhook for repo1
422+
session := loginUser(t, "user2")
423+
repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1})
424+
testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "issue_milestone")
425+
426+
t.Run("assign a milestone", func(t *testing.T) {
427+
// trigger the webhook
428+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 1)
429+
430+
// validate the webhook is triggered
431+
assert.Equal(t, "issues", triggeredEvent)
432+
assert.Len(t, payloads, 1)
433+
assert.Equal(t, "milestoned", string(payloads[0].Action))
434+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
435+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
436+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
437+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
438+
assert.EqualValues(t, 1, payloads[0].Issue.Milestone.ID)
439+
})
440+
441+
t.Run("change a milestong", func(t *testing.T) {
442+
// trigger the webhook again
443+
triggeredEvent = ""
444+
payloads = make([]api.IssuePayload, 0, 1)
445+
// change milestone to 2
446+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 2)
447+
448+
// validate the webhook is triggered
449+
assert.Equal(t, "issues", triggeredEvent)
450+
assert.Len(t, payloads, 1)
451+
assert.Equal(t, "milestoned", string(payloads[0].Action))
452+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
453+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
454+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
455+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
456+
assert.EqualValues(t, 2, payloads[0].Issue.Milestone.ID)
457+
})
458+
459+
t.Run("remove a milestone", func(t *testing.T) {
460+
// trigger the webhook again
461+
triggeredEvent = ""
462+
payloads = make([]api.IssuePayload, 0, 1)
463+
// change milestone to 0
464+
testIssueChangeMilestone(t, session, repo1.Link(), 1, 0)
465+
466+
// validate the webhook is triggered
467+
assert.Equal(t, "issues", triggeredEvent)
468+
assert.Len(t, payloads, 1)
469+
assert.Equal(t, "demilestoned", string(payloads[0].Action))
470+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
471+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
472+
assert.Equal(t, "issue1", payloads[0].Issue.Title)
473+
assert.Equal(t, "content for the first issue", payloads[0].Issue.Body)
474+
assert.Nil(t, payloads[0].Issue.Milestone)
475+
})
476+
})
477+
}
478+
407479
func Test_WebhookPullRequest(t *testing.T) {
408480
var payloads []api.PullRequestPayload
409481
var triggeredEvent string

0 commit comments

Comments
 (0)