2019-12-27 23:30:58 +03:00
// Copyright 2019 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.
2022-09-02 22:18:23 +03:00
package integration
2019-12-27 23:30:58 +03:00
import (
"fmt"
"net/http"
"testing"
"time"
2022-04-08 12:11:15 +03:00
"code.gitea.io/gitea/models/db"
2022-06-13 12:37:59 +03:00
issues_model "code.gitea.io/gitea/models/issues"
2021-11-16 11:53:21 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2019-12-27 23:30:58 +03:00
api "code.gitea.io/gitea/modules/structs"
2022-09-02 22:18:23 +03:00
"code.gitea.io/gitea/tests"
2019-12-27 23:30:58 +03:00
"github.com/stretchr/testify/assert"
)
func TestAPIGetTrackedTimes ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2019-12-27 23:30:58 +03:00
2022-08-16 05:22:25 +03:00
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
issue2 := unittest . AssertExistsAndLoadBean ( t , & issues_model . Issue { ID : 2 } )
2022-04-08 12:11:15 +03:00
assert . NoError ( t , issue2 . LoadRepo ( db . DefaultContext ) )
2019-12-27 23:30:58 +03:00
session := loginUser ( t , user2 . Name )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/issues/%d/times?token=%s" , user2 . Name , issue2 . Repo . Name , issue2 . Index , token )
resp := session . MakeRequest ( t , req , http . StatusOK )
var apiTimes api . TrackedTimeList
DecodeJSON ( t , resp , & apiTimes )
2022-06-13 12:37:59 +03:00
expect , err := issues_model . GetTrackedTimes ( db . DefaultContext , & issues_model . FindTrackedTimesOptions { IssueID : issue2 . ID } )
2019-12-27 23:30:58 +03:00
assert . NoError ( t , err )
assert . Len ( t , apiTimes , 3 )
for i , time := range expect {
assert . Equal ( t , time . ID , apiTimes [ i ] . ID )
assert . EqualValues ( t , issue2 . Title , apiTimes [ i ] . Issue . Title )
assert . EqualValues ( t , issue2 . ID , apiTimes [ i ] . IssueID )
assert . Equal ( t , time . Created . Unix ( ) , apiTimes [ i ] . Created . Unix ( ) )
assert . Equal ( t , time . Time , apiTimes [ i ] . Time )
2021-11-24 12:49:20 +03:00
user , err := user_model . GetUserByID ( time . UserID )
2019-12-27 23:30:58 +03:00
assert . NoError ( t , err )
assert . Equal ( t , user . Name , apiTimes [ i ] . UserName )
}
2020-01-09 00:14:00 +03:00
// test filter
2022-01-20 20:46:10 +03:00
since := "2000-01-01T00%3A00%3A02%2B00%3A00" // 946684802
before := "2000-01-01T00%3A00%3A12%2B00%3A00" // 946684812
2020-01-09 00:14:00 +03:00
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/issues/%d/times?since=%s&before=%s&token=%s" , user2 . Name , issue2 . Repo . Name , issue2 . Index , since , before , token )
resp = session . MakeRequest ( t , req , http . StatusOK )
var filterAPITimes api . TrackedTimeList
DecodeJSON ( t , resp , & filterAPITimes )
assert . Len ( t , filterAPITimes , 2 )
assert . Equal ( t , int64 ( 3 ) , filterAPITimes [ 0 ] . ID )
assert . Equal ( t , int64 ( 6 ) , filterAPITimes [ 1 ] . ID )
2019-12-27 23:30:58 +03:00
}
func TestAPIDeleteTrackedTime ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2019-12-27 23:30:58 +03:00
2022-08-16 05:22:25 +03:00
time6 := unittest . AssertExistsAndLoadBean ( t , & issues_model . TrackedTime { ID : 6 } )
issue2 := unittest . AssertExistsAndLoadBean ( t , & issues_model . Issue { ID : 2 } )
2022-04-08 12:11:15 +03:00
assert . NoError ( t , issue2 . LoadRepo ( db . DefaultContext ) )
2022-08-16 05:22:25 +03:00
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
2019-12-27 23:30:58 +03:00
session := loginUser ( t , user2 . Name )
token := getTokenForLoggedInUser ( t , session )
2022-01-20 20:46:10 +03:00
// Deletion not allowed
2019-12-27 23:30:58 +03:00
req := NewRequestf ( t , "DELETE" , "/api/v1/repos/%s/%s/issues/%d/times/%d?token=%s" , user2 . Name , issue2 . Repo . Name , issue2 . Index , time6 . ID , token )
session . MakeRequest ( t , req , http . StatusForbidden )
2020-05-09 17:18:44 +03:00
2022-08-16 05:22:25 +03:00
time3 := unittest . AssertExistsAndLoadBean ( t , & issues_model . TrackedTime { ID : 3 } )
2019-12-27 23:30:58 +03:00
req = NewRequestf ( t , "DELETE" , "/api/v1/repos/%s/%s/issues/%d/times/%d?token=%s" , user2 . Name , issue2 . Repo . Name , issue2 . Index , time3 . ID , token )
session . MakeRequest ( t , req , http . StatusNoContent )
2022-01-20 20:46:10 +03:00
// Delete non existing time
2020-05-09 17:18:44 +03:00
session . MakeRequest ( t , req , http . StatusNotFound )
2019-12-27 23:30:58 +03:00
2022-01-20 20:46:10 +03:00
// Reset time of user 2 on issue 2
2022-06-13 12:37:59 +03:00
trackedSeconds , err := issues_model . GetTrackedSeconds ( db . DefaultContext , issues_model . FindTrackedTimesOptions { IssueID : 2 , UserID : 2 } )
2019-12-27 23:30:58 +03:00
assert . NoError ( t , err )
2020-05-09 17:18:44 +03:00
assert . Equal ( t , int64 ( 3661 ) , trackedSeconds )
2019-12-27 23:30:58 +03:00
req = NewRequestf ( t , "DELETE" , "/api/v1/repos/%s/%s/issues/%d/times?token=%s" , user2 . Name , issue2 . Repo . Name , issue2 . Index , token )
session . MakeRequest ( t , req , http . StatusNoContent )
session . MakeRequest ( t , req , http . StatusNotFound )
2022-06-13 12:37:59 +03:00
trackedSeconds , err = issues_model . GetTrackedSeconds ( db . DefaultContext , issues_model . FindTrackedTimesOptions { IssueID : 2 , UserID : 2 } )
2019-12-27 23:30:58 +03:00
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 0 ) , trackedSeconds )
}
func TestAPIAddTrackedTimes ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2019-12-27 23:30:58 +03:00
2022-08-16 05:22:25 +03:00
issue2 := unittest . AssertExistsAndLoadBean ( t , & issues_model . Issue { ID : 2 } )
2022-04-08 12:11:15 +03:00
assert . NoError ( t , issue2 . LoadRepo ( db . DefaultContext ) )
2022-08-16 05:22:25 +03:00
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
admin := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 1 } )
2019-12-27 23:30:58 +03:00
session := loginUser ( t , admin . Name )
token := getTokenForLoggedInUser ( t , session )
urlStr := fmt . Sprintf ( "/api/v1/repos/%s/%s/issues/%d/times?token=%s" , user2 . Name , issue2 . Repo . Name , issue2 . Index , token )
req := NewRequestWithJSON ( t , "POST" , urlStr , & api . AddTimeOption {
Time : 33 ,
User : user2 . Name ,
Created : time . Unix ( 947688818 , 0 ) ,
} )
resp := session . MakeRequest ( t , req , http . StatusOK )
var apiNewTime api . TrackedTime
DecodeJSON ( t , resp , & apiNewTime )
assert . EqualValues ( t , 33 , apiNewTime . Time )
assert . EqualValues ( t , user2 . ID , apiNewTime . UserID )
assert . EqualValues ( t , 947688818 , apiNewTime . Created . Unix ( ) )
}