github.com/google/go-github/v70@v70.0.0/github/repos_rules_test.go (about) 1 // Copyright 2023 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 package github 7 8 import ( 9 "context" 10 "fmt" 11 "net/http" 12 "testing" 13 14 "github.com/google/go-cmp/cmp" 15 ) 16 17 func TestRepositoriesService_GetRulesForBranch(t *testing.T) { 18 t.Parallel() 19 client, mux, _ := setup(t) 20 21 mux.HandleFunc("/repos/o/repo/rules/branches/branch", func(w http.ResponseWriter, r *http.Request) { 22 testMethod(t, r, "GET") 23 fmt.Fprint(w, `[ 24 { 25 "ruleset_id": 42069, 26 "ruleset_source_type": "Repository", 27 "ruleset_source": "google/a", 28 "type": "creation" 29 }, 30 { 31 "ruleset_id": 42069, 32 "ruleset_source_type": "Organization", 33 "ruleset_source": "google", 34 "type": "update", 35 "parameters": { 36 "update_allows_fetch_and_merge": true 37 } 38 } 39 ]`) 40 }) 41 42 ctx := context.Background() 43 rules, _, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch") 44 if err != nil { 45 t.Errorf("Repositories.GetRulesForBranch returned error: %v", err) 46 } 47 48 want := &BranchRules{ 49 Creation: []*BranchRuleMetadata{{RulesetSourceType: RulesetSourceTypeRepository, RulesetSource: "google/a", RulesetID: 42069}}, 50 Update: []*UpdateBranchRule{{BranchRuleMetadata: BranchRuleMetadata{RulesetSourceType: RulesetSourceTypeOrganization, RulesetSource: "google", RulesetID: 42069}, Parameters: UpdateRuleParameters{UpdateAllowsFetchAndMerge: true}}}, 51 } 52 53 if !cmp.Equal(rules, want) { 54 t.Errorf("Repositories.GetRulesForBranch returned %+v, want %+v", rules, want) 55 } 56 57 const methodName = "GetRulesForBranch" 58 59 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 60 got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch") 61 if got != nil { 62 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 63 } 64 return resp, err 65 }) 66 } 67 68 func TestRepositoriesService_GetAllRulesets(t *testing.T) { 69 t.Parallel() 70 client, mux, _ := setup(t) 71 72 mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { 73 testMethod(t, r, "GET") 74 fmt.Fprintf(w, `[ 75 { 76 "id": 42, 77 "name": "ruleset", 78 "source_type": "Repository", 79 "source": "o/repo", 80 "enforcement": "active", 81 "created_at": %[1]s, 82 "updated_at": %[1]s 83 }, 84 { 85 "id": 314, 86 "name": "Another ruleset", 87 "source_type": "Repository", 88 "source": "o/repo", 89 "enforcement": "active", 90 "created_at": %[1]s, 91 "updated_at": %[1]s 92 } 93 ]`, referenceTimeStr) 94 }) 95 96 ctx := context.Background() 97 ruleSet, _, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", false) 98 if err != nil { 99 t.Errorf("Repositories.GetAllRulesets returned error: %v", err) 100 } 101 102 want := []*RepositoryRuleset{ 103 { 104 ID: Ptr(int64(42)), 105 Name: "ruleset", 106 SourceType: Ptr(RulesetSourceTypeRepository), 107 Source: "o/repo", 108 Enforcement: RulesetEnforcementActive, 109 CreatedAt: &Timestamp{referenceTime}, 110 UpdatedAt: &Timestamp{referenceTime}, 111 }, 112 { 113 ID: Ptr(int64(314)), 114 Name: "Another ruleset", 115 SourceType: Ptr(RulesetSourceTypeRepository), 116 Source: "o/repo", 117 Enforcement: RulesetEnforcementActive, 118 CreatedAt: &Timestamp{referenceTime}, 119 UpdatedAt: &Timestamp{referenceTime}, 120 }, 121 } 122 if !cmp.Equal(ruleSet, want) { 123 t.Errorf("Repositories.GetAllRulesets returned %+v, want %+v", ruleSet, want) 124 } 125 126 const methodName = "GetAllRulesets" 127 128 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 129 got, resp, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", false) 130 if got != nil { 131 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 132 } 133 return resp, err 134 }) 135 } 136 137 func TestRepositoriesService_CreateRuleset(t *testing.T) { 138 t.Parallel() 139 client, mux, _ := setup(t) 140 141 mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { 142 testMethod(t, r, "POST") 143 fmt.Fprint(w, `{ 144 "id": 42, 145 "name": "ruleset", 146 "source_type": "Repository", 147 "source": "o/repo", 148 "enforcement": "active" 149 }`) 150 }) 151 152 ctx := context.Background() 153 ruleSet, _, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{ 154 Name: "ruleset", 155 Enforcement: RulesetEnforcementActive, 156 }) 157 if err != nil { 158 t.Errorf("Repositories.CreateRuleset returned error: %v", err) 159 } 160 161 want := &RepositoryRuleset{ 162 ID: Ptr(int64(42)), 163 Name: "ruleset", 164 SourceType: Ptr(RulesetSourceTypeRepository), 165 Source: "o/repo", 166 Enforcement: RulesetEnforcementActive, 167 } 168 if !cmp.Equal(ruleSet, want) { 169 t.Errorf("Repositories.CreateRuleset returned %+v, want %+v", ruleSet, want) 170 } 171 172 const methodName = "CreateRuleset" 173 174 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 175 got, resp, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{}) 176 if got != nil { 177 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 178 } 179 return resp, err 180 }) 181 } 182 183 func TestRepositoriesService_CreateRulesetWithPushRules(t *testing.T) { 184 t.Parallel() 185 client, mux, _ := setup(t) 186 187 mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { 188 testMethod(t, r, "POST") 189 fmt.Fprint(w, `{ 190 "id": 42, 191 "name": "ruleset", 192 "source_type": "Repository", 193 "source": "o/repo", 194 "enforcement": "active", 195 "target": "push", 196 "rules": [ 197 { 198 "type": "file_path_restriction", 199 "parameters": { 200 "restricted_file_paths": ["/a/file"] 201 } 202 }, 203 { 204 "type": "max_file_path_length", 205 "parameters": { 206 "max_file_path_length": 255 207 } 208 }, 209 { 210 "type": "file_extension_restriction", 211 "parameters": { 212 "restricted_file_extensions": [".exe"] 213 } 214 }, 215 { 216 "type": "max_file_size", 217 "parameters": { 218 "max_file_size": 1024 219 } 220 } 221 ] 222 }`) 223 }) 224 225 ctx := context.Background() 226 ruleSet, _, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{ 227 Name: "ruleset", 228 Enforcement: RulesetEnforcementActive, 229 }) 230 if err != nil { 231 t.Errorf("Repositories.CreateRuleset returned error: %v", err) 232 } 233 234 want := &RepositoryRuleset{ 235 ID: Ptr(int64(42)), 236 Name: "ruleset", 237 SourceType: Ptr(RulesetSourceTypeRepository), 238 Source: "o/repo", 239 Target: Ptr(RulesetTargetPush), 240 Enforcement: RulesetEnforcementActive, 241 Rules: &RepositoryRulesetRules{ 242 FilePathRestriction: &FilePathRestrictionRuleParameters{RestrictedFilePaths: []string{"/a/file"}}, 243 MaxFilePathLength: &MaxFilePathLengthRuleParameters{MaxFilePathLength: 255}, 244 FileExtensionRestriction: &FileExtensionRestrictionRuleParameters{RestrictedFileExtensions: []string{".exe"}}, 245 MaxFileSize: &MaxFileSizeRuleParameters{MaxFileSize: 1024}, 246 }, 247 } 248 if !cmp.Equal(ruleSet, want) { 249 t.Errorf("Repositories.CreateRuleset returned %+v, want %+v", ruleSet, want) 250 } 251 252 const methodName = "CreateRuleset" 253 254 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 255 got, resp, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{}) 256 if got != nil { 257 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 258 } 259 return resp, err 260 }) 261 } 262 263 func TestRepositoriesService_GetRuleset(t *testing.T) { 264 t.Parallel() 265 client, mux, _ := setup(t) 266 267 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 268 testMethod(t, r, "GET") 269 fmt.Fprint(w, `{ 270 "id": 42, 271 "name": "ruleset", 272 "source_type": "Organization", 273 "source": "o", 274 "enforcement": "active", 275 "created_at": `+referenceTimeStr+`, 276 "updated_at": `+referenceTimeStr+` 277 }`) 278 }) 279 280 ctx := context.Background() 281 ruleSet, _, err := client.Repositories.GetRuleset(ctx, "o", "repo", 42, true) 282 if err != nil { 283 t.Errorf("Repositories.GetRuleset returned error: %v", err) 284 } 285 286 want := &RepositoryRuleset{ 287 ID: Ptr(int64(42)), 288 Name: "ruleset", 289 SourceType: Ptr(RulesetSourceTypeOrganization), 290 Source: "o", 291 Enforcement: RulesetEnforcementActive, 292 CreatedAt: &Timestamp{referenceTime}, 293 UpdatedAt: &Timestamp{referenceTime}, 294 } 295 if !cmp.Equal(ruleSet, want) { 296 t.Errorf("Repositories.GetRuleset returned %+v, want %+v", ruleSet, want) 297 } 298 299 const methodName = "GetRuleset" 300 301 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 302 got, resp, err := client.Repositories.GetRuleset(ctx, "o", "repo", 42, true) 303 if got != nil { 304 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 305 } 306 return resp, err 307 }) 308 } 309 310 func TestRepositoriesService_UpdateRuleset(t *testing.T) { 311 t.Parallel() 312 client, mux, _ := setup(t) 313 314 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 315 testMethod(t, r, "PUT") 316 fmt.Fprint(w, `{ 317 "id": 42, 318 "name": "ruleset", 319 "source_type": "Repository", 320 "source": "o/repo", 321 "enforcement": "active" 322 }`) 323 }) 324 325 ctx := context.Background() 326 ruleSet, _, err := client.Repositories.UpdateRuleset(ctx, "o", "repo", 42, RepositoryRuleset{ 327 Name: "ruleset", 328 Enforcement: RulesetEnforcementActive, 329 }) 330 if err != nil { 331 t.Errorf("Repositories.UpdateRuleset returned error: %v", err) 332 } 333 334 want := &RepositoryRuleset{ 335 ID: Ptr(int64(42)), 336 Name: "ruleset", 337 SourceType: Ptr(RulesetSourceTypeRepository), 338 Source: "o/repo", 339 Enforcement: "active", 340 } 341 342 if !cmp.Equal(ruleSet, want) { 343 t.Errorf("Repositories.UpdateRuleset returned %+v, want %+v", ruleSet, want) 344 } 345 346 const methodName = "UpdateRuleset" 347 348 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 349 got, resp, err := client.Repositories.UpdateRuleset(ctx, "o", "repo", 42, RepositoryRuleset{}) 350 if got != nil { 351 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 352 } 353 return resp, err 354 }) 355 } 356 357 func TestRepositoriesService_UpdateRulesetClearBypassActor(t *testing.T) { 358 t.Parallel() 359 client, mux, _ := setup(t) 360 361 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 362 testMethod(t, r, "PUT") 363 fmt.Fprint(w, `{ 364 "id": 42, 365 "name": "ruleset", 366 "source_type": "Repository", 367 "source": "o/repo", 368 "enforcement": "active" 369 "conditions": { 370 "ref_name": { 371 "include": [ 372 "refs/heads/main", 373 "refs/heads/master" 374 ], 375 "exclude": [ 376 "refs/heads/dev*" 377 ] 378 } 379 }, 380 "rules": [ 381 { 382 "type": "creation" 383 } 384 ] 385 }`) 386 }) 387 388 ctx := context.Background() 389 390 _, err := client.Repositories.UpdateRulesetClearBypassActor(ctx, "o", "repo", 42) 391 if err != nil { 392 t.Errorf("Repositories.UpdateRulesetClearBypassActor returned error: %v \n", err) 393 } 394 395 const methodName = "UpdateRulesetClearBypassActor" 396 397 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 398 return client.Repositories.UpdateRulesetClearBypassActor(ctx, "o", "repo", 42) 399 }) 400 } 401 402 func TestRepositoriesService_UpdateRulesetNoBypassActor(t *testing.T) { 403 t.Parallel() 404 client, mux, _ := setup(t) 405 406 rs := RepositoryRuleset{ 407 Name: "ruleset", 408 Source: "o/repo", 409 Enforcement: RulesetEnforcementActive, 410 } 411 412 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 413 testMethod(t, r, "PUT") 414 fmt.Fprint(w, `{ 415 "id": 42, 416 "name": "ruleset", 417 "source_type": "Repository", 418 "source": "o/repo", 419 "enforcement": "active" 420 }`) 421 }) 422 423 ctx := context.Background() 424 425 ruleSet, _, err := client.Repositories.UpdateRulesetNoBypassActor(ctx, "o", "repo", 42, rs) 426 if err != nil { 427 t.Errorf("Repositories.UpdateRulesetNoBypassActor returned error: %v \n", err) 428 } 429 430 want := &RepositoryRuleset{ 431 ID: Ptr(int64(42)), 432 Name: "ruleset", 433 SourceType: Ptr(RulesetSourceTypeRepository), 434 Source: "o/repo", 435 Enforcement: RulesetEnforcementActive, 436 } 437 438 if !cmp.Equal(ruleSet, want) { 439 t.Errorf("Repositories.UpdateRulesetNoBypassActor returned %+v, want %+v", ruleSet, want) 440 } 441 442 const methodName = "UpdateRulesetNoBypassActor" 443 444 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 445 got, resp, err := client.Repositories.UpdateRulesetNoBypassActor(ctx, "o", "repo", 42, RepositoryRuleset{}) 446 if got != nil { 447 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 448 } 449 return resp, err 450 }) 451 } 452 453 func TestRepositoriesService_DeleteRuleset(t *testing.T) { 454 t.Parallel() 455 client, mux, _ := setup(t) 456 457 mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { 458 testMethod(t, r, "DELETE") 459 }) 460 461 ctx := context.Background() 462 _, err := client.Repositories.DeleteRuleset(ctx, "o", "repo", 42) 463 if err != nil { 464 t.Errorf("Repositories.DeleteRuleset returned error: %v", err) 465 } 466 467 const methodName = "DeleteRuleset" 468 469 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 470 return client.Repositories.DeleteRuleset(ctx, "o", "repo", 42) 471 }) 472 }