@@ -12,6 +12,7 @@ import (
12
12
auth_model "code.gitea.io/gitea/models/auth"
13
13
"code.gitea.io/gitea/models/db"
14
14
issues_model "code.gitea.io/gitea/models/issues"
15
+ "code.gitea.io/gitea/models/perm"
15
16
repo_model "code.gitea.io/gitea/models/repo"
16
17
"code.gitea.io/gitea/models/unittest"
17
18
user_model "code.gitea.io/gitea/models/user"
@@ -126,6 +127,65 @@ func TestAPICreatePullSuccess(t *testing.T) {
126
127
MakeRequest (t , req , http .StatusUnprocessableEntity ) // second request should fail
127
128
}
128
129
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
+
129
189
func TestAPICreatePullSameRepoSuccess (t * testing.T ) {
130
190
defer tests .PrepareTestEnv (t )()
131
191
repo := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : 1 })
0 commit comments