* Fix milestone API state parameter unhandled * Fix testtags/v1.10.5
// Copyright 2020 The Gitea Authors. All rights reserved. | |||||
// Use of this source code is governed by a MIT-style | |||||
// license that can be found in the LICENSE file. | |||||
package integrations | |||||
import ( | |||||
"fmt" | |||||
"net/http" | |||||
"testing" | |||||
"code.gitea.io/gitea/models" | |||||
"code.gitea.io/gitea/modules/structs" | |||||
"github.com/stretchr/testify/assert" | |||||
) | |||||
func TestAPIIssuesMilestone(t *testing.T) { | |||||
defer prepareTestEnv(t)() | |||||
milestone := models.AssertExistsAndLoadBean(t, &models.Milestone{ID: 1}).(*models.Milestone) | |||||
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: milestone.RepoID}).(*models.Repository) | |||||
owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) | |||||
assert.Equal(t, int64(1), int64(milestone.NumIssues)) | |||||
assert.Equal(t, structs.StateOpen, milestone.State()) | |||||
session := loginUser(t, owner.Name) | |||||
token := getTokenForLoggedInUser(t, session) | |||||
// update values of issue | |||||
milestoneState := "closed" | |||||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/milestones/%d?token=%s", owner.Name, repo.Name, milestone.ID, token) | |||||
req := NewRequestWithJSON(t, "PATCH", urlStr, structs.EditMilestoneOption{ | |||||
State: &milestoneState, | |||||
}) | |||||
resp := session.MakeRequest(t, req, http.StatusOK) | |||||
var apiMilestone structs.Milestone | |||||
DecodeJSON(t, resp, &apiMilestone) | |||||
assert.EqualValues(t, "closed", apiMilestone.State) | |||||
req = NewRequest(t, "GET", urlStr) | |||||
resp = session.MakeRequest(t, req, http.StatusOK) | |||||
var apiMilestone2 structs.Milestone | |||||
DecodeJSON(t, resp, &apiMilestone2) | |||||
assert.EqualValues(t, "closed", apiMilestone2.State) | |||||
} |
} | } | ||||
// UpdateMilestone updates information of given milestone. | // UpdateMilestone updates information of given milestone. | ||||
func UpdateMilestone(m *Milestone) error { | |||||
if err := updateMilestone(x, m); err != nil { | |||||
func UpdateMilestone(m *Milestone, oldIsClosed bool) error { | |||||
sess := x.NewSession() | |||||
defer sess.Close() | |||||
if err := sess.Begin(); err != nil { | |||||
return err | |||||
} | |||||
if m.IsClosed && !oldIsClosed { | |||||
m.ClosedDateUnix = timeutil.TimeStampNow() | |||||
} | |||||
if err := updateMilestone(sess, m); err != nil { | |||||
return err | return err | ||||
} | } | ||||
return updateMilestoneCompleteness(x, m.ID) | |||||
if err := updateMilestoneCompleteness(sess, m.ID); err != nil { | |||||
return err | |||||
} | |||||
// if IsClosed changed, update milestone numbers of repository | |||||
if oldIsClosed != m.IsClosed { | |||||
if err := updateRepoMilestoneNum(sess, m.RepoID); err != nil { | |||||
return err | |||||
} | |||||
} | |||||
return sess.Commit() | |||||
} | } | ||||
func updateMilestoneCompleteness(e Engine, milestoneID int64) error { | func updateMilestoneCompleteness(e Engine, milestoneID int64) error { |
milestone := AssertExistsAndLoadBean(t, &Milestone{ID: 1}).(*Milestone) | milestone := AssertExistsAndLoadBean(t, &Milestone{ID: 1}).(*Milestone) | ||||
milestone.Name = " newMilestoneName " | milestone.Name = " newMilestoneName " | ||||
milestone.Content = "newMilestoneContent" | milestone.Content = "newMilestoneContent" | ||||
assert.NoError(t, UpdateMilestone(milestone)) | |||||
assert.NoError(t, UpdateMilestone(milestone, milestone.IsClosed)) | |||||
milestone = AssertExistsAndLoadBean(t, &Milestone{ID: 1}).(*Milestone) | milestone = AssertExistsAndLoadBean(t, &Milestone{ID: 1}).(*Milestone) | ||||
assert.EqualValues(t, "newMilestoneName", milestone.Name) | assert.EqualValues(t, "newMilestoneName", milestone.Name) | ||||
CheckConsistencyFor(t, &Milestone{}) | CheckConsistencyFor(t, &Milestone{}) |
milestone.DeadlineUnix = timeutil.TimeStamp(form.Deadline.Unix()) | milestone.DeadlineUnix = timeutil.TimeStamp(form.Deadline.Unix()) | ||||
} | } | ||||
if err := models.UpdateMilestone(milestone); err != nil { | |||||
var oldIsClosed = milestone.IsClosed | |||||
if form.State != nil { | |||||
milestone.IsClosed = *form.State == string(api.StateClosed) | |||||
} | |||||
if err := models.UpdateMilestone(milestone, oldIsClosed); err != nil { | |||||
ctx.ServerError("UpdateMilestone", err) | ctx.ServerError("UpdateMilestone", err) | ||||
return | return | ||||
} | } |
m.Name = form.Title | m.Name = form.Title | ||||
m.Content = form.Content | m.Content = form.Content | ||||
m.DeadlineUnix = timeutil.TimeStamp(deadline.Unix()) | m.DeadlineUnix = timeutil.TimeStamp(deadline.Unix()) | ||||
if err = models.UpdateMilestone(m); err != nil { | |||||
if err = models.UpdateMilestone(m, m.IsClosed); err != nil { | |||||
ctx.ServerError("UpdateMilestone", err) | ctx.ServerError("UpdateMilestone", err) | ||||
return | return | ||||
} | } |