Skip to content

Commit bdd7396

Browse files
authored
feat!: Add support for pagination options in rules API methods (#3562)
BREAKING CHANGE: `GetRulesForBranch`, `GetAllRulesets`, and `GetAllRepositoryRulesets` now accept `opts`.
1 parent 04274a9 commit bdd7396

File tree

6 files changed

+198
-11
lines changed

6 files changed

+198
-11
lines changed

github/github-accessors.go

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

github/github-accessors_test.go

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

github/orgs_rules.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ import (
1515
// GitHub API docs: https://docs.github.com/rest/orgs/rules#get-all-organization-repository-rulesets
1616
//
1717
//meta:operation GET /orgs/{org}/rulesets
18-
func (s *OrganizationsService) GetAllRepositoryRulesets(ctx context.Context, org string) ([]*RepositoryRuleset, *Response, error) {
18+
func (s *OrganizationsService) GetAllRepositoryRulesets(ctx context.Context, org string, opts *ListOptions) ([]*RepositoryRuleset, *Response, error) {
1919
u := fmt.Sprintf("orgs/%v/rulesets", org)
2020

21+
u, err := addOptions(u, opts)
22+
if err != nil {
23+
return nil, nil, err
24+
}
25+
2126
req, err := s.client.NewRequest("GET", u, nil)
2227
if err != nil {
2328
return nil, nil, err

github/orgs_rules_test.go

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func TestOrganizationsService_GetAllRepositoryRulesets(t *testing.T) {
3838
})
3939

4040
ctx := context.Background()
41-
rulesets, _, err := client.Organizations.GetAllRepositoryRulesets(ctx, "o")
41+
rulesets, _, err := client.Organizations.GetAllRepositoryRulesets(ctx, "o", nil)
4242
if err != nil {
4343
t.Errorf("Organizations.GetAllRepositoryRulesets returned error: %v", err)
4444
}
@@ -60,9 +60,52 @@ func TestOrganizationsService_GetAllRepositoryRulesets(t *testing.T) {
6060
}
6161

6262
const methodName = "GetAllRepositoryRulesets"
63+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
64+
got, resp, err := client.Organizations.GetAllRepositoryRulesets(ctx, "o", nil)
65+
if got != nil {
66+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
67+
}
68+
return resp, err
69+
})
70+
}
71+
72+
func TestOrganizationsService_GetAllRepositoryRulesets_ListOptions(t *testing.T) {
73+
t.Parallel()
74+
client, mux, _ := setup(t)
75+
76+
mux.HandleFunc("/orgs/o/rulesets", func(w http.ResponseWriter, r *http.Request) {
77+
testMethod(t, r, "GET")
78+
testFormValues(t, r, values{
79+
"page": "2",
80+
"per_page": "35",
81+
})
82+
fmt.Fprint(w, `[{
83+
"id": 21
84+
}]`)
85+
})
86+
87+
opts := &ListOptions{Page: 2, PerPage: 35}
88+
ctx := context.Background()
89+
rulesets, _, err := client.Organizations.GetAllRepositoryRulesets(ctx, "o", opts)
90+
if err != nil {
91+
t.Errorf("Organizations.GetAllRepositoryRulesets returned error: %v", err)
92+
}
93+
94+
want := []*RepositoryRuleset{{
95+
ID: Ptr(int64(21)),
96+
}}
97+
if !cmp.Equal(rulesets, want) {
98+
t.Errorf("Organizations.GetAllRepositoryRulesets returned %+v, want %+v", rulesets, want)
99+
}
100+
101+
const methodName = "GetAllRepositoryRulesets"
102+
testBadOptions(t, methodName, func() (err error) {
103+
_, _, err = client.Organizations.GetAllRepositoryRulesets(ctx, "\n", opts)
104+
return err
105+
})
63106

64107
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
65-
got, resp, err := client.Organizations.GetAllRepositoryRulesets(ctx, "o")
108+
got, resp, err := client.Organizations.GetAllRepositoryRulesets(ctx, "o", opts)
66109
if got != nil {
67110
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
68111
}

github/repos_rules.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,14 @@ type rulesetClearBypassActors struct {
3838
// GitHub API docs: https://docs.github.com/rest/repos/rules#get-rules-for-a-branch
3939
//
4040
//meta:operation GET /repos/{owner}/{repo}/rules/branches/{branch}
41-
func (s *RepositoriesService) GetRulesForBranch(ctx context.Context, owner, repo, branch string) (*BranchRules, *Response, error) {
41+
func (s *RepositoriesService) GetRulesForBranch(ctx context.Context, owner, repo, branch string, opts *ListOptions) (*BranchRules, *Response, error) {
4242
u := fmt.Sprintf("repos/%v/%v/rules/branches/%v", owner, repo, branch)
4343

44+
u, err := addOptions(u, opts)
45+
if err != nil {
46+
return nil, nil, err
47+
}
48+
4449
req, err := s.client.NewRequest("GET", u, nil)
4550
if err != nil {
4651
return nil, nil, err
@@ -55,14 +60,28 @@ func (s *RepositoriesService) GetRulesForBranch(ctx context.Context, owner, repo
5560
return rules, resp, nil
5661
}
5762

63+
// RepositoryListRulesetsOptions specifies optional parameters to the
64+
// RepositoriesService.GetAllRulesets method.
65+
type RepositoryListRulesetsOptions struct {
66+
// IncludesParents indicates whether to include rulesets configured at the organization or enterprise level that apply to the repository.
67+
IncludesParents *bool `url:"includes_parents,omitempty"`
68+
ListOptions
69+
}
70+
5871
// GetAllRulesets gets all the repository rulesets for the specified repository.
59-
// If includesParents is true, rulesets configured at the organization or enterprise level that apply to the repository will be returned.
72+
// By default, this endpoint will include rulesets configured at the organization or enterprise level that apply to the repository.
73+
// To exclude those rulesets, set the `RepositoryListRulesetsOptions.IncludesParents` parameter to `false`.
6074
//
6175
// GitHub API docs: https://docs.github.com/rest/repos/rules#get-all-repository-rulesets
6276
//
6377
//meta:operation GET /repos/{owner}/{repo}/rulesets
64-
func (s *RepositoriesService) GetAllRulesets(ctx context.Context, owner, repo string, includesParents bool) ([]*RepositoryRuleset, *Response, error) {
65-
u := fmt.Sprintf("repos/%v/%v/rulesets?includes_parents=%v", owner, repo, includesParents)
78+
func (s *RepositoriesService) GetAllRulesets(ctx context.Context, owner, repo string, opts *RepositoryListRulesetsOptions) ([]*RepositoryRuleset, *Response, error) {
79+
u := fmt.Sprintf("repos/%v/%v/rulesets", owner, repo)
80+
81+
u, err := addOptions(u, opts)
82+
if err != nil {
83+
return nil, nil, err
84+
}
6685

6786
req, err := s.client.NewRequest("GET", u, nil)
6887
if err != nil {

github/repos_rules_test.go

Lines changed: 105 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func TestRepositoriesService_GetRulesForBranch(t *testing.T) {
4040
})
4141

4242
ctx := context.Background()
43-
rules, _, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch")
43+
rules, _, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", nil)
4444
if err != nil {
4545
t.Errorf("Repositories.GetRulesForBranch returned error: %v", err)
4646
}
@@ -55,9 +55,56 @@ func TestRepositoriesService_GetRulesForBranch(t *testing.T) {
5555
}
5656

5757
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+
})
58105

59106
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
60-
got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch")
107+
got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch", opts)
61108
if got != nil {
62109
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
63110
}
@@ -94,7 +141,7 @@ func TestRepositoriesService_GetAllRulesets(t *testing.T) {
94141
})
95142

96143
ctx := context.Background()
97-
ruleSet, _, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", false)
144+
ruleSet, _, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", nil)
98145
if err != nil {
99146
t.Errorf("Repositories.GetAllRulesets returned error: %v", err)
100147
}
@@ -124,9 +171,63 @@ func TestRepositoriesService_GetAllRulesets(t *testing.T) {
124171
}
125172

126173
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+
})
127228

128229
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
129-
got, resp, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", false)
230+
got, resp, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", opts)
130231
if got != nil {
131232
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
132233
}

0 commit comments

Comments
 (0)