@@ -12,6 +12,7 @@ import (
1212 auth_model "code.gitea.io/gitea/models/auth"
1313 "code.gitea.io/gitea/models/db"
1414 issues_model "code.gitea.io/gitea/models/issues"
15+ "code.gitea.io/gitea/models/perm"
1516 repo_model "code.gitea.io/gitea/models/repo"
1617 "code.gitea.io/gitea/models/unittest"
1718 user_model "code.gitea.io/gitea/models/user"
@@ -126,6 +127,65 @@ func TestAPICreatePullSuccess(t *testing.T) {
126127 MakeRequest (t , req , http .StatusUnprocessableEntity ) // second request should fail
127128}
128129
130+ func TestAPICreatePullBasePermission (t * testing.T ) {
131+ defer tests .PrepareTestEnv (t )()
132+ repo10 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : 10 })
133+ // repo10 have code, pulls units.
134+ repo11 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : 11 })
135+ // repo11 only have code unit but should still create pulls
136+ owner10 := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : repo10 .OwnerID })
137+ user4 := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : 4 })
138+
139+ session := loginUser (t , user4 .Name )
140+ token := getTokenForLoggedInUser (t , session , auth_model .AccessTokenScopeWriteRepository )
141+ opts := & api.CreatePullRequestOption {
142+ Head : fmt .Sprintf ("%s:master" , repo11 .OwnerName ),
143+ Base : "master" ,
144+ Title : "create a failure pr" ,
145+ }
146+ req := NewRequestWithJSON (t , http .MethodPost , fmt .Sprintf ("/api/v1/repos/%s/%s/pulls" , owner10 .Name , repo10 .Name ), & opts ).AddTokenAuth (token )
147+ MakeRequest (t , req , http .StatusForbidden )
148+
149+ // add user4 to be a collaborator to base repo
150+ ctx := NewAPITestContext (t , repo10 .OwnerName , repo10 .Name , auth_model .AccessTokenScopeWriteRepository )
151+ t .Run ("AddUser4AsCollaborator" , doAPIAddCollaborator (ctx , user4 .Name , perm .AccessModeRead ))
152+
153+ // create again
154+ req = NewRequestWithJSON (t , http .MethodPost , fmt .Sprintf ("/api/v1/repos/%s/%s/pulls" , owner10 .Name , repo10 .Name ), & opts ).AddTokenAuth (token )
155+ MakeRequest (t , req , http .StatusCreated )
156+ }
157+
158+ func TestAPICreatePullHeadPermission (t * testing.T ) {
159+ defer tests .PrepareTestEnv (t )()
160+ repo10 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : 10 })
161+ // repo10 have code, pulls units.
162+ repo11 := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : 11 })
163+ // repo11 only have code unit but should still create pulls
164+ owner10 := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : repo10 .OwnerID })
165+ user4 := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : 4 })
166+
167+ session := loginUser (t , user4 .Name )
168+ token := getTokenForLoggedInUser (t , session , auth_model .AccessTokenScopeWriteRepository )
169+ opts := & api.CreatePullRequestOption {
170+ Head : fmt .Sprintf ("%s:master" , repo11 .OwnerName ),
171+ Base : "master" ,
172+ Title : "create a failure pr" ,
173+ }
174+ req := NewRequestWithJSON (t , http .MethodPost , fmt .Sprintf ("/api/v1/repos/%s/%s/pulls" , owner10 .Name , repo10 .Name ), & opts ).AddTokenAuth (token )
175+ MakeRequest (t , req , http .StatusForbidden )
176+
177+ // add user4 to be a collaborator to head repo with read permission
178+ ctx := NewAPITestContext (t , repo11 .OwnerName , repo11 .Name , auth_model .AccessTokenScopeWriteRepository )
179+ t .Run ("AddUser4AsCollaboratorWithRead" , doAPIAddCollaborator (ctx , user4 .Name , perm .AccessModeRead ))
180+ req = NewRequestWithJSON (t , http .MethodPost , fmt .Sprintf ("/api/v1/repos/%s/%s/pulls" , owner10 .Name , repo10 .Name ), & opts ).AddTokenAuth (token )
181+ MakeRequest (t , req , http .StatusForbidden )
182+
183+ // add user4 to be a collaborator to head repo with write permission
184+ t .Run ("AddUser4AsCollaboratorWithWrite" , doAPIAddCollaborator (ctx , user4 .Name , perm .AccessModeWrite ))
185+ req = NewRequestWithJSON (t , http .MethodPost , fmt .Sprintf ("/api/v1/repos/%s/%s/pulls" , owner10 .Name , repo10 .Name ), & opts ).AddTokenAuth (token )
186+ MakeRequest (t , req , http .StatusCreated )
187+ }
188+
129189func TestAPICreatePullSameRepoSuccess (t * testing.T ) {
130190 defer tests .PrepareTestEnv (t )()
131191 repo := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : 1 })
0 commit comments