code.gitea.io/gitea@v1.22.3/tests/integration/api_issue_label_test.go (about) 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "fmt" 8 "net/http" 9 "strings" 10 "testing" 11 12 auth_model "code.gitea.io/gitea/models/auth" 13 issues_model "code.gitea.io/gitea/models/issues" 14 repo_model "code.gitea.io/gitea/models/repo" 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 19 "github.com/stretchr/testify/assert" 20 ) 21 22 func TestAPIModifyLabels(t *testing.T) { 23 assert.NoError(t, unittest.LoadFixtures()) 24 25 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) 26 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 27 session := loginUser(t, owner.Name) 28 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) 29 urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/labels", owner.Name, repo.Name) 30 31 // CreateLabel 32 req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{ 33 Name: "TestL 1", 34 Color: "abcdef", 35 Description: "test label", 36 }).AddTokenAuth(token) 37 resp := MakeRequest(t, req, http.StatusCreated) 38 apiLabel := new(api.Label) 39 DecodeJSON(t, resp, &apiLabel) 40 dbLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: apiLabel.ID, RepoID: repo.ID}) 41 assert.EqualValues(t, dbLabel.Name, apiLabel.Name) 42 assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color) 43 44 req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{ 45 Name: "TestL 2", 46 Color: "#123456", 47 Description: "jet another test label", 48 }).AddTokenAuth(token) 49 MakeRequest(t, req, http.StatusCreated) 50 req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{ 51 Name: "WrongTestL", 52 Color: "#12345g", 53 }).AddTokenAuth(token) 54 MakeRequest(t, req, http.StatusUnprocessableEntity) 55 56 // ListLabels 57 req = NewRequest(t, "GET", urlStr). 58 AddTokenAuth(token) 59 resp = MakeRequest(t, req, http.StatusOK) 60 var apiLabels []*api.Label 61 DecodeJSON(t, resp, &apiLabels) 62 assert.Len(t, apiLabels, 2) 63 64 // GetLabel 65 singleURLStr := fmt.Sprintf("/api/v1/repos/%s/%s/labels/%d", owner.Name, repo.Name, dbLabel.ID) 66 req = NewRequest(t, "GET", singleURLStr). 67 AddTokenAuth(token) 68 resp = MakeRequest(t, req, http.StatusOK) 69 DecodeJSON(t, resp, &apiLabel) 70 assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color) 71 72 // EditLabel 73 newName := "LabelNewName" 74 newColor := "09876a" 75 newColorWrong := "09g76a" 76 req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{ 77 Name: &newName, 78 Color: &newColor, 79 }).AddTokenAuth(token) 80 resp = MakeRequest(t, req, http.StatusOK) 81 DecodeJSON(t, resp, &apiLabel) 82 assert.EqualValues(t, newColor, apiLabel.Color) 83 req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{ 84 Color: &newColorWrong, 85 }).AddTokenAuth(token) 86 MakeRequest(t, req, http.StatusUnprocessableEntity) 87 88 // DeleteLabel 89 req = NewRequest(t, "DELETE", singleURLStr). 90 AddTokenAuth(token) 91 MakeRequest(t, req, http.StatusNoContent) 92 } 93 94 func TestAPIAddIssueLabels(t *testing.T) { 95 assert.NoError(t, unittest.LoadFixtures()) 96 97 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 98 issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID}) 99 _ = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID, ID: 2}) 100 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 101 102 session := loginUser(t, owner.Name) 103 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) 104 urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", 105 repo.OwnerName, repo.Name, issue.Index) 106 req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{ 107 Labels: []any{1, 2}, 108 }).AddTokenAuth(token) 109 resp := MakeRequest(t, req, http.StatusOK) 110 var apiLabels []*api.Label 111 DecodeJSON(t, resp, &apiLabels) 112 assert.Len(t, apiLabels, unittest.GetCount(t, &issues_model.IssueLabel{IssueID: issue.ID})) 113 114 unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: 2}) 115 } 116 117 func TestAPIAddIssueLabelsWithLabelNames(t *testing.T) { 118 assert.NoError(t, unittest.LoadFixtures()) 119 120 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 121 issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID}) 122 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 123 124 session := loginUser(t, owner.Name) 125 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) 126 urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", 127 repo.OwnerName, repo.Name, issue.Index) 128 req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{ 129 Labels: []any{"label1", "label2"}, 130 }).AddTokenAuth(token) 131 resp := MakeRequest(t, req, http.StatusOK) 132 var apiLabels []*api.Label 133 DecodeJSON(t, resp, &apiLabels) 134 assert.Len(t, apiLabels, unittest.GetCount(t, &issues_model.IssueLabel{IssueID: issue.ID})) 135 136 var apiLabelNames []string 137 for _, label := range apiLabels { 138 apiLabelNames = append(apiLabelNames, label.Name) 139 } 140 assert.ElementsMatch(t, apiLabelNames, []string{"label1", "label2"}) 141 } 142 143 func TestAPIReplaceIssueLabels(t *testing.T) { 144 assert.NoError(t, unittest.LoadFixtures()) 145 146 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 147 issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID}) 148 label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID}) 149 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 150 151 session := loginUser(t, owner.Name) 152 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) 153 urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", 154 owner.Name, repo.Name, issue.Index) 155 req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{ 156 Labels: []any{label.ID}, 157 }).AddTokenAuth(token) 158 resp := MakeRequest(t, req, http.StatusOK) 159 var apiLabels []*api.Label 160 DecodeJSON(t, resp, &apiLabels) 161 if assert.Len(t, apiLabels, 1) { 162 assert.EqualValues(t, label.ID, apiLabels[0].ID) 163 } 164 165 unittest.AssertCount(t, &issues_model.IssueLabel{IssueID: issue.ID}, 1) 166 unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID}) 167 } 168 169 func TestAPIReplaceIssueLabelsWithLabelNames(t *testing.T) { 170 assert.NoError(t, unittest.LoadFixtures()) 171 172 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 173 issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID}) 174 label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID}) 175 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 176 177 session := loginUser(t, owner.Name) 178 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) 179 urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", 180 owner.Name, repo.Name, issue.Index) 181 req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{ 182 Labels: []any{label.Name}, 183 }).AddTokenAuth(token) 184 resp := MakeRequest(t, req, http.StatusOK) 185 var apiLabels []*api.Label 186 DecodeJSON(t, resp, &apiLabels) 187 if assert.Len(t, apiLabels, 1) { 188 assert.EqualValues(t, label.Name, apiLabels[0].Name) 189 } 190 } 191 192 func TestAPIModifyOrgLabels(t *testing.T) { 193 assert.NoError(t, unittest.LoadFixtures()) 194 195 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) 196 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 197 user := "user1" 198 session := loginUser(t, user) 199 token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization) 200 urlStr := fmt.Sprintf("/api/v1/orgs/%s/labels", owner.Name) 201 202 // CreateLabel 203 req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{ 204 Name: "TestL 1", 205 Color: "abcdef", 206 Description: "test label", 207 }).AddTokenAuth(token) 208 resp := MakeRequest(t, req, http.StatusCreated) 209 apiLabel := new(api.Label) 210 DecodeJSON(t, resp, &apiLabel) 211 dbLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: apiLabel.ID, OrgID: owner.ID}) 212 assert.EqualValues(t, dbLabel.Name, apiLabel.Name) 213 assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color) 214 215 req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{ 216 Name: "TestL 2", 217 Color: "#123456", 218 Description: "jet another test label", 219 }).AddTokenAuth(token) 220 MakeRequest(t, req, http.StatusCreated) 221 req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{ 222 Name: "WrongTestL", 223 Color: "#12345g", 224 }).AddTokenAuth(token) 225 MakeRequest(t, req, http.StatusUnprocessableEntity) 226 227 // ListLabels 228 req = NewRequest(t, "GET", urlStr). 229 AddTokenAuth(token) 230 resp = MakeRequest(t, req, http.StatusOK) 231 var apiLabels []*api.Label 232 DecodeJSON(t, resp, &apiLabels) 233 assert.Len(t, apiLabels, 4) 234 235 // GetLabel 236 singleURLStr := fmt.Sprintf("/api/v1/orgs/%s/labels/%d", owner.Name, dbLabel.ID) 237 req = NewRequest(t, "GET", singleURLStr). 238 AddTokenAuth(token) 239 resp = MakeRequest(t, req, http.StatusOK) 240 DecodeJSON(t, resp, &apiLabel) 241 assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color) 242 243 // EditLabel 244 newName := "LabelNewName" 245 newColor := "09876a" 246 newColorWrong := "09g76a" 247 req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{ 248 Name: &newName, 249 Color: &newColor, 250 }).AddTokenAuth(token) 251 resp = MakeRequest(t, req, http.StatusOK) 252 DecodeJSON(t, resp, &apiLabel) 253 assert.EqualValues(t, newColor, apiLabel.Color) 254 req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{ 255 Color: &newColorWrong, 256 }).AddTokenAuth(token) 257 MakeRequest(t, req, http.StatusUnprocessableEntity) 258 259 // DeleteLabel 260 req = NewRequest(t, "DELETE", singleURLStr). 261 AddTokenAuth(token) 262 MakeRequest(t, req, http.StatusNoContent) 263 }