mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Add API routes to lock and unlock issues (#34165)
This pull request adds a GitHub-compatible API endpoint to lock and
unlock an issue.
The following routes exist now:
- `PUT /api/v1/repos/{owner}/{repo}/issues/{id}/lock` to lock an issue
- `DELETE /api/v1/repos/{owner}/{repo}/issues/{id}/lock` to unlock an issue
Fixes #33677
Fixes #20012
---------
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
			
			
This commit is contained in:
		
							
								
								
									
										74
									
								
								tests/integration/api_issue_lock_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								tests/integration/api_issue_lock_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| // Copyright 2025 The Gitea Authors. All rights reserved. | ||||
| // SPDX-License-Identifier: MIT | ||||
|  | ||||
| package integration | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"testing" | ||||
|  | ||||
| 	auth_model "code.gitea.io/gitea/models/auth" | ||||
| 	issues_model "code.gitea.io/gitea/models/issues" | ||||
| 	repo_model "code.gitea.io/gitea/models/repo" | ||||
| 	"code.gitea.io/gitea/models/unittest" | ||||
| 	user_model "code.gitea.io/gitea/models/user" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/tests" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestAPILockIssue(t *testing.T) { | ||||
| 	defer tests.PrepareTestEnv(t)() | ||||
|  | ||||
| 	t.Run("Lock", func(t *testing.T) { | ||||
| 		issueBefore := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1}) | ||||
| 		assert.False(t, issueBefore.IsLocked) | ||||
| 		repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issueBefore.RepoID}) | ||||
| 		owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) | ||||
| 		urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/lock", owner.Name, repo.Name, issueBefore.Index) | ||||
|  | ||||
| 		session := loginUser(t, owner.Name) | ||||
| 		token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) | ||||
|  | ||||
| 		// check lock issue | ||||
| 		req := NewRequestWithJSON(t, "PUT", urlStr, api.LockIssueOption{Reason: "Spam"}).AddTokenAuth(token) | ||||
| 		MakeRequest(t, req, http.StatusNoContent) | ||||
| 		issueAfter := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1}) | ||||
| 		assert.True(t, issueAfter.IsLocked) | ||||
|  | ||||
| 		// check with other user | ||||
| 		user34 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 34}) | ||||
| 		session34 := loginUser(t, user34.Name) | ||||
| 		token34 := getTokenForLoggedInUser(t, session34, auth_model.AccessTokenScopeAll) | ||||
| 		req = NewRequestWithJSON(t, "PUT", urlStr, api.LockIssueOption{Reason: "Spam"}).AddTokenAuth(token34) | ||||
| 		MakeRequest(t, req, http.StatusForbidden) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("Unlock", func(t *testing.T) { | ||||
| 		issueBefore := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1}) | ||||
| 		repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issueBefore.RepoID}) | ||||
| 		owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) | ||||
| 		urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/lock", owner.Name, repo.Name, issueBefore.Index) | ||||
|  | ||||
| 		session := loginUser(t, owner.Name) | ||||
| 		token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue) | ||||
|  | ||||
| 		lockReq := NewRequestWithJSON(t, "PUT", urlStr, api.LockIssueOption{Reason: "Spam"}).AddTokenAuth(token) | ||||
| 		MakeRequest(t, lockReq, http.StatusNoContent) | ||||
|  | ||||
| 		// check unlock issue | ||||
| 		req := NewRequest(t, "DELETE", urlStr).AddTokenAuth(token) | ||||
| 		MakeRequest(t, req, http.StatusNoContent) | ||||
| 		issueAfter := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1}) | ||||
| 		assert.False(t, issueAfter.IsLocked) | ||||
|  | ||||
| 		// check with other user | ||||
| 		user34 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 34}) | ||||
| 		session34 := loginUser(t, user34.Name) | ||||
| 		token34 := getTokenForLoggedInUser(t, session34, auth_model.AccessTokenScopeAll) | ||||
| 		req = NewRequest(t, "DELETE", urlStr).AddTokenAuth(token34) | ||||
| 		MakeRequest(t, req, http.StatusForbidden) | ||||
| 	}) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user