github.com/google/go-github/v69@v69.2.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  }