github.com/google/go-github/v74@v74.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", nil)
    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  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    59  		got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", nil)
    60  		if got != nil {
    61  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    62  		}
    63  		return resp, err
    64  	})
    65  }
    66  
    67  func TestRepositoriesService_GetRulesForBranch_ListOptions(t *testing.T) {
    68  	t.Parallel()
    69  	client, mux, _ := setup(t)
    70  
    71  	mux.HandleFunc("/repos/o/repo/rules/branches/branch", func(w http.ResponseWriter, r *http.Request) {
    72  		testMethod(t, r, "GET")
    73  		testFormValues(t, r, values{
    74  			"page":     "2",
    75  			"per_page": "35",
    76  		})
    77  		fmt.Fprint(w, `[
    78  			{
    79  			  "ruleset_id": 42069,
    80  			  "type": "creation"
    81  			}
    82  		]`)
    83  	})
    84  
    85  	opts := &ListOptions{Page: 2, PerPage: 35}
    86  	ctx := context.Background()
    87  	rules, _, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", opts)
    88  	if err != nil {
    89  		t.Errorf("Repositories.GetRulesForBranch returned error: %v", err)
    90  	}
    91  
    92  	want := &BranchRules{
    93  		Creation: []*BranchRuleMetadata{{RulesetID: 42069}},
    94  	}
    95  
    96  	if !cmp.Equal(rules, want) {
    97  		t.Errorf("Repositories.GetRulesForBranch returned %+v, want %+v", rules, want)
    98  	}
    99  
   100  	const methodName = "GetRulesForBranch"
   101  	testBadOptions(t, methodName, func() (err error) {
   102  		_, _, err = client.Repositories.GetRulesForBranch(ctx, "\n", "\n", "\n", opts)
   103  		return err
   104  	})
   105  
   106  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   107  		got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", opts)
   108  		if got != nil {
   109  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   110  		}
   111  		return resp, err
   112  	})
   113  }
   114  
   115  func TestRepositoriesService_GetAllRulesets(t *testing.T) {
   116  	t.Parallel()
   117  	client, mux, _ := setup(t)
   118  
   119  	mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) {
   120  		testMethod(t, r, "GET")
   121  		fmt.Fprintf(w, `[
   122  			{
   123  			  "id": 42,
   124  			  "name": "ruleset",
   125  			  "source_type": "Repository",
   126  			  "source": "o/repo",
   127  			  "enforcement": "active",
   128  			  "created_at": %[1]s,
   129  			  "updated_at": %[1]s
   130  			},
   131  			{
   132  			  "id": 314,
   133  			  "name": "Another ruleset",
   134  			  "source_type": "Repository",
   135  			  "source": "o/repo",
   136  			  "enforcement": "active",
   137  			  "created_at": %[1]s,
   138  			  "updated_at": %[1]s
   139  			}
   140  		]`, referenceTimeStr)
   141  	})
   142  
   143  	ctx := context.Background()
   144  	ruleSet, _, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", nil)
   145  	if err != nil {
   146  		t.Errorf("Repositories.GetAllRulesets returned error: %v", err)
   147  	}
   148  
   149  	want := []*RepositoryRuleset{
   150  		{
   151  			ID:          Ptr(int64(42)),
   152  			Name:        "ruleset",
   153  			SourceType:  Ptr(RulesetSourceTypeRepository),
   154  			Source:      "o/repo",
   155  			Enforcement: RulesetEnforcementActive,
   156  			CreatedAt:   &Timestamp{referenceTime},
   157  			UpdatedAt:   &Timestamp{referenceTime},
   158  		},
   159  		{
   160  			ID:          Ptr(int64(314)),
   161  			Name:        "Another ruleset",
   162  			SourceType:  Ptr(RulesetSourceTypeRepository),
   163  			Source:      "o/repo",
   164  			Enforcement: RulesetEnforcementActive,
   165  			CreatedAt:   &Timestamp{referenceTime},
   166  			UpdatedAt:   &Timestamp{referenceTime},
   167  		},
   168  	}
   169  	if !cmp.Equal(ruleSet, want) {
   170  		t.Errorf("Repositories.GetAllRulesets returned %+v, want %+v", ruleSet, want)
   171  	}
   172  
   173  	const methodName = "GetAllRulesets"
   174  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   175  		got, resp, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", nil)
   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_GetAllRulesets_ListOptions(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, "GET")
   189  		testFormValues(t, r, values{
   190  			"includes_parents": "false",
   191  			"page":             "2",
   192  			"per_page":         "35",
   193  		})
   194  		fmt.Fprint(w, `[
   195  			{
   196  			  "id": 42
   197  			}
   198  		]`)
   199  	})
   200  
   201  	opts := &RepositoryListRulesetsOptions{
   202  		IncludesParents: Ptr(false),
   203  		ListOptions: ListOptions{
   204  			Page:    2,
   205  			PerPage: 35,
   206  		},
   207  	}
   208  	ctx := context.Background()
   209  	ruleSet, _, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", opts)
   210  	if err != nil {
   211  		t.Errorf("Repositories.GetAllRulesets returned error: %v", err)
   212  	}
   213  
   214  	want := []*RepositoryRuleset{
   215  		{
   216  			ID: Ptr(int64(42)),
   217  		},
   218  	}
   219  	if !cmp.Equal(ruleSet, want) {
   220  		t.Errorf("Repositories.GetAllRulesets returned %+v, want %+v", ruleSet, want)
   221  	}
   222  
   223  	const methodName = "GetAllRulesets"
   224  	testBadOptions(t, methodName, func() (err error) {
   225  		_, _, err = client.Repositories.GetAllRulesets(ctx, "\n", "\n", opts)
   226  		return err
   227  	})
   228  
   229  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   230  		got, resp, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", opts)
   231  		if got != nil {
   232  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   233  		}
   234  		return resp, err
   235  	})
   236  }
   237  
   238  func TestRepositoriesService_CreateRuleset(t *testing.T) {
   239  	t.Parallel()
   240  	client, mux, _ := setup(t)
   241  
   242  	mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) {
   243  		testMethod(t, r, "POST")
   244  		fmt.Fprint(w, `{
   245  			"id": 42,
   246  			"name": "ruleset",
   247  			"source_type": "Repository",
   248  			"source": "o/repo",
   249  			"enforcement": "active"
   250  		}`)
   251  	})
   252  
   253  	ctx := context.Background()
   254  	ruleSet, _, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{
   255  		Name:        "ruleset",
   256  		Enforcement: RulesetEnforcementActive,
   257  	})
   258  	if err != nil {
   259  		t.Errorf("Repositories.CreateRuleset returned error: %v", err)
   260  	}
   261  
   262  	want := &RepositoryRuleset{
   263  		ID:          Ptr(int64(42)),
   264  		Name:        "ruleset",
   265  		SourceType:  Ptr(RulesetSourceTypeRepository),
   266  		Source:      "o/repo",
   267  		Enforcement: RulesetEnforcementActive,
   268  	}
   269  	if !cmp.Equal(ruleSet, want) {
   270  		t.Errorf("Repositories.CreateRuleset returned %+v, want %+v", ruleSet, want)
   271  	}
   272  
   273  	const methodName = "CreateRuleset"
   274  
   275  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   276  		got, resp, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{})
   277  		if got != nil {
   278  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   279  		}
   280  		return resp, err
   281  	})
   282  }
   283  
   284  func TestRepositoriesService_CreateRulesetWithPushRules(t *testing.T) {
   285  	t.Parallel()
   286  	client, mux, _ := setup(t)
   287  
   288  	mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) {
   289  		testMethod(t, r, "POST")
   290  		fmt.Fprint(w, `{
   291  			"id": 42,
   292  			"name": "ruleset",
   293  			"source_type": "Repository",
   294  			"source": "o/repo",
   295  			"enforcement": "active",
   296  			"target": "push",
   297  			"rules": [
   298  				{
   299  					"type": "file_path_restriction",
   300  					"parameters": {
   301  						"restricted_file_paths": ["/a/file"]
   302  					}
   303  				},
   304  				{
   305  					"type": "max_file_path_length",
   306  					"parameters": {
   307  						"max_file_path_length": 255
   308  					}
   309  				},
   310  				{
   311  					"type": "file_extension_restriction",
   312  					"parameters": {
   313  						"restricted_file_extensions": [".exe"]
   314  					}
   315  				},
   316  				{
   317  					"type": "max_file_size",
   318  					"parameters": {
   319  						"max_file_size": 1024
   320  					}
   321  				}
   322  			]
   323  		}`)
   324  	})
   325  
   326  	ctx := context.Background()
   327  	ruleSet, _, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{
   328  		Name:        "ruleset",
   329  		Enforcement: RulesetEnforcementActive,
   330  	})
   331  	if err != nil {
   332  		t.Errorf("Repositories.CreateRuleset returned error: %v", err)
   333  	}
   334  
   335  	want := &RepositoryRuleset{
   336  		ID:          Ptr(int64(42)),
   337  		Name:        "ruleset",
   338  		SourceType:  Ptr(RulesetSourceTypeRepository),
   339  		Source:      "o/repo",
   340  		Target:      Ptr(RulesetTargetPush),
   341  		Enforcement: RulesetEnforcementActive,
   342  		Rules: &RepositoryRulesetRules{
   343  			FilePathRestriction:      &FilePathRestrictionRuleParameters{RestrictedFilePaths: []string{"/a/file"}},
   344  			MaxFilePathLength:        &MaxFilePathLengthRuleParameters{MaxFilePathLength: 255},
   345  			FileExtensionRestriction: &FileExtensionRestrictionRuleParameters{RestrictedFileExtensions: []string{".exe"}},
   346  			MaxFileSize:              &MaxFileSizeRuleParameters{MaxFileSize: 1024},
   347  		},
   348  	}
   349  	if !cmp.Equal(ruleSet, want) {
   350  		t.Errorf("Repositories.CreateRuleset returned %+v, want %+v", ruleSet, want)
   351  	}
   352  
   353  	const methodName = "CreateRuleset"
   354  
   355  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   356  		got, resp, err := client.Repositories.CreateRuleset(ctx, "o", "repo", RepositoryRuleset{})
   357  		if got != nil {
   358  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   359  		}
   360  		return resp, err
   361  	})
   362  }
   363  
   364  func TestRepositoriesService_GetRuleset(t *testing.T) {
   365  	t.Parallel()
   366  	client, mux, _ := setup(t)
   367  
   368  	mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) {
   369  		testMethod(t, r, "GET")
   370  		fmt.Fprint(w, `{
   371  			"id": 42,
   372  			"name": "ruleset",
   373  			"source_type": "Organization",
   374  			"source": "o",
   375  			"enforcement": "active",
   376  			"created_at": `+referenceTimeStr+`,
   377  			"updated_at": `+referenceTimeStr+`
   378  		}`)
   379  	})
   380  
   381  	ctx := context.Background()
   382  	ruleSet, _, err := client.Repositories.GetRuleset(ctx, "o", "repo", 42, true)
   383  	if err != nil {
   384  		t.Errorf("Repositories.GetRuleset returned error: %v", err)
   385  	}
   386  
   387  	want := &RepositoryRuleset{
   388  		ID:          Ptr(int64(42)),
   389  		Name:        "ruleset",
   390  		SourceType:  Ptr(RulesetSourceTypeOrganization),
   391  		Source:      "o",
   392  		Enforcement: RulesetEnforcementActive,
   393  		CreatedAt:   &Timestamp{referenceTime},
   394  		UpdatedAt:   &Timestamp{referenceTime},
   395  	}
   396  	if !cmp.Equal(ruleSet, want) {
   397  		t.Errorf("Repositories.GetRuleset returned %+v, want %+v", ruleSet, want)
   398  	}
   399  
   400  	const methodName = "GetRuleset"
   401  
   402  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   403  		got, resp, err := client.Repositories.GetRuleset(ctx, "o", "repo", 42, true)
   404  		if got != nil {
   405  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   406  		}
   407  		return resp, err
   408  	})
   409  }
   410  
   411  func TestRepositoriesService_UpdateRuleset(t *testing.T) {
   412  	t.Parallel()
   413  	client, mux, _ := setup(t)
   414  
   415  	mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) {
   416  		testMethod(t, r, "PUT")
   417  		fmt.Fprint(w, `{
   418  			"id": 42,
   419  			"name": "ruleset",
   420  			"source_type": "Repository",
   421  			"source": "o/repo",
   422  			"enforcement": "active"
   423  		}`)
   424  	})
   425  
   426  	ctx := context.Background()
   427  	ruleSet, _, err := client.Repositories.UpdateRuleset(ctx, "o", "repo", 42, RepositoryRuleset{
   428  		Name:        "ruleset",
   429  		Enforcement: RulesetEnforcementActive,
   430  	})
   431  	if err != nil {
   432  		t.Errorf("Repositories.UpdateRuleset returned error: %v", err)
   433  	}
   434  
   435  	want := &RepositoryRuleset{
   436  		ID:          Ptr(int64(42)),
   437  		Name:        "ruleset",
   438  		SourceType:  Ptr(RulesetSourceTypeRepository),
   439  		Source:      "o/repo",
   440  		Enforcement: "active",
   441  	}
   442  
   443  	if !cmp.Equal(ruleSet, want) {
   444  		t.Errorf("Repositories.UpdateRuleset returned %+v, want %+v", ruleSet, want)
   445  	}
   446  
   447  	const methodName = "UpdateRuleset"
   448  
   449  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   450  		got, resp, err := client.Repositories.UpdateRuleset(ctx, "o", "repo", 42, RepositoryRuleset{})
   451  		if got != nil {
   452  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   453  		}
   454  		return resp, err
   455  	})
   456  }
   457  
   458  func TestRepositoriesService_UpdateRulesetClearBypassActor(t *testing.T) {
   459  	t.Parallel()
   460  	client, mux, _ := setup(t)
   461  
   462  	mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) {
   463  		testMethod(t, r, "PUT")
   464  		fmt.Fprint(w, `{
   465  			"id": 42,
   466  			"name": "ruleset",
   467  			"source_type": "Repository",
   468  			"source": "o/repo",
   469  			"enforcement": "active"
   470  			"conditions": {
   471  				"ref_name": {
   472  					"include": [
   473  						"refs/heads/main",
   474  						"refs/heads/master"
   475  					],
   476  					"exclude": [
   477  						"refs/heads/dev*"
   478  					]
   479  				}
   480  			},
   481  			"rules": [
   482  			  {
   483  					"type": "creation"
   484  			  }
   485  			]
   486  		}`)
   487  	})
   488  
   489  	ctx := context.Background()
   490  
   491  	_, err := client.Repositories.UpdateRulesetClearBypassActor(ctx, "o", "repo", 42)
   492  	if err != nil {
   493  		t.Errorf("Repositories.UpdateRulesetClearBypassActor returned error: %v \n", err)
   494  	}
   495  
   496  	const methodName = "UpdateRulesetClearBypassActor"
   497  
   498  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   499  		return client.Repositories.UpdateRulesetClearBypassActor(ctx, "o", "repo", 42)
   500  	})
   501  }
   502  
   503  func TestRepositoriesService_UpdateRulesetNoBypassActor(t *testing.T) {
   504  	t.Parallel()
   505  	client, mux, _ := setup(t)
   506  
   507  	rs := RepositoryRuleset{
   508  		Name:        "ruleset",
   509  		Source:      "o/repo",
   510  		Enforcement: RulesetEnforcementActive,
   511  	}
   512  
   513  	mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) {
   514  		testMethod(t, r, "PUT")
   515  		fmt.Fprint(w, `{
   516  			"id": 42,
   517  			"name": "ruleset",
   518  			"source_type": "Repository",
   519  			"source": "o/repo",
   520  			"enforcement": "active"
   521  		}`)
   522  	})
   523  
   524  	ctx := context.Background()
   525  
   526  	ruleSet, _, err := client.Repositories.UpdateRulesetNoBypassActor(ctx, "o", "repo", 42, rs)
   527  	if err != nil {
   528  		t.Errorf("Repositories.UpdateRulesetNoBypassActor returned error: %v \n", err)
   529  	}
   530  
   531  	want := &RepositoryRuleset{
   532  		ID:          Ptr(int64(42)),
   533  		Name:        "ruleset",
   534  		SourceType:  Ptr(RulesetSourceTypeRepository),
   535  		Source:      "o/repo",
   536  		Enforcement: RulesetEnforcementActive,
   537  	}
   538  
   539  	if !cmp.Equal(ruleSet, want) {
   540  		t.Errorf("Repositories.UpdateRulesetNoBypassActor returned %+v, want %+v", ruleSet, want)
   541  	}
   542  
   543  	const methodName = "UpdateRulesetNoBypassActor"
   544  
   545  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   546  		got, resp, err := client.Repositories.UpdateRulesetNoBypassActor(ctx, "o", "repo", 42, RepositoryRuleset{})
   547  		if got != nil {
   548  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   549  		}
   550  		return resp, err
   551  	})
   552  }
   553  
   554  func TestRepositoriesService_DeleteRuleset(t *testing.T) {
   555  	t.Parallel()
   556  	client, mux, _ := setup(t)
   557  
   558  	mux.HandleFunc("/repos/o/repo/rulesets/42", func(_ http.ResponseWriter, r *http.Request) {
   559  		testMethod(t, r, "DELETE")
   560  	})
   561  
   562  	ctx := context.Background()
   563  	_, err := client.Repositories.DeleteRuleset(ctx, "o", "repo", 42)
   564  	if err != nil {
   565  		t.Errorf("Repositories.DeleteRuleset returned error: %v", err)
   566  	}
   567  
   568  	const methodName = "DeleteRuleset"
   569  
   570  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   571  		return client.Repositories.DeleteRuleset(ctx, "o", "repo", 42)
   572  	})
   573  }