code.gitea.io/gitea@v1.22.3/tests/integration/api_issue_tracked_time_test.go (about) 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "fmt" 8 "net/http" 9 "testing" 10 "time" 11 12 auth_model "code.gitea.io/gitea/models/auth" 13 "code.gitea.io/gitea/models/db" 14 issues_model "code.gitea.io/gitea/models/issues" 15 "code.gitea.io/gitea/models/unittest" 16 user_model "code.gitea.io/gitea/models/user" 17 api "code.gitea.io/gitea/modules/structs" 18 "code.gitea.io/gitea/tests" 19 20 "github.com/stretchr/testify/assert" 21 ) 22 23 func TestAPIGetTrackedTimes(t *testing.T) { 24 defer tests.PrepareTestEnv(t)() 25 26 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 27 issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) 28 assert.NoError(t, issue2.LoadRepo(db.DefaultContext)) 29 30 session := loginUser(t, user2.Name) 31 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue) 32 33 req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/%d/times", user2.Name, issue2.Repo.Name, issue2.Index). 34 AddTokenAuth(token) 35 resp := MakeRequest(t, req, http.StatusOK) 36 var apiTimes api.TrackedTimeList 37 DecodeJSON(t, resp, &apiTimes) 38 expect, err := issues_model.GetTrackedTimes(db.DefaultContext, &issues_model.FindTrackedTimesOptions{IssueID: issue2.ID}) 39 assert.NoError(t, err) 40 assert.Len(t, apiTimes, 3) 41 42 for i, time := range expect { 43 assert.Equal(t, time.ID, apiTimes[i].ID) 44 assert.EqualValues(t, issue2.Title, apiTimes[i].Issue.Title) 45 assert.EqualValues(t, issue2.ID, apiTimes[i].IssueID) 46 assert.Equal(t, time.Created.Unix(), apiTimes[i].Created.Unix()) 47 assert.Equal(t, time.Time, apiTimes[i].Time) 48 user, err := user_model.GetUserByID(db.DefaultContext, time.UserID) 49 assert.NoError(t, err) 50 assert.Equal(t, user.Name, apiTimes[i].UserName) 51 } 52 53 // test filter 54 since := "2000-01-01T00%3A00%3A02%2B00%3A00" // 946684802 55 before := "2000-01-01T00%3A00%3A12%2B00%3A00" // 946684812 56 57 req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/%d/times?since=%s&before=%s", user2.Name, issue2.Repo.Name, issue2.Index, since, before). 58 AddTokenAuth(token) 59 resp = MakeRequest(t, req, http.StatusOK) 60 var filterAPITimes api.TrackedTimeList 61 DecodeJSON(t, resp, &filterAPITimes) 62 assert.Len(t, filterAPITimes, 2) 63 assert.Equal(t, int64(3), filterAPITimes[0].ID) 64 assert.Equal(t, int64(6), filterAPITimes[1].ID) 65 } 66 67 func TestAPIDeleteTrackedTime(t *testing.T) { 68 defer tests.PrepareTestEnv(t)() 69 70 time6 := unittest.AssertExistsAndLoadBean(t, &issues_model.TrackedTime{ID: 6}) 71 issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) 72 assert.NoError(t, issue2.LoadRepo(db.DefaultContext)) 73 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 74 75 session := loginUser(t, user2.Name) 76 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) 77 78 // Deletion not allowed 79 req := NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/issues/%d/times/%d", user2.Name, issue2.Repo.Name, issue2.Index, time6.ID). 80 AddTokenAuth(token) 81 MakeRequest(t, req, http.StatusForbidden) 82 83 time3 := unittest.AssertExistsAndLoadBean(t, &issues_model.TrackedTime{ID: 3}) 84 req = NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/issues/%d/times/%d", user2.Name, issue2.Repo.Name, issue2.Index, time3.ID). 85 AddTokenAuth(token) 86 MakeRequest(t, req, http.StatusNoContent) 87 // Delete non existing time 88 MakeRequest(t, req, http.StatusNotFound) 89 90 // Reset time of user 2 on issue 2 91 trackedSeconds, err := issues_model.GetTrackedSeconds(db.DefaultContext, issues_model.FindTrackedTimesOptions{IssueID: 2, UserID: 2}) 92 assert.NoError(t, err) 93 assert.Equal(t, int64(3661), trackedSeconds) 94 95 req = NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/issues/%d/times", user2.Name, issue2.Repo.Name, issue2.Index). 96 AddTokenAuth(token) 97 MakeRequest(t, req, http.StatusNoContent) 98 MakeRequest(t, req, http.StatusNotFound) 99 100 trackedSeconds, err = issues_model.GetTrackedSeconds(db.DefaultContext, issues_model.FindTrackedTimesOptions{IssueID: 2, UserID: 2}) 101 assert.NoError(t, err) 102 assert.Equal(t, int64(0), trackedSeconds) 103 } 104 105 func TestAPIAddTrackedTimes(t *testing.T) { 106 defer tests.PrepareTestEnv(t)() 107 108 issue2 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2}) 109 assert.NoError(t, issue2.LoadRepo(db.DefaultContext)) 110 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 111 admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) 112 113 session := loginUser(t, admin.Name) 114 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) 115 116 urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/times", user2.Name, issue2.Repo.Name, issue2.Index) 117 118 req := NewRequestWithJSON(t, "POST", urlStr, &api.AddTimeOption{ 119 Time: 33, 120 User: user2.Name, 121 Created: time.Unix(947688818, 0), 122 }).AddTokenAuth(token) 123 resp := MakeRequest(t, req, http.StatusOK) 124 var apiNewTime api.TrackedTime 125 DecodeJSON(t, resp, &apiNewTime) 126 127 assert.EqualValues(t, 33, apiNewTime.Time) 128 assert.EqualValues(t, user2.ID, apiNewTime.UserID) 129 assert.EqualValues(t, 947688818, apiNewTime.Created.Unix()) 130 }