MCPcopy Index your code
hub / github.com/coder/coder / TestGitLabRateLimit

Function TestGitLabRateLimit

coderd/externalauth/gitprovider/gitlab_test.go:265–383  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

263}
264
265func TestGitLabRateLimit(t *testing.T) {
266 t.Parallel()
267
268 t.Run("429WithRetryAfter", func(t *testing.T) {
269 t.Parallel()
270
271 mClock := quartz.NewMock(t)
272
273 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
274 w.Header().Set("Retry-After", "120")
275 w.WriteHeader(http.StatusTooManyRequests)
276 _, _ = w.Write([]byte(`{"message":"rate limit exceeded"}`))
277 }))
278 defer srv.Close()
279
280 gp, err := gitprovider.New("gitlab", srv.URL, srv.Client(), gitprovider.WithClock(mClock))
281 require.NoError(t, err)
282
283 _, err = gp.FetchPullRequestStatus(
284 t.Context(),
285 "test-token",
286 gitprovider.PRRef{Owner: "org", Repo: "repo", Number: 1},
287 )
288 require.Error(t, err)
289
290 rlErr, ok := errors.AsType[*gitprovider.RateLimitError](err)
291 require.True(t, ok, "error should be *RateLimitError, got: %T", err)
292
293 expected := mClock.Now().Add(120*time.Second + gitprovider.RateLimitPadding)
294 assert.True(t, rlErr.RetryAfter.Equal(expected), "expected %v, got %v", expected, rlErr.RetryAfter)
295 })
296
297 t.Run("403WithRateLimitReset", func(t *testing.T) {
298 t.Parallel()
299
300 mClock := quartz.NewMock(t)
301
302 resetTime := mClock.Now().Add(60 * time.Second)
303 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
304 w.Header().Set("RateLimit-Reset", fmt.Sprintf("%d", resetTime.Unix()))
305 w.WriteHeader(http.StatusForbidden)
306 _, _ = w.Write([]byte(`{"message":"rate limit exceeded"}`))
307 }))
308 defer srv.Close()
309
310 gp, err := gitprovider.New("gitlab", srv.URL, srv.Client(), gitprovider.WithClock(mClock))
311 require.NoError(t, err)
312
313 _, err = gp.FetchPullRequestStatus(
314 t.Context(),
315 "test-token",
316 gitprovider.PRRef{Owner: "org", Repo: "repo", Number: 1},
317 )
318 require.Error(t, err)
319
320 rlErr, ok := errors.AsType[*gitprovider.RateLimitError](err)
321 require.True(t, ok, "error should be *RateLimitError, got: %T", err)
322

Callers

nothing calls this directly

Calls 15

CloseMethod · 0.95
ClientMethod · 0.95
NewFunction · 0.92
WithClockFunction · 0.92
RunMethod · 0.65
SetMethod · 0.65
WriteMethod · 0.65
ContextMethod · 0.65
AddMethod · 0.65
FetchPullRequestDiffMethod · 0.65
HeaderMethod · 0.45

Tested by

no test coverage detected