• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Freegle / Iznik / 22075
71%

Build:
DEFAULT BRANCH: master
Ran 18 Jun 2026 09:38AM UTC
Jobs 4
Files 1290
Run time 2min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

18 Jun 2026 09:07AM UTC coverage: 70.848% (+0.02%) from 70.828%
22075

push

circleci

web-flow
fix(batch): retry Discourse rate-limits in DiscourseClient so the not-signed-up report isn't inflated (#797)

discourse:not-signed-up resolves each Discourse user's MT external_id via the
admin API (getUser) to decide which Freegle groups are represented by an active
mod. V1 (Utils::curlWithRetry + the GetUser/GetAllUsers/GetUserEmail error
checks) retried on rate-limiting (HTTP 429, or an "errors" body containing "too
many") up to 60× with a 1s delay, and threw on any other error response — so the
run aborted loudly rather than emailing a report built on partially-resolved
users.

The Laravel port did neither: `(array) ...->json()` with no retry and no error
check. A 429 silently became a body with no single_sign_on_record, so
getUser returned no external_id, the mod looked absent from Discourse, and every
group they cover was falsely flagged NOT REPRESENTED (and the mod listed under
"volunteers not on Discourse"). With ~410 users each needing a getUser call
against the rate-limited admin endpoint, partial 429s inflate the report
unpredictably.

Restore V1 behaviour: a single getJson() chokepoint retries on rate-limiting
(429 / "too many"), throws after max_retries, and throws on any other error or
non-JSON response. getAllUsers/getUser/getUserEmail all route through it.
Retry policy is configurable (freegle.discourse.max_retries / retry_delay_s,
defaulting to V1's 60 / 1s; throttle_us now explicit too).

Co-authored-by: root <root@localhost>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

11009 of 14617 branches covered (75.32%)

Branch coverage included in aggregate %.

25 of 28 new or added lines in 1 file covered. (89.29%)

36 existing lines in 2 files now uncovered.

119105 of 169036 relevant lines covered (70.46%)

36.26 hits per line

Uncovered Changes

Lines Coverage ∆ File
3
89.36
89.36% iznik-batch/app/Services/DiscourseClient.php

Coverage Regressions

Lines Coverage ∆ File
35
87.79
-0.19% iznik-nuxt3/modtools/components/ModMessage.vue
1
80.6
-0.11% iznik-nuxt3/components/LoginModal.vue
Jobs
ID Job ID Ran Files Coverage
22075 go - 22075 18 Jun 2026 09:38AM UTC 136
83.0
CircleCI Job 22075
22075 laravel - 22075 18 Jun 2026 09:38AM UTC 448
67.51
CircleCI Job 22075
22075 playwright - 22075 18 Jun 2026 09:38AM UTC 70
22.96
CircleCI Job 22075
22075 vitest - 22075 18 Jun 2026 09:38AM UTC 705
68.72
CircleCI Job 22075
Source Files on build 22075
  • Tree
  • List 1290
  • Changed 6
  • Source Changed 0
  • Coverage Changed 6
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • CircleCI Build #22075
  • d4145b1f on github
  • Prev Build on master (#22006)
  • Next Build on master (#22151)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc