Skip to content

Commit af69917

Browse files
authored
List Secret Scan Alerts with index-based pagination (#2446)
1 parent 10669e6 commit af69917

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

github/secret_scanning.go

+8
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ type SecretScanningAlertListOptions struct {
6161
Resolution string `url:"resolution,omitempty"`
6262

6363
ListCursorOptions
64+
65+
// List options can vary on the Enterprise type.
66+
// On Enterprise Cloud, Secret Scan alerts support requesting by page number
67+
// along with providing a cursor for an "after" param.
68+
// See: https://docs.github.com/en/enterprise-cloud@latest/rest/secret-scanning#list-secret-scanning-alerts-for-an-organization
69+
// Whereas on Enterprise Server, pagination is by index.
70+
// See: https://docs.github.com/en/[email protected]/rest/secret-scanning#list-secret-scanning-alerts-for-an-organization
71+
ListOptions
6472
}
6573

6674
// SecretScanningAlertUpdateOptions specifies optional parameters to the SecretScanningService.UpdateAlert method.

github/secret_scanning_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,73 @@ func TestSecretScanningService_ListAlertsForOrg(t *testing.T) {
146146
})
147147
}
148148

149+
func TestSecretScanningService_ListAlertsForOrgListOptions(t *testing.T) {
150+
client, mux, _, teardown := setup()
151+
defer teardown()
152+
153+
mux.HandleFunc("/orgs/o/secret-scanning/alerts", func(w http.ResponseWriter, r *http.Request) {
154+
testMethod(t, r, "GET")
155+
testFormValues(t, r, values{"state": "open", "secret_type": "mailchimp_api_key", "per_page": "1", "page": "1"})
156+
157+
fmt.Fprint(w, `[{
158+
"number": 1,
159+
"created_at": "1996-06-20T00:00:00Z",
160+
"url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1",
161+
"html_url": "https://github.com/o/r/security/secret-scanning/1",
162+
"locations_url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations",
163+
"state": "open",
164+
"resolution": null,
165+
"resolved_at": null,
166+
"resolved_by": null,
167+
"secret_type": "mailchimp_api_key",
168+
"secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2"
169+
}]`)
170+
})
171+
172+
ctx := context.Background()
173+
174+
// Testing pagination by index
175+
opts := &SecretScanningAlertListOptions{State: "open", SecretType: "mailchimp_api_key", ListOptions: ListOptions{Page: 1, PerPage: 1}}
176+
177+
alerts, _, err := client.SecretScanning.ListAlertsForOrg(ctx, "o", opts)
178+
if err != nil {
179+
t.Errorf("SecretScanning.ListAlertsForOrg returned error: %v", err)
180+
}
181+
182+
date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)}
183+
want := []*SecretScanningAlert{
184+
{
185+
Number: Int(1),
186+
CreatedAt: &date,
187+
URL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1"),
188+
HTMLURL: String("https://github.com/o/r/security/secret-scanning/1"),
189+
LocationsURL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations"),
190+
State: String("open"),
191+
Resolution: nil,
192+
ResolvedAt: nil,
193+
ResolvedBy: nil,
194+
SecretType: String("mailchimp_api_key"),
195+
Secret: String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2"),
196+
},
197+
}
198+
199+
if !cmp.Equal(alerts, want) {
200+
t.Errorf("SecretScanning.ListAlertsForOrg returned %+v, want %+v", alerts, want)
201+
}
202+
203+
const methodName = "ListAlertsForOrg"
204+
205+
testBadOptions(t, methodName, func() (err error) {
206+
_, _, err = client.SecretScanning.ListAlertsForOrg(ctx, "\n", opts)
207+
return err
208+
})
209+
210+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
211+
_, resp, err := client.SecretScanning.ListAlertsForOrg(ctx, "o", opts)
212+
return resp, err
213+
})
214+
}
215+
149216
func TestSecretScanningService_ListAlertsForRepo(t *testing.T) {
150217
client, mux, _, teardown := setup()
151218
defer teardown()

0 commit comments

Comments
 (0)