[API] Extend times API (#9200)
Extensively extend the times API. close #8833; close #8513; close #8559tokarchuk/v1.17
parent
0bcf644da4
commit
f2d03cda96
@ -0,0 +1,109 @@ |
|||||||
|
// 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.
|
||||||
|
|
||||||
|
package integrations |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"net/http" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/models" |
||||||
|
api "code.gitea.io/gitea/modules/structs" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert" |
||||||
|
) |
||||||
|
|
||||||
|
func TestAPIGetTrackedTimes(t *testing.T) { |
||||||
|
defer prepareTestEnv(t)() |
||||||
|
|
||||||
|
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) |
||||||
|
issue2 := models.AssertExistsAndLoadBean(t, &models.Issue{ID: 2}).(*models.Issue) |
||||||
|
assert.NoError(t, issue2.LoadRepo()) |
||||||
|
|
||||||
|
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) |
||||||
|
expect, err := models.GetTrackedTimes(models.FindTrackedTimesOptions{IssueID: issue2.ID}) |
||||||
|
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) |
||||||
|
user, err := models.GetUserByID(time.UserID) |
||||||
|
assert.NoError(t, err) |
||||||
|
assert.Equal(t, user.Name, apiTimes[i].UserName) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestAPIDeleteTrackedTime(t *testing.T) { |
||||||
|
defer prepareTestEnv(t)() |
||||||
|
|
||||||
|
time6 := models.AssertExistsAndLoadBean(t, &models.TrackedTime{ID: 6}).(*models.TrackedTime) |
||||||
|
issue2 := models.AssertExistsAndLoadBean(t, &models.Issue{ID: 2}).(*models.Issue) |
||||||
|
assert.NoError(t, issue2.LoadRepo()) |
||||||
|
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) |
||||||
|
|
||||||
|
session := loginUser(t, user2.Name) |
||||||
|
token := getTokenForLoggedInUser(t, session) |
||||||
|
|
||||||
|
//Deletion not allowed
|
||||||
|
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) |
||||||
|
/* Delete own time <-- ToDo: timout without reason |
||||||
|
time3 := models.AssertExistsAndLoadBean(t, &models.TrackedTime{ID: 3}).(*models.TrackedTime) |
||||||
|
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) |
||||||
|
//Delete non existing time
|
||||||
|
session.MakeRequest(t, req, http.StatusInternalServerError) */ |
||||||
|
|
||||||
|
//Reset time of user 2 on issue 2
|
||||||
|
trackedSeconds, err := models.GetTrackedSeconds(models.FindTrackedTimesOptions{IssueID: 2, UserID: 2}) |
||||||
|
assert.NoError(t, err) |
||||||
|
assert.Equal(t, int64(3662), trackedSeconds) |
||||||
|
|
||||||
|
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) |
||||||
|
|
||||||
|
trackedSeconds, err = models.GetTrackedSeconds(models.FindTrackedTimesOptions{IssueID: 2, UserID: 2}) |
||||||
|
assert.NoError(t, err) |
||||||
|
assert.Equal(t, int64(0), trackedSeconds) |
||||||
|
} |
||||||
|
|
||||||
|
func TestAPIAddTrackedTimes(t *testing.T) { |
||||||
|
defer prepareTestEnv(t)() |
||||||
|
|
||||||
|
issue2 := models.AssertExistsAndLoadBean(t, &models.Issue{ID: 2}).(*models.Issue) |
||||||
|
assert.NoError(t, issue2.LoadRepo()) |
||||||
|
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) |
||||||
|
admin := models.AssertExistsAndLoadBean(t, &models.User{ID: 1}).(*models.User) |
||||||
|
|
||||||
|
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()) |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
// 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.
|
||||||
|
|
||||||
|
package migrations |
||||||
|
|
||||||
|
import ( |
||||||
|
"code.gitea.io/gitea/models" |
||||||
|
|
||||||
|
"xorm.io/xorm" |
||||||
|
) |
||||||
|
|
||||||
|
func extendTrackedTimes(x *xorm.Engine) error { |
||||||
|
sess := x.NewSession() |
||||||
|
defer sess.Close() |
||||||
|
|
||||||
|
if err := sess.Begin(); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
if _, err := sess.Exec("DELETE FROM tracked_time WHERE time IS NULL"); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
if err := sess.Sync2(new(models.TrackedTime)); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
return sess.Commit() |
||||||
|
} |
Loading…
Reference in new issue