Refactor Milestone related (#11225)

This commit is contained in:
6543
2020-05-12 23:54:35 +02:00
committed by GitHub
parent ba40263fdd
commit 7257c39ddf
7 changed files with 316 additions and 320 deletions

File diff suppressed because it is too large Load Diff

View File

@ -7,13 +7,12 @@ package models
import (
"sort"
"testing"
"time"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil"
"xorm.io/builder"
"github.com/stretchr/testify/assert"
"xorm.io/builder"
)
func TestMilestone_State(t *testing.T) {
@ -21,28 +20,6 @@ func TestMilestone_State(t *testing.T) {
assert.Equal(t, api.StateClosed, (&Milestone{IsClosed: true}).State())
}
func TestMilestone_APIFormat(t *testing.T) {
milestone := &Milestone{
ID: 3,
RepoID: 4,
Name: "milestoneName",
Content: "milestoneContent",
IsClosed: false,
NumOpenIssues: 5,
NumClosedIssues: 6,
DeadlineUnix: timeutil.TimeStamp(time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC).Unix()),
}
assert.Equal(t, api.Milestone{
ID: milestone.ID,
State: api.StateOpen,
Title: milestone.Name,
Description: milestone.Content,
OpenIssues: milestone.NumOpenIssues,
ClosedIssues: milestone.NumClosedIssues,
Deadline: milestone.DeadlineUnix.AsTimePtr(),
}, *milestone.APIFormat())
}
func TestNewMilestone(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
milestone := &Milestone{
@ -201,25 +178,6 @@ func TestCountRepoClosedMilestones(t *testing.T) {
assert.EqualValues(t, 0, count)
}
func TestMilestoneStats(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
test := func(repoID int64) {
repo := AssertExistsAndLoadBean(t, &Repository{ID: repoID}).(*Repository)
open, closed, err := MilestoneStats(repoID)
assert.NoError(t, err)
assert.EqualValues(t, repo.NumMilestones-repo.NumClosedMilestones, open)
assert.EqualValues(t, repo.NumClosedMilestones, closed)
}
test(1)
test(2)
test(3)
open, closed, err := MilestoneStats(NonexistentID)
assert.NoError(t, err)
assert.EqualValues(t, 0, open)
assert.EqualValues(t, 0, closed)
}
func TestChangeMilestoneStatus(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
milestone := AssertExistsAndLoadBean(t, &Milestone{ID: 1}).(*Milestone)
@ -301,12 +259,12 @@ func TestCountMilestonesByRepoIDs(t *testing.T) {
repo1OpenCount, repo1ClosedCount := milestonesCount(1)
repo2OpenCount, repo2ClosedCount := milestonesCount(2)
openCounts, err := CountMilestonesByRepoIDs([]int64{1, 2}, false)
openCounts, err := CountMilestonesByRepoCond(builder.In("repo_id", []int64{1, 2}), false)
assert.NoError(t, err)
assert.EqualValues(t, repo1OpenCount, openCounts[1])
assert.EqualValues(t, repo2OpenCount, openCounts[2])
closedCounts, err := CountMilestonesByRepoIDs([]int64{1, 2}, true)
closedCounts, err := CountMilestonesByRepoCond(builder.In("repo_id", []int64{1, 2}), true)
assert.NoError(t, err)
assert.EqualValues(t, repo1ClosedCount, closedCounts[1])
assert.EqualValues(t, repo2ClosedCount, closedCounts[2])
@ -368,10 +326,27 @@ func TestLoadTotalTrackedTime(t *testing.T) {
func TestGetMilestonesStats(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
test := func(repoID int64) {
repo := AssertExistsAndLoadBean(t, &Repository{ID: repoID}).(*Repository)
stats, err := GetMilestonesStatsByRepoCond(builder.And(builder.Eq{"repo_id": repoID}))
assert.NoError(t, err)
assert.EqualValues(t, repo.NumMilestones-repo.NumClosedMilestones, stats.OpenCount)
assert.EqualValues(t, repo.NumClosedMilestones, stats.ClosedCount)
}
test(1)
test(2)
test(3)
stats, err := GetMilestonesStatsByRepoCond(builder.And(builder.Eq{"repo_id": NonexistentID}))
assert.NoError(t, err)
assert.EqualValues(t, 0, stats.OpenCount)
assert.EqualValues(t, 0, stats.ClosedCount)
repo1 := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository)
repo2 := AssertExistsAndLoadBean(t, &Repository{ID: 2}).(*Repository)
milestoneStats, err := GetMilestonesStats(builder.In("repo_id", []int64{repo1.ID, repo2.ID}))
milestoneStats, err := GetMilestonesStatsByRepoCond(builder.In("repo_id", []int64{repo1.ID, repo2.ID}))
assert.NoError(t, err)
assert.EqualValues(t, repo1.NumOpenMilestones+repo2.NumOpenMilestones, milestoneStats.OpenCount)
assert.EqualValues(t, repo1.NumClosedMilestones+repo2.NumClosedMilestones, milestoneStats.ClosedCount)

View File

@ -56,7 +56,7 @@ func ToAPIIssue(issue *models.Issue) *api.Issue {
return &api.Issue{}
}
if issue.Milestone != nil {
apiIssue.Milestone = issue.Milestone.APIFormat()
apiIssue.Milestone = ToAPIMilestone(issue.Milestone)
}
if err := issue.LoadAssignees(); err != nil {
@ -141,3 +141,22 @@ func ToLabelList(labels []*models.Label) []*api.Label {
}
return result
}
// ToAPIMilestone converts Milestone into API Format
func ToAPIMilestone(m *models.Milestone) *api.Milestone {
apiMilestone := &api.Milestone{
ID: m.ID,
State: m.State(),
Title: m.Name,
Description: m.Content,
OpenIssues: m.NumOpenIssues,
ClosedIssues: m.NumClosedIssues,
}
if m.IsClosed {
apiMilestone.Closed = m.ClosedDateUnix.AsTimePtr()
}
if m.DeadlineUnix.Year() < 9999 {
apiMilestone.Deadline = m.DeadlineUnix.AsTimePtr()
}
return apiMilestone
}

View File

@ -6,9 +6,11 @@ package convert
import (
"testing"
"time"
"code.gitea.io/gitea/models"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil"
"github.com/stretchr/testify/assert"
)
@ -22,3 +24,25 @@ func TestLabel_ToLabel(t *testing.T) {
Color: "abcdef",
}, ToLabel(label))
}
func TestMilestone_APIFormat(t *testing.T) {
milestone := &models.Milestone{
ID: 3,
RepoID: 4,
Name: "milestoneName",
Content: "milestoneContent",
IsClosed: false,
NumOpenIssues: 5,
NumClosedIssues: 6,
DeadlineUnix: timeutil.TimeStamp(time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC).Unix()),
}
assert.Equal(t, api.Milestone{
ID: milestone.ID,
State: api.StateOpen,
Title: milestone.Name,
Description: milestone.Content,
OpenIssues: milestone.NumOpenIssues,
ClosedIssues: milestone.NumClosedIssues,
Deadline: milestone.DeadlineUnix.AsTimePtr(),
}, *ToAPIMilestone(milestone))
}

View File

@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/routers/api/v1/utils"
@ -58,7 +59,7 @@ func ListMilestones(ctx *context.APIContext) {
apiMilestones := make([]*api.Milestone, len(milestones))
for i := range milestones {
apiMilestones[i] = milestones[i].APIFormat()
apiMilestones[i] = convert.ToAPIMilestone(milestones[i])
}
ctx.JSON(http.StatusOK, &apiMilestones)
}
@ -100,7 +101,7 @@ func GetMilestone(ctx *context.APIContext) {
}
return
}
ctx.JSON(http.StatusOK, milestone.APIFormat())
ctx.JSON(http.StatusOK, convert.ToAPIMilestone(milestone))
}
// CreateMilestone create a milestone for a repository
@ -147,7 +148,7 @@ func CreateMilestone(ctx *context.APIContext, form api.CreateMilestoneOption) {
ctx.Error(http.StatusInternalServerError, "NewMilestone", err)
return
}
ctx.JSON(http.StatusCreated, milestone.APIFormat())
ctx.JSON(http.StatusCreated, convert.ToAPIMilestone(milestone))
}
// EditMilestone modify a milestone for a repository
@ -213,7 +214,7 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) {
ctx.ServerError("UpdateMilestone", err)
return
}
ctx.JSON(http.StatusOK, milestone.APIFormat())
ctx.JSON(http.StatusOK, convert.ToAPIMilestone(milestone))
}
// DeleteMilestone delete a milestone for a repository

