@@ -5,12 +5,15 @@ package integration
5
5
6
6
import (
7
7
"net/http"
8
+ "net/http/httptest"
8
9
"net/url"
10
+ "path"
9
11
"strings"
10
12
"testing"
11
13
12
14
"code.gitea.io/gitea/models/db"
13
15
issues_model "code.gitea.io/gitea/models/issues"
16
+ repo_model "code.gitea.io/gitea/models/repo"
14
17
"code.gitea.io/gitea/models/unittest"
15
18
user_model "code.gitea.io/gitea/models/user"
16
19
"code.gitea.io/gitea/modules/git"
@@ -176,3 +179,82 @@ func TestPullView_CodeOwner(t *testing.T) {
176
179
})
177
180
})
178
181
}
182
+
183
+ func TestPullView_GivenApproveOrRejectReviewOnClosedPR (t * testing.T ) {
184
+ onGiteaRun (t , func (t * testing.T , giteaURL * url.URL ) {
185
+ user1Session := loginUser (t , "user1" )
186
+ user2Session := loginUser (t , "user2" )
187
+
188
+ // Have user1 create a fork of repo1.
189
+ testRepoFork (t , user1Session , "user2" , "repo1" , "user1" , "repo1" )
190
+
191
+ t .Run ("Submit approve/reject review on merged PR" , func (t * testing.T ) {
192
+ // Create a merged PR (made by user1) in the upstream repo1.
193
+ testEditFile (t , user1Session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n " )
194
+ resp := testPullCreate (t , user1Session , "user1" , "repo1" , false , "master" , "master" , "This is a pull title" )
195
+ elem := strings .Split (test .RedirectURL (resp ), "/" )
196
+ assert .EqualValues (t , "pulls" , elem [3 ])
197
+ testPullMerge (t , user1Session , elem [1 ], elem [2 ], elem [4 ], repo_model .MergeStyleMerge , false )
198
+
199
+ // Grab the CSRF token.
200
+ req := NewRequest (t , "GET" , path .Join (elem [1 ], elem [2 ], "pulls" , elem [4 ]))
201
+ resp = user2Session .MakeRequest (t , req , http .StatusOK )
202
+ htmlDoc := NewHTMLParser (t , resp .Body )
203
+
204
+ // Submit an approve review on the PR.
205
+ testSubmitReview (t , user2Session , htmlDoc .GetCSRF (), "user2" , "repo1" , elem [4 ], "approve" , http .StatusUnprocessableEntity )
206
+
207
+ // Submit a reject review on the PR.
208
+ testSubmitReview (t , user2Session , htmlDoc .GetCSRF (), "user2" , "repo1" , elem [4 ], "reject" , http .StatusUnprocessableEntity )
209
+ })
210
+
211
+ t .Run ("Submit approve/reject review on closed PR" , func (t * testing.T ) {
212
+ // Created a closed PR (made by user1) in the upstream repo1.
213
+ testEditFileToNewBranch (t , user1Session , "user1" , "repo1" , "master" , "a-test-branch" , "README.md" , "Hello, World (Editied...again)\n " )
214
+ resp := testPullCreate (t , user1Session , "user1" , "repo1" , false , "master" , "a-test-branch" , "This is a pull title" )
215
+ elem := strings .Split (test .RedirectURL (resp ), "/" )
216
+ assert .EqualValues (t , "pulls" , elem [3 ])
217
+ testIssueClose (t , user1Session , elem [1 ], elem [2 ], elem [4 ])
218
+
219
+ // Grab the CSRF token.
220
+ req := NewRequest (t , "GET" , path .Join (elem [1 ], elem [2 ], "pulls" , elem [4 ]))
221
+ resp = user2Session .MakeRequest (t , req , http .StatusOK )
222
+ htmlDoc := NewHTMLParser (t , resp .Body )
223
+
224
+ // Submit an approve review on the PR.
225
+ testSubmitReview (t , user2Session , htmlDoc .GetCSRF (), "user2" , "repo1" , elem [4 ], "approve" , http .StatusUnprocessableEntity )
226
+
227
+ // Submit a reject review on the PR.
228
+ testSubmitReview (t , user2Session , htmlDoc .GetCSRF (), "user2" , "repo1" , elem [4 ], "reject" , http .StatusUnprocessableEntity )
229
+ })
230
+ })
231
+ }
232
+
233
+ func testSubmitReview (t * testing.T , session * TestSession , csrf , owner , repo , pullNumber , reviewType string , expectedSubmitStatus int ) * httptest.ResponseRecorder {
234
+ options := map [string ]string {
235
+ "_csrf" : csrf ,
236
+ "commit_id" : "" ,
237
+ "content" : "test" ,
238
+ "type" : reviewType ,
239
+ }
240
+
241
+ submitURL := path .Join (owner , repo , "pulls" , pullNumber , "files" , "reviews" , "submit" )
242
+ req := NewRequestWithValues (t , "POST" , submitURL , options )
243
+ return session .MakeRequest (t , req , expectedSubmitStatus )
244
+ }
245
+
246
+ func testIssueClose (t * testing.T , session * TestSession , owner , repo , issueNumber string ) * httptest.ResponseRecorder {
247
+ req := NewRequest (t , "GET" , path .Join (owner , repo , "pulls" , issueNumber ))
248
+ resp := session .MakeRequest (t , req , http .StatusOK )
249
+
250
+ htmlDoc := NewHTMLParser (t , resp .Body )
251
+ closeURL := path .Join (owner , repo , "issues" , issueNumber , "comments" )
252
+
253
+ options := map [string ]string {
254
+ "_csrf" : htmlDoc .GetCSRF (),
255
+ "status" : "close" ,
256
+ }
257
+
258
+ req = NewRequestWithValues (t , "POST" , closeURL , options )
259
+ return session .MakeRequest (t , req , http .StatusOK )
260
+ }
0 commit comments