2017-02-09 09:39:26 +03:00
// Copyright 2017 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 models
import (
2017-06-12 18:01:09 +03:00
"sort"
2017-02-09 09:39:26 +03:00
"testing"
2021-09-19 14:49:59 +03:00
"code.gitea.io/gitea/models/db"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2020-07-28 14:30:40 +03:00
"code.gitea.io/gitea/modules/setting"
2019-05-11 13:21:34 +03:00
api "code.gitea.io/gitea/modules/structs"
2019-08-15 17:46:21 +03:00
"code.gitea.io/gitea/modules/timeutil"
2017-02-09 09:39:26 +03:00
"github.com/stretchr/testify/assert"
2020-05-13 00:54:35 +03:00
"xorm.io/builder"
2017-02-09 09:39:26 +03:00
)
func TestMilestone_State ( t * testing . T ) {
assert . Equal ( t , api . StateOpen , ( & Milestone { IsClosed : false } ) . State ( ) )
assert . Equal ( t , api . StateClosed , ( & Milestone { IsClosed : true } ) . State ( ) )
}
func TestNewMilestone ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-09 09:39:26 +03:00
milestone := & Milestone {
RepoID : 1 ,
Name : "milestoneName" ,
Content : "milestoneContent" ,
}
assert . NoError ( t , NewMilestone ( milestone ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , milestone )
unittest . CheckConsistencyFor ( t , & Repository { ID : milestone . RepoID } , & Milestone { } )
2017-02-09 09:39:26 +03:00
}
func TestGetMilestoneByRepoID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-09 09:39:26 +03:00
milestone , err := GetMilestoneByRepoID ( 1 , 1 )
assert . NoError ( t , err )
assert . EqualValues ( t , 1 , milestone . ID )
assert . EqualValues ( t , 1 , milestone . RepoID )
2021-11-16 11:53:21 +03:00
_ , err = GetMilestoneByRepoID ( unittest . NonexistentID , unittest . NonexistentID )
2017-02-09 09:39:26 +03:00
assert . True ( t , IsErrMilestoneNotExist ( err ) )
}
func TestGetMilestonesByRepoID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2019-06-06 03:37:45 +03:00
test := func ( repoID int64 , state api . StateType ) {
2021-11-16 11:53:21 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : repoID } ) . ( * Repository )
2021-08-12 15:43:08 +03:00
milestones , _ , err := GetMilestones ( GetMilestonesOption {
2020-07-28 14:30:40 +03:00
RepoID : repo . ID ,
State : state ,
} )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , err )
2019-06-06 03:37:45 +03:00
var n int
switch state {
case api . StateClosed :
n = repo . NumClosedMilestones
case api . StateAll :
n = repo . NumMilestones
case api . StateOpen :
fallthrough
default :
n = repo . NumOpenMilestones
}
assert . Len ( t , milestones , n )
2017-02-09 09:39:26 +03:00
for _ , milestone := range milestones {
assert . EqualValues ( t , repoID , milestone . RepoID )
}
}
2019-06-06 03:37:45 +03:00
test ( 1 , api . StateOpen )
test ( 1 , api . StateAll )
test ( 1 , api . StateClosed )
test ( 2 , api . StateOpen )
test ( 2 , api . StateAll )
test ( 2 , api . StateClosed )
test ( 3 , api . StateOpen )
test ( 3 , api . StateClosed )
test ( 3 , api . StateAll )
2017-02-09 09:39:26 +03:00
2021-08-12 15:43:08 +03:00
milestones , _ , err := GetMilestones ( GetMilestonesOption {
2021-11-16 11:53:21 +03:00
RepoID : unittest . NonexistentID ,
2020-07-28 14:30:40 +03:00
State : api . StateOpen ,
} )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , err )
assert . Len ( t , milestones , 0 )
}
func TestGetMilestones ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-16 11:53:21 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : 1 } ) . ( * Repository )
2017-02-09 09:39:26 +03:00
test := func ( sortType string , sortCond func ( * Milestone ) int ) {
for _ , page := range [ ] int { 0 , 1 } {
2021-08-12 15:43:08 +03:00
milestones , _ , err := GetMilestones ( GetMilestonesOption {
2021-09-24 14:32:56 +03:00
ListOptions : db . ListOptions {
2020-07-28 14:30:40 +03:00
Page : page ,
PageSize : setting . UI . IssuePagingNum ,
} ,
RepoID : repo . ID ,
State : api . StateOpen ,
SortType : sortType ,
} )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , err )
assert . Len ( t , milestones , repo . NumMilestones - repo . NumClosedMilestones )
values := make ( [ ] int , len ( milestones ) )
for i , milestone := range milestones {
values [ i ] = sortCond ( milestone )
}
assert . True ( t , sort . IntsAreSorted ( values ) )
2021-08-12 15:43:08 +03:00
milestones , _ , err = GetMilestones ( GetMilestonesOption {
2021-09-24 14:32:56 +03:00
ListOptions : db . ListOptions {
2020-07-28 14:30:40 +03:00
Page : page ,
PageSize : setting . UI . IssuePagingNum ,
} ,
RepoID : repo . ID ,
State : api . StateClosed ,
Name : "" ,
SortType : sortType ,
} )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , err )
assert . Len ( t , milestones , repo . NumClosedMilestones )
values = make ( [ ] int , len ( milestones ) )
for i , milestone := range milestones {
values [ i ] = sortCond ( milestone )
}
assert . True ( t , sort . IntsAreSorted ( values ) )
}
}
test ( "furthestduedate" , func ( milestone * Milestone ) int {
return - int ( milestone . DeadlineUnix )
} )
test ( "leastcomplete" , func ( milestone * Milestone ) int {
return milestone . Completeness
} )
test ( "mostcomplete" , func ( milestone * Milestone ) int {
return - milestone . Completeness
} )
test ( "leastissues" , func ( milestone * Milestone ) int {
return milestone . NumIssues
} )
test ( "mostissues" , func ( milestone * Milestone ) int {
return - milestone . NumIssues
} )
test ( "soonestduedate" , func ( milestone * Milestone ) int {
return int ( milestone . DeadlineUnix )
} )
}
func TestUpdateMilestone ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-09 09:39:26 +03:00
2021-11-16 11:53:21 +03:00
milestone := unittest . AssertExistsAndLoadBean ( t , & Milestone { ID : 1 } ) . ( * Milestone )
2020-01-27 19:23:21 +03:00
milestone . Name = " newMilestoneName "
2017-02-09 09:39:26 +03:00
milestone . Content = "newMilestoneContent"
2020-01-29 09:36:32 +03:00
assert . NoError ( t , UpdateMilestone ( milestone , milestone . IsClosed ) )
2021-11-16 11:53:21 +03:00
milestone = unittest . AssertExistsAndLoadBean ( t , & Milestone { ID : 1 } ) . ( * Milestone )
2020-01-27 19:23:21 +03:00
assert . EqualValues ( t , "newMilestoneName" , milestone . Name )
2021-11-16 11:53:21 +03:00
unittest . CheckConsistencyFor ( t , & Milestone { } )
2017-02-09 09:39:26 +03:00
}
func TestCountRepoMilestones ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-09 09:39:26 +03:00
test := func ( repoID int64 ) {
2021-11-16 11:53:21 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : repoID } ) . ( * Repository )
2021-09-23 18:45:36 +03:00
count , err := countRepoMilestones ( db . GetEngine ( db . DefaultContext ) , repoID )
2017-12-18 17:06:51 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , repo . NumMilestones , count )
2017-02-09 09:39:26 +03:00
}
test ( 1 )
test ( 2 )
test ( 3 )
2017-12-18 17:06:51 +03:00
2021-11-16 11:53:21 +03:00
count , err := countRepoMilestones ( db . GetEngine ( db . DefaultContext ) , unittest . NonexistentID )
2017-12-18 17:06:51 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , 0 , count )
2017-02-09 09:39:26 +03:00
}
func TestCountRepoClosedMilestones ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-09 09:39:26 +03:00
test := func ( repoID int64 ) {
2021-11-16 11:53:21 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : repoID } ) . ( * Repository )
2017-12-18 17:06:51 +03:00
count , err := CountRepoClosedMilestones ( repoID )
assert . NoError ( t , err )
assert . EqualValues ( t , repo . NumClosedMilestones , count )
2017-02-09 09:39:26 +03:00
}
test ( 1 )
test ( 2 )
test ( 3 )
2017-12-18 17:06:51 +03:00
2021-11-16 11:53:21 +03:00
count , err := CountRepoClosedMilestones ( unittest . NonexistentID )
2017-12-18 17:06:51 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , 0 , count )
2017-02-09 09:39:26 +03:00
}
func TestChangeMilestoneStatus ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-16 11:53:21 +03:00
milestone := unittest . AssertExistsAndLoadBean ( t , & Milestone { ID : 1 } ) . ( * Milestone )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , ChangeMilestoneStatus ( milestone , true ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , & Milestone { ID : 1 } , "is_closed=1" )
unittest . CheckConsistencyFor ( t , & Repository { ID : milestone . RepoID } , & Milestone { } )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , ChangeMilestoneStatus ( milestone , false ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , & Milestone { ID : 1 } , "is_closed=0" )
unittest . CheckConsistencyFor ( t , & Repository { ID : milestone . RepoID } , & Milestone { } )
2017-02-09 09:39:26 +03:00
}
2021-06-21 21:34:58 +03:00
func TestUpdateMilestoneCounters ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-16 11:53:21 +03:00
issue := unittest . AssertExistsAndLoadBean ( t , & Issue { MilestoneID : 1 } ,
2017-02-09 09:39:26 +03:00
"is_closed=0" ) . ( * Issue )
issue . IsClosed = true
2019-08-15 17:46:21 +03:00
issue . ClosedUnix = timeutil . TimeStampNow ( )
2021-09-23 18:45:36 +03:00
_ , err := db . GetEngine ( db . DefaultContext ) . ID ( issue . ID ) . Cols ( "is_closed" , "closed_unix" ) . Update ( issue )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , err )
2021-09-23 18:45:36 +03:00
assert . NoError ( t , updateMilestoneCounters ( db . GetEngine ( db . DefaultContext ) , issue . MilestoneID ) )
2021-11-16 11:53:21 +03:00
unittest . CheckConsistencyFor ( t , & Milestone { } )
2017-02-09 09:39:26 +03:00
issue . IsClosed = false
2018-02-19 05:39:26 +03:00
issue . ClosedUnix = 0
2021-09-23 18:45:36 +03:00
_ , err = db . GetEngine ( db . DefaultContext ) . ID ( issue . ID ) . Cols ( "is_closed" , "closed_unix" ) . Update ( issue )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , err )
2021-09-23 18:45:36 +03:00
assert . NoError ( t , updateMilestoneCounters ( db . GetEngine ( db . DefaultContext ) , issue . MilestoneID ) )
2021-11-16 11:53:21 +03:00
unittest . CheckConsistencyFor ( t , & Milestone { } )
2017-02-09 09:39:26 +03:00
}
func TestChangeMilestoneAssign ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-16 11:53:21 +03:00
issue := unittest . AssertExistsAndLoadBean ( t , & Issue { RepoID : 1 } ) . ( * Issue )
2021-11-24 12:49:20 +03:00
doer := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } ) . ( * user_model . User )
2018-05-16 17:01:55 +03:00
assert . NotNil ( t , issue )
assert . NotNil ( t , doer )
2017-02-09 09:39:26 +03:00
oldMilestoneID := issue . MilestoneID
issue . MilestoneID = 2
assert . NoError ( t , ChangeMilestoneAssign ( issue , doer , oldMilestoneID ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , & Comment {
2017-02-09 09:39:26 +03:00
IssueID : issue . ID ,
Type : CommentTypeMilestone ,
MilestoneID : issue . MilestoneID ,
OldMilestoneID : oldMilestoneID ,
} )
2021-11-16 11:53:21 +03:00
unittest . CheckConsistencyFor ( t , & Milestone { } , & Issue { } )
2017-02-09 09:39:26 +03:00
}
func TestDeleteMilestoneByRepoID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-02-09 09:39:26 +03:00
assert . NoError ( t , DeleteMilestoneByRepoID ( 1 , 1 ) )
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , & Milestone { ID : 1 } )
unittest . CheckConsistencyFor ( t , & Repository { ID : 1 } )
2017-02-09 09:39:26 +03:00
2021-11-16 11:53:21 +03:00
assert . NoError ( t , DeleteMilestoneByRepoID ( unittest . NonexistentID , unittest . NonexistentID ) )
2017-02-09 09:39:26 +03:00
}
2018-04-29 08:58:47 +03:00
func TestMilestoneList_LoadTotalTrackedTimes ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2018-04-29 08:58:47 +03:00
miles := MilestoneList {
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , & Milestone { ID : 1 } ) . ( * Milestone ) ,
2018-04-29 08:58:47 +03:00
}
assert . NoError ( t , miles . LoadTotalTrackedTimes ( ) )
2019-12-27 23:30:58 +03:00
assert . Equal ( t , int64 ( 3682 ) , miles [ 0 ] . TotalTrackedTime )
2018-04-29 08:58:47 +03:00
}
2019-12-15 17:20:08 +03:00
func TestCountMilestonesByRepoIDs ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2019-12-15 17:20:08 +03:00
milestonesCount := func ( repoID int64 ) ( int , int ) {
2021-11-16 11:53:21 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : repoID } ) . ( * Repository )
2019-12-15 17:20:08 +03:00
return repo . NumOpenMilestones , repo . NumClosedMilestones
}
repo1OpenCount , repo1ClosedCount := milestonesCount ( 1 )
repo2OpenCount , repo2ClosedCount := milestonesCount ( 2 )
2020-05-13 00:54:35 +03:00
openCounts , err := CountMilestonesByRepoCond ( builder . In ( "repo_id" , [ ] int64 { 1 , 2 } ) , false )
2019-12-15 17:20:08 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , repo1OpenCount , openCounts [ 1 ] )
assert . EqualValues ( t , repo2OpenCount , openCounts [ 2 ] )
2020-05-13 00:54:35 +03:00
closedCounts , err := CountMilestonesByRepoCond ( builder . In ( "repo_id" , [ ] int64 { 1 , 2 } ) , true )
2019-12-15 17:20:08 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , repo1ClosedCount , closedCounts [ 1 ] )
assert . EqualValues ( t , repo2ClosedCount , closedCounts [ 2 ] )
}
func TestGetMilestonesByRepoIDs ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-16 11:53:21 +03:00
repo1 := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : 1 } ) . ( * Repository )
repo2 := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : 2 } ) . ( * Repository )
2019-12-15 17:20:08 +03:00
test := func ( sortType string , sortCond func ( * Milestone ) int ) {
for _ , page := range [ ] int { 0 , 1 } {
openMilestones , err := GetMilestonesByRepoIDs ( [ ] int64 { repo1 . ID , repo2 . ID } , page , false , sortType )
assert . NoError ( t , err )
assert . Len ( t , openMilestones , repo1 . NumOpenMilestones + repo2 . NumOpenMilestones )
values := make ( [ ] int , len ( openMilestones ) )
for i , milestone := range openMilestones {
values [ i ] = sortCond ( milestone )
}
assert . True ( t , sort . IntsAreSorted ( values ) )
closedMilestones , err := GetMilestonesByRepoIDs ( [ ] int64 { repo1 . ID , repo2 . ID } , page , true , sortType )
assert . NoError ( t , err )
assert . Len ( t , closedMilestones , repo1 . NumClosedMilestones + repo2 . NumClosedMilestones )
values = make ( [ ] int , len ( closedMilestones ) )
for i , milestone := range closedMilestones {
values [ i ] = sortCond ( milestone )
}
assert . True ( t , sort . IntsAreSorted ( values ) )
}
}
test ( "furthestduedate" , func ( milestone * Milestone ) int {
return - int ( milestone . DeadlineUnix )
} )
test ( "leastcomplete" , func ( milestone * Milestone ) int {
return milestone . Completeness
} )
test ( "mostcomplete" , func ( milestone * Milestone ) int {
return - milestone . Completeness
} )
test ( "leastissues" , func ( milestone * Milestone ) int {
return milestone . NumIssues
} )
test ( "mostissues" , func ( milestone * Milestone ) int {
return - milestone . NumIssues
} )
test ( "soonestduedate" , func ( milestone * Milestone ) int {
return int ( milestone . DeadlineUnix )
} )
}
func TestLoadTotalTrackedTime ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-11-16 11:53:21 +03:00
milestone := unittest . AssertExistsAndLoadBean ( t , & Milestone { ID : 1 } ) . ( * Milestone )
2019-12-15 17:20:08 +03:00
assert . NoError ( t , milestone . LoadTotalTrackedTime ( ) )
2019-12-27 23:30:58 +03:00
assert . Equal ( t , int64 ( 3682 ) , milestone . TotalTrackedTime )
2019-12-15 17:20:08 +03:00
}
func TestGetMilestonesStats ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2020-05-13 00:54:35 +03:00
test := func ( repoID int64 ) {
2021-11-16 11:53:21 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : repoID } ) . ( * Repository )
2020-05-13 00:54:35 +03:00
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 )
2021-11-16 11:53:21 +03:00
stats , err := GetMilestonesStatsByRepoCond ( builder . And ( builder . Eq { "repo_id" : unittest . NonexistentID } ) )
2020-05-13 00:54:35 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , 0 , stats . OpenCount )
assert . EqualValues ( t , 0 , stats . ClosedCount )
2021-11-16 11:53:21 +03:00
repo1 := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : 1 } ) . ( * Repository )
repo2 := unittest . AssertExistsAndLoadBean ( t , & Repository { ID : 2 } ) . ( * Repository )
2019-12-15 17:20:08 +03:00
2020-05-13 00:54:35 +03:00
milestoneStats , err := GetMilestonesStatsByRepoCond ( builder . In ( "repo_id" , [ ] int64 { repo1 . ID , repo2 . ID } ) )
2019-12-15 17:20:08 +03:00
assert . NoError ( t , err )
assert . EqualValues ( t , repo1 . NumOpenMilestones + repo2 . NumOpenMilestones , milestoneStats . OpenCount )
assert . EqualValues ( t , repo1 . NumClosedMilestones + repo2 . NumClosedMilestones , milestoneStats . ClosedCount )
}