View File

@ -15,6 +15,8 @@ import (
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util"
"xorm.io/builder"
)
const (
@ -30,13 +32,13 @@ func Milestones(ctx *context.Context) {
ctx.Data["PageIsMilestones"] = true
isShowClosed := ctx.Query("state") == "closed"
openCount, closedCount, err := models.MilestoneStats(ctx.Repo.Repository.ID)
stats, err := models.GetMilestonesStatsByRepoCond(builder.And(builder.Eq{"id": ctx.Repo.Repository.ID}))
if err != nil {
ctx.ServerError("MilestoneStats", err)
return
}
ctx.Data["OpenCount"] = openCount
ctx.Data["ClosedCount"] = closedCount
ctx.Data["OpenCount"] = stats.OpenCount
ctx.Data["ClosedCount"] = stats.ClosedCount
sortType := ctx.Query("sort")
page := ctx.QueryInt("page")
@ -46,9 +48,9 @@ func Milestones(ctx *context.Context) {
var total int
if !isShowClosed {
total = int(openCount)
total = int(stats.OpenCount)
} else {
total = int(closedCount)
total = int(stats.ClosedCount)
}
miles, err := models.GetMilestones(ctx.Repo.Repository.ID, page, isShowClosed, sortType)

View File

@ -224,7 +224,7 @@ func Milestones(ctx *context.Context) {
}
}
counts, err := models.CountMilestones(userRepoCond, isShowClosed)
counts, err := models.CountMilestonesByRepoCond(userRepoCond, isShowClosed)
if err != nil {
ctx.ServerError("CountMilestonesByRepoIDs", err)
return
@ -267,7 +267,7 @@ func Milestones(ctx *context.Context) {
i++
}
milestoneStats, err := models.GetMilestonesStats(repoCond)
milestoneStats, err := models.GetMilestonesStatsByRepoCond(repoCond)
if err != nil {
ctx.ServerError("GetMilestoneStats", err)
return
@ -277,7 +277,7 @@ func Milestones(ctx *context.Context) {
if len(repoIDs) == 0 {
totalMilestoneStats = milestoneStats
} else {
totalMilestoneStats, err = models.GetMilestonesStats(userRepoCond)
totalMilestoneStats, err = models.GetMilestonesStatsByRepoCond(userRepoCond)
if err != nil {
ctx.ServerError("GetMilestoneStats", err)
return