loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: validate input for default_{merge,update}_style (#7395)

- Add `binding:"In(...)"` to the `default_merge_style` and `default_update_style` fields to only accept recognized merge and update styles.
- Resolves https://codeberg.org/forgejo/forgejo/issues/7389
- Added integration test for the API (`binding` works in the exact same way for the API and web routes).

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7395
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-committed-by: Gusted <postmaster@gusted.xyz>

authored by

Gusted
Gusted
and committed by
0ko
4b56c05e 114cd6d4

+248 -216
+3 -3
modules/structs/repo.go
··· 224 224 AllowRebaseUpdate *bool `json:"allow_rebase_update,omitempty"` 225 225 // set to `true` to delete pr branch after merge by default 226 226 DefaultDeleteBranchAfterMerge *bool `json:"default_delete_branch_after_merge,omitempty"` 227 - // set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", "squash", or "fast-forward-only". 228 - DefaultMergeStyle *string `json:"default_merge_style,omitempty"` 227 + // set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", "squash", "fast-forward-only", "manually-merged", or "rebase-update-only". 228 + DefaultMergeStyle *string `json:"default_merge_style,omitempty" binding:"In(merge,rebase,rebase-merge,squash,fast-forward-only,manually-merged,rebase-update-only)"` 229 229 // set to a update style to be used by this repository: "rebase" or "merge" 230 - DefaultUpdateStyle *string `json:"default_update_style,omitempty"` 230 + DefaultUpdateStyle *string `json:"default_update_style,omitempty" binding:"In(merge,rebase)"` 231 231 // set to `true` to allow edits from maintainers by default 232 232 DefaultAllowMaintainerEdit *bool `json:"default_allow_maintainer_edit,omitempty"` 233 233 // set to `true` to archive this repository.
+4
routers/web/repo/setting/setting.go
··· 105 105 106 106 func UnitsPost(ctx *context.Context) { 107 107 form := web.GetForm(ctx).(*forms.RepoUnitSettingForm) 108 + if ctx.HasError() { 109 + ctx.Redirect(ctx.Repo.Repository.Link() + "/settings/units") 110 + return 111 + } 108 112 109 113 repo := ctx.Repo.Repository 110 114
+2 -2
services/forms/repo_form.go
··· 188 188 PullsAllowSquash bool 189 189 PullsAllowFastForwardOnly bool 190 190 PullsAllowManualMerge bool 191 - PullsDefaultMergeStyle string 192 - PullsDefaultUpdateStyle string 191 + PullsDefaultMergeStyle string `binding:"In(merge,rebase,rebase-merge,squash,fast-forward-only,manually-merged,rebase-update-only)"` 192 + PullsDefaultUpdateStyle string `binding:"In(merge,rebase)"` 193 193 EnableAutodetectManualMerge bool 194 194 PullsAllowRebaseUpdate bool 195 195 DefaultDeleteBranchAfterMerge bool
+1 -1
templates/swagger/v1_json.tmpl
··· 23762 23762 "x-go-name": "DefaultDeleteBranchAfterMerge" 23763 23763 }, 23764 23764 "default_merge_style": { 23765 - "description": "set to a merge style to be used by this repository: \"merge\", \"rebase\", \"rebase-merge\", \"squash\", or \"fast-forward-only\".", 23765 + "description": "set to a merge style to be used by this repository: \"merge\", \"rebase\", \"rebase-merge\", \"squash\", \"fast-forward-only\", \"manually-merged\", or \"rebase-update-only\".", 23766 23766 "type": "string", 23767 23767 "x-go-name": "DefaultMergeStyle" 23768 23768 },
+238 -210
tests/integration/api_repo_edit_test.go
··· 6 6 import ( 7 7 "fmt" 8 8 "net/http" 9 - "net/url" 10 9 "testing" 11 10 12 11 auth_model "forgejo.org/models/auth" ··· 16 15 "forgejo.org/models/unittest" 17 16 user_model "forgejo.org/models/user" 18 17 api "forgejo.org/modules/structs" 18 + "forgejo.org/tests" 19 19 20 20 "github.com/stretchr/testify/assert" 21 21 ) ··· 137 137 } 138 138 139 139 func TestAPIRepoEdit(t *testing.T) { 140 - onGiteaRun(t, func(t *testing.T, u *url.URL) { 141 - bFalse, bTrue := false, true 140 + defer tests.PrepareTestEnv(t)() 141 + bFalse, bTrue := false, true 142 142 143 - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo1 & repo16 144 - org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of the repo3, is an org 145 - user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // owner of neither repos 146 - repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) // public repo 147 - repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) // public repo 148 - repo15 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15}) // empty repo 149 - repo16 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) // private repo 143 + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo1 & repo16 144 + org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of the repo3, is an org 145 + user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // owner of neither repos 146 + repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) // public repo 147 + repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) // public repo 148 + repo15 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15}) // empty repo 149 + repo16 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) // private repo 150 150 151 - // Get user2's token 152 - session := loginUser(t, user2.Name) 153 - token2 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) 154 - // Get user4's token 155 - session = loginUser(t, user4.Name) 156 - token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) 151 + // Get user2's token 152 + session := loginUser(t, user2.Name) 153 + token2 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) 154 + // Get user4's token 155 + session = loginUser(t, user4.Name) 156 + token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) 157 157 158 - // Test editing a repo1 which user2 owns, changing name and many properties 159 - origRepoEditOption := getRepoEditOptionFromRepo(repo1) 160 - repoEditOption := getNewRepoEditOption(origRepoEditOption) 161 - req := NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption). 162 - AddTokenAuth(token2) 163 - resp := MakeRequest(t, req, http.StatusOK) 164 - var repo api.Repository 165 - DecodeJSON(t, resp, &repo) 166 - assert.NotNil(t, repo) 167 - // check response 168 - assert.Equal(t, *repoEditOption.Name, repo.Name) 169 - assert.Equal(t, *repoEditOption.Description, repo.Description) 170 - assert.Equal(t, *repoEditOption.Website, repo.Website) 171 - assert.Equal(t, *repoEditOption.Archived, repo.Archived) 172 - // check repo1 from database 173 - repo1edited := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 174 - repo1editedOption := getRepoEditOptionFromRepo(repo1edited) 175 - assert.Equal(t, *repoEditOption.Name, *repo1editedOption.Name) 176 - assert.Equal(t, *repoEditOption.Description, *repo1editedOption.Description) 177 - assert.Equal(t, *repoEditOption.Website, *repo1editedOption.Website) 178 - assert.Equal(t, *repoEditOption.Archived, *repo1editedOption.Archived) 179 - assert.Equal(t, *repoEditOption.Private, *repo1editedOption.Private) 180 - assert.Equal(t, *repoEditOption.HasWiki, *repo1editedOption.HasWiki) 158 + // Test editing a repo1 which user2 owns, changing name and many properties 159 + origRepoEditOption := getRepoEditOptionFromRepo(repo1) 160 + repoEditOption := getNewRepoEditOption(origRepoEditOption) 161 + req := NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption). 162 + AddTokenAuth(token2) 163 + resp := MakeRequest(t, req, http.StatusOK) 164 + var repo api.Repository 165 + DecodeJSON(t, resp, &repo) 166 + assert.NotNil(t, repo) 167 + // check response 168 + assert.Equal(t, *repoEditOption.Name, repo.Name) 169 + assert.Equal(t, *repoEditOption.Description, repo.Description) 170 + assert.Equal(t, *repoEditOption.Website, repo.Website) 171 + assert.Equal(t, *repoEditOption.Archived, repo.Archived) 172 + // check repo1 from database 173 + repo1edited := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 174 + repo1editedOption := getRepoEditOptionFromRepo(repo1edited) 175 + assert.Equal(t, *repoEditOption.Name, *repo1editedOption.Name) 176 + assert.Equal(t, *repoEditOption.Description, *repo1editedOption.Description) 177 + assert.Equal(t, *repoEditOption.Website, *repo1editedOption.Website) 178 + assert.Equal(t, *repoEditOption.Archived, *repo1editedOption.Archived) 179 + assert.Equal(t, *repoEditOption.Private, *repo1editedOption.Private) 180 + assert.Equal(t, *repoEditOption.HasWiki, *repo1editedOption.HasWiki) 181 181 182 - // Test editing repo1 to use internal issue and wiki (default) 183 - *repoEditOption.HasIssues = true 184 - repoEditOption.ExternalTracker = nil 185 - repoEditOption.InternalTracker = &api.InternalTracker{ 186 - EnableTimeTracker: false, 187 - AllowOnlyContributorsToTrackTime: false, 188 - EnableIssueDependencies: false, 189 - } 190 - *repoEditOption.HasWiki = true 191 - repoEditOption.ExternalWiki = nil 192 - url := fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name) 193 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 194 - AddTokenAuth(token2) 195 - resp = MakeRequest(t, req, http.StatusOK) 196 - DecodeJSON(t, resp, &repo) 197 - assert.NotNil(t, repo) 198 - // check repo1 was written to database 199 - repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 200 - repo1editedOption = getRepoEditOptionFromRepo(repo1edited) 201 - assert.True(t, *repo1editedOption.HasIssues) 202 - assert.Nil(t, repo1editedOption.ExternalTracker) 203 - assert.Equal(t, *repo1editedOption.InternalTracker, *repoEditOption.InternalTracker) 204 - assert.True(t, *repo1editedOption.HasWiki) 205 - assert.Nil(t, repo1editedOption.ExternalWiki) 182 + // Test editing repo1 to use internal issue and wiki (default) 183 + *repoEditOption.HasIssues = true 184 + repoEditOption.ExternalTracker = nil 185 + repoEditOption.InternalTracker = &api.InternalTracker{ 186 + EnableTimeTracker: false, 187 + AllowOnlyContributorsToTrackTime: false, 188 + EnableIssueDependencies: false, 189 + } 190 + *repoEditOption.HasWiki = true 191 + repoEditOption.ExternalWiki = nil 192 + url := fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name) 193 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 194 + AddTokenAuth(token2) 195 + resp = MakeRequest(t, req, http.StatusOK) 196 + DecodeJSON(t, resp, &repo) 197 + assert.NotNil(t, repo) 198 + // check repo1 was written to database 199 + repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 200 + repo1editedOption = getRepoEditOptionFromRepo(repo1edited) 201 + assert.True(t, *repo1editedOption.HasIssues) 202 + assert.Nil(t, repo1editedOption.ExternalTracker) 203 + assert.Equal(t, *repo1editedOption.InternalTracker, *repoEditOption.InternalTracker) 204 + assert.True(t, *repo1editedOption.HasWiki) 205 + assert.Nil(t, repo1editedOption.ExternalWiki) 206 206 207 - // Test editing repo1 to use external issue and wiki 208 - repoEditOption.ExternalTracker = &api.ExternalTracker{ 209 - ExternalTrackerURL: "http://www.somewebsite.com", 210 - ExternalTrackerFormat: "http://www.somewebsite.com/{user}/{repo}?issue={index}", 211 - ExternalTrackerStyle: "alphanumeric", 212 - } 213 - repoEditOption.ExternalWiki = &api.ExternalWiki{ 214 - ExternalWikiURL: "http://www.somewebsite.com", 215 - } 216 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 217 - AddTokenAuth(token2) 218 - resp = MakeRequest(t, req, http.StatusOK) 219 - DecodeJSON(t, resp, &repo) 220 - assert.NotNil(t, repo) 221 - // check repo1 was written to database 222 - repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 223 - repo1editedOption = getRepoEditOptionFromRepo(repo1edited) 224 - assert.True(t, *repo1editedOption.HasIssues) 225 - assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker) 226 - assert.True(t, *repo1editedOption.HasWiki) 227 - assert.Equal(t, *repo1editedOption.ExternalWiki, *repoEditOption.ExternalWiki) 207 + // Test editing repo1 to use external issue and wiki 208 + repoEditOption.ExternalTracker = &api.ExternalTracker{ 209 + ExternalTrackerURL: "http://www.somewebsite.com", 210 + ExternalTrackerFormat: "http://www.somewebsite.com/{user}/{repo}?issue={index}", 211 + ExternalTrackerStyle: "alphanumeric", 212 + } 213 + repoEditOption.ExternalWiki = &api.ExternalWiki{ 214 + ExternalWikiURL: "http://www.somewebsite.com", 215 + } 216 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 217 + AddTokenAuth(token2) 218 + resp = MakeRequest(t, req, http.StatusOK) 219 + DecodeJSON(t, resp, &repo) 220 + assert.NotNil(t, repo) 221 + // check repo1 was written to database 222 + repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 223 + repo1editedOption = getRepoEditOptionFromRepo(repo1edited) 224 + assert.True(t, *repo1editedOption.HasIssues) 225 + assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker) 226 + assert.True(t, *repo1editedOption.HasWiki) 227 + assert.Equal(t, *repo1editedOption.ExternalWiki, *repoEditOption.ExternalWiki) 228 228 229 - repoEditOption.ExternalTracker.ExternalTrackerStyle = "regexp" 230 - repoEditOption.ExternalTracker.ExternalTrackerRegexpPattern = `(\d+)` 231 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 232 - AddTokenAuth(token2) 233 - resp = MakeRequest(t, req, http.StatusOK) 234 - DecodeJSON(t, resp, &repo) 235 - assert.NotNil(t, repo) 236 - repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 237 - repo1editedOption = getRepoEditOptionFromRepo(repo1edited) 238 - assert.True(t, *repo1editedOption.HasIssues) 239 - assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker) 229 + repoEditOption.ExternalTracker.ExternalTrackerStyle = "regexp" 230 + repoEditOption.ExternalTracker.ExternalTrackerRegexpPattern = `(\d+)` 231 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 232 + AddTokenAuth(token2) 233 + resp = MakeRequest(t, req, http.StatusOK) 234 + DecodeJSON(t, resp, &repo) 235 + assert.NotNil(t, repo) 236 + repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 237 + repo1editedOption = getRepoEditOptionFromRepo(repo1edited) 238 + assert.True(t, *repo1editedOption.HasIssues) 239 + assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker) 240 240 241 - // Do some tests with invalid URL for external tracker and wiki 242 - repoEditOption.ExternalTracker.ExternalTrackerURL = "htp://www.somewebsite.com" 243 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 244 - AddTokenAuth(token2) 245 - MakeRequest(t, req, http.StatusUnprocessableEntity) 246 - repoEditOption.ExternalTracker.ExternalTrackerURL = "http://www.somewebsite.com" 247 - repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user/{repo}?issue={index}" 248 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 249 - AddTokenAuth(token2) 250 - MakeRequest(t, req, http.StatusUnprocessableEntity) 251 - repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user}/{repo}?issue={index}" 252 - repoEditOption.ExternalWiki.ExternalWikiURL = "htp://www.somewebsite.com" 253 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 254 - AddTokenAuth(token2) 255 - MakeRequest(t, req, http.StatusUnprocessableEntity) 241 + // Do some tests with invalid URL for external tracker and wiki 242 + repoEditOption.ExternalTracker.ExternalTrackerURL = "htp://www.somewebsite.com" 243 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 244 + AddTokenAuth(token2) 245 + MakeRequest(t, req, http.StatusUnprocessableEntity) 246 + repoEditOption.ExternalTracker.ExternalTrackerURL = "http://www.somewebsite.com" 247 + repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user/{repo}?issue={index}" 248 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 249 + AddTokenAuth(token2) 250 + MakeRequest(t, req, http.StatusUnprocessableEntity) 251 + repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user}/{repo}?issue={index}" 252 + repoEditOption.ExternalWiki.ExternalWikiURL = "htp://www.somewebsite.com" 253 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 254 + AddTokenAuth(token2) 255 + MakeRequest(t, req, http.StatusUnprocessableEntity) 256 256 257 - // Test small repo change through API with issue and wiki option not set; They shall not be touched. 258 - *repoEditOption.Description = "small change" 259 - repoEditOption.HasIssues = nil 260 - repoEditOption.ExternalTracker = nil 261 - repoEditOption.HasWiki = nil 262 - repoEditOption.ExternalWiki = nil 263 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 264 - AddTokenAuth(token2) 265 - resp = MakeRequest(t, req, http.StatusOK) 266 - DecodeJSON(t, resp, &repo) 267 - assert.NotNil(t, repo) 268 - // check repo1 was written to database 269 - repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 270 - repo1editedOption = getRepoEditOptionFromRepo(repo1edited) 271 - assert.Equal(t, *repo1editedOption.Description, *repoEditOption.Description) 272 - assert.True(t, *repo1editedOption.HasIssues) 273 - assert.NotNil(t, *repo1editedOption.ExternalTracker) 274 - assert.True(t, *repo1editedOption.HasWiki) 275 - assert.NotNil(t, *repo1editedOption.ExternalWiki) 257 + // Test small repo change through API with issue and wiki option not set; They shall not be touched. 258 + *repoEditOption.Description = "small change" 259 + repoEditOption.HasIssues = nil 260 + repoEditOption.ExternalTracker = nil 261 + repoEditOption.HasWiki = nil 262 + repoEditOption.ExternalWiki = nil 263 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 264 + AddTokenAuth(token2) 265 + resp = MakeRequest(t, req, http.StatusOK) 266 + DecodeJSON(t, resp, &repo) 267 + assert.NotNil(t, repo) 268 + // check repo1 was written to database 269 + repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 270 + repo1editedOption = getRepoEditOptionFromRepo(repo1edited) 271 + assert.Equal(t, *repo1editedOption.Description, *repoEditOption.Description) 272 + assert.True(t, *repo1editedOption.HasIssues) 273 + assert.NotNil(t, *repo1editedOption.ExternalTracker) 274 + assert.True(t, *repo1editedOption.HasWiki) 275 + assert.NotNil(t, *repo1editedOption.ExternalWiki) 276 276 277 - // reset repo in db 278 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption). 279 - AddTokenAuth(token2) 280 - _ = MakeRequest(t, req, http.StatusOK) 277 + // reset repo in db 278 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption). 279 + AddTokenAuth(token2) 280 + _ = MakeRequest(t, req, http.StatusOK) 281 281 282 - // Test editing a non-existing repo 283 - name := "repodoesnotexist" 284 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, name), &api.EditRepoOption{Name: &name}). 285 - AddTokenAuth(token2) 286 - _ = MakeRequest(t, req, http.StatusNotFound) 282 + // Test editing a non-existing repo 283 + name := "repodoesnotexist" 284 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, name), &api.EditRepoOption{Name: &name}). 285 + AddTokenAuth(token2) 286 + _ = MakeRequest(t, req, http.StatusNotFound) 287 287 288 - // Test editing repo16 by user4 who does not have write access 289 - origRepoEditOption = getRepoEditOptionFromRepo(repo16) 290 - repoEditOption = getNewRepoEditOption(origRepoEditOption) 291 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption). 292 - AddTokenAuth(token4) 293 - MakeRequest(t, req, http.StatusNotFound) 288 + // Test editing repo16 by user4 who does not have write access 289 + origRepoEditOption = getRepoEditOptionFromRepo(repo16) 290 + repoEditOption = getNewRepoEditOption(origRepoEditOption) 291 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption). 292 + AddTokenAuth(token4) 293 + MakeRequest(t, req, http.StatusNotFound) 294 294 295 - // Tests a repo with no token given so will fail 296 - origRepoEditOption = getRepoEditOptionFromRepo(repo16) 297 - repoEditOption = getNewRepoEditOption(origRepoEditOption) 298 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption) 299 - _ = MakeRequest(t, req, http.StatusNotFound) 295 + // Tests a repo with no token given so will fail 296 + origRepoEditOption = getRepoEditOptionFromRepo(repo16) 297 + repoEditOption = getNewRepoEditOption(origRepoEditOption) 298 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption) 299 + _ = MakeRequest(t, req, http.StatusNotFound) 300 300 301 - // Test using access token for a private repo that the user of the token owns 302 - origRepoEditOption = getRepoEditOptionFromRepo(repo16) 303 - repoEditOption = getNewRepoEditOption(origRepoEditOption) 304 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption). 305 - AddTokenAuth(token2) 306 - _ = MakeRequest(t, req, http.StatusOK) 307 - // reset repo in db 308 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption). 309 - AddTokenAuth(token2) 310 - _ = MakeRequest(t, req, http.StatusOK) 301 + // Test using access token for a private repo that the user of the token owns 302 + origRepoEditOption = getRepoEditOptionFromRepo(repo16) 303 + repoEditOption = getNewRepoEditOption(origRepoEditOption) 304 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption). 305 + AddTokenAuth(token2) 306 + _ = MakeRequest(t, req, http.StatusOK) 307 + // reset repo in db 308 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption). 309 + AddTokenAuth(token2) 310 + _ = MakeRequest(t, req, http.StatusOK) 311 311 312 - // Test making a repo public that is private 313 - repo16 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) 314 - assert.True(t, repo16.IsPrivate) 315 - repoEditOption = &api.EditRepoOption{ 316 - Private: &bFalse, 317 - } 318 - url = fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name) 319 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 320 - AddTokenAuth(token2) 321 - _ = MakeRequest(t, req, http.StatusOK) 322 - repo16 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) 323 - assert.False(t, repo16.IsPrivate) 324 - // Make it private again 325 - repoEditOption.Private = &bTrue 326 - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 327 - AddTokenAuth(token2) 328 - _ = MakeRequest(t, req, http.StatusOK) 312 + // Test making a repo public that is private 313 + repo16 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) 314 + assert.True(t, repo16.IsPrivate) 315 + repoEditOption = &api.EditRepoOption{ 316 + Private: &bFalse, 317 + } 318 + url = fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name) 319 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 320 + AddTokenAuth(token2) 321 + _ = MakeRequest(t, req, http.StatusOK) 322 + repo16 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) 323 + assert.False(t, repo16.IsPrivate) 324 + // Make it private again 325 + repoEditOption.Private = &bTrue 326 + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). 327 + AddTokenAuth(token2) 328 + _ = MakeRequest(t, req, http.StatusOK) 329 329 330 - // Test to change empty repo 331 - assert.False(t, repo15.IsArchived) 332 - url = fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo15.Name) 333 - req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ 334 - Archived: &bTrue, 335 - }).AddTokenAuth(token2) 336 - _ = MakeRequest(t, req, http.StatusOK) 337 - repo15 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15}) 338 - assert.True(t, repo15.IsArchived) 339 - req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ 340 - Archived: &bFalse, 341 - }).AddTokenAuth(token2) 342 - _ = MakeRequest(t, req, http.StatusOK) 330 + // Test to change empty repo 331 + assert.False(t, repo15.IsArchived) 332 + url = fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo15.Name) 333 + req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ 334 + Archived: &bTrue, 335 + }).AddTokenAuth(token2) 336 + _ = MakeRequest(t, req, http.StatusOK) 337 + repo15 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15}) 338 + assert.True(t, repo15.IsArchived) 339 + req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ 340 + Archived: &bFalse, 341 + }).AddTokenAuth(token2) 342 + _ = MakeRequest(t, req, http.StatusOK) 343 343 344 - // Test using org repo "org3/repo3" where user2 is a collaborator 345 - origRepoEditOption = getRepoEditOptionFromRepo(repo3) 346 - repoEditOption = getNewRepoEditOption(origRepoEditOption) 347 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, repo3.Name), &repoEditOption). 348 - AddTokenAuth(token2) 349 - MakeRequest(t, req, http.StatusOK) 350 - // reset repo in db 351 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, *repoEditOption.Name), &origRepoEditOption). 352 - AddTokenAuth(token2) 353 - _ = MakeRequest(t, req, http.StatusOK) 344 + // Test using org repo "org3/repo3" where user2 is a collaborator 345 + origRepoEditOption = getRepoEditOptionFromRepo(repo3) 346 + repoEditOption = getNewRepoEditOption(origRepoEditOption) 347 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, repo3.Name), &repoEditOption). 348 + AddTokenAuth(token2) 349 + MakeRequest(t, req, http.StatusOK) 350 + // reset repo in db 351 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, *repoEditOption.Name), &origRepoEditOption). 352 + AddTokenAuth(token2) 353 + _ = MakeRequest(t, req, http.StatusOK) 354 354 355 - // Test using org repo "org3/repo3" with no user token 356 - origRepoEditOption = getRepoEditOptionFromRepo(repo3) 357 - repoEditOption = getNewRepoEditOption(origRepoEditOption) 358 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, repo3.Name), &repoEditOption) 359 - MakeRequest(t, req, http.StatusNotFound) 355 + // Test using org repo "org3/repo3" with no user token 356 + origRepoEditOption = getRepoEditOptionFromRepo(repo3) 357 + repoEditOption = getNewRepoEditOption(origRepoEditOption) 358 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, repo3.Name), &repoEditOption) 359 + MakeRequest(t, req, http.StatusNotFound) 360 360 361 - // Test using repo "user2/repo1" where user4 is a NOT collaborator 362 - origRepoEditOption = getRepoEditOptionFromRepo(repo1) 363 - repoEditOption = getNewRepoEditOption(origRepoEditOption) 364 - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption). 365 - AddTokenAuth(token4) 366 - MakeRequest(t, req, http.StatusForbidden) 361 + // Test using repo "user2/repo1" where user4 is a NOT collaborator 362 + origRepoEditOption = getRepoEditOptionFromRepo(repo1) 363 + repoEditOption = getNewRepoEditOption(origRepoEditOption) 364 + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption). 365 + AddTokenAuth(token4) 366 + MakeRequest(t, req, http.StatusForbidden) 367 + 368 + t.Run("Default merge style", func(t *testing.T) { 369 + defer tests.PrintCurrentTest(t)() 370 + 371 + updateStyle := "invalid" 372 + MakeRequest(t, NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ 373 + DefaultUpdateStyle: &updateStyle, 374 + }).AddTokenAuth(token2), http.StatusUnprocessableEntity) 375 + 376 + MakeRequest(t, NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ 377 + DefaultMergeStyle: &updateStyle, 378 + }).AddTokenAuth(token2), http.StatusUnprocessableEntity) 379 + 380 + var apiRepo api.Repository 381 + DecodeJSON(t, MakeRequest(t, NewRequest(t, "GET", url).AddTokenAuth(token2), http.StatusOK), &apiRepo) 382 + assert.Equal(t, "merge", apiRepo.DefaultMergeStyle) 383 + assert.Equal(t, "merge", apiRepo.DefaultUpdateStyle) 384 + 385 + updateStyle = "rebase" 386 + MakeRequest(t, NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ 387 + DefaultMergeStyle: &updateStyle, 388 + DefaultUpdateStyle: &updateStyle, 389 + HasPullRequests: &bTrue, 390 + }).AddTokenAuth(token2), http.StatusOK) 391 + 392 + DecodeJSON(t, MakeRequest(t, NewRequest(t, "GET", url).AddTokenAuth(token2), http.StatusOK), &apiRepo) 393 + assert.Equal(t, "rebase", apiRepo.DefaultMergeStyle) 394 + assert.Equal(t, "rebase", apiRepo.DefaultUpdateStyle) 367 395 }) 368 396 }