Repository navigation
[quality] 14 commenter-auth catch arms (10 commands + auth.ts:181/210/217/224) are unreachable — only module mocks in unit tests keep them covered #386
Description
Finding
Fourteen catch arms that wrap the commenter-authorization probes are unreachable from the shipped bundle. The three probes they guard — checkOrgMember (src/utils/auth.ts:37-67), checkCollaborator (:77-104) and checkIssueComments (:116-142) — each wrap their whole body in try { … } catch { core.warning(…); return false }, so they never reject. The wrappers around them can only fire if the probe module itself is replaced, which is exactly how the unit suite reaches them:
| wrapper | file:line | unit test that reaches it | how |
|---|---|---|---|
could not check commentor auth |
src/issueComment/close.ts:40, reopen.ts:37 |
__tests__/issueCommentTest/errorPaths.test.ts |
vi.mock('../../src/utils/auth', { spy: true }) + checkCollaborator.mockRejectedValueOnce |
could not check commenter auth |
lock.ts:47, milestone.ts:40, src/labels/remove.ts:37 |
same / __tests__/label/errorPaths.test.ts |
same |
could not check Commentor auth |
retitle.ts:45 |
same | same |
couldn ot check commentor Auth |
unassign.ts:58 |
same | same |
could not get authorized users |
assign.ts:61, cc.ts:58, uncc.ts:57 |
same | getOrgCollabCommentUsers.mockRejectedValueOnce |
could not get authorized user |
src/utils/auth.ts:181 (getOrgCollabCommentUsers) |
__tests__/utils/auth.test.ts |
makes core.warning throw (logger down) |
error in checking org member / could not check collaborator / could not check issue comments |
src/utils/auth.ts:210, :217, :224 (checkCommenterAuth) |
__tests__/utils/auth.test.ts:263-278 |
same core.warning throw |
errorPaths.test.ts:19 says so itself: "could not check auth" branches are only reachable when the helper rejects.
Evidence (main @ aa6a0f8, Node v26.10.0, vitest 5.0.3):
- Unit:
npx vitest run --coverage→ 100 % lines (132 files / 2057 tests). All fourteen arms are green only because of the module mocks above. - End-to-end:
npm run test:coverage:e2eon a scratch branch =origin/main+ the heads of all 33 open hold-gated bundle PRs (test(bundle): drive root-OWNERS authorization on an issue and the OWNERS-based /lgtm refusal through dist/index.js #283 … test(bundle): drive the sweep cron's enqueued outcome (sweep.ts:75) through dist/index.js #385; 53 files / 420 tests pass) → 97.64 % lines ofsrc/. All fourteen arms have 0 hits; together withauth.ts:44-45(payload.repository === undefineddebug) they are the whole e2e residual of the auth path. - Reachability:
grep -n "throw\|return false" src/utils/auth.ts— everythrowin the three probes is inside their owntry; the only way out isreturn.context.repois evaluated inside those sametryblocks.
Why it matters for the test suite rather than tidiness: the unit report cannot distinguish "exercised by the bundle" from "exercised by a mock of the callee", so these arms keep a green line over error messages — including the misspelt couldn ot check commentor Auth — that no user can ever see, and the tests that cover them pin wording the action cannot emit.
Recommendation
One PR, one deliverable (the same mechanical edit at every site):
- drop the
try { … } catch (e) { throw new Error('could not check … auth: ' + e) }wrappers inclose.ts,reopen.ts,lock.ts,milestone.ts,retitle.ts,unassign.ts,labels/remove.tsand thecould not get authorized userswrappers inassign.ts,cc.ts,uncc.ts, calling the probe directly - drop the four wrappers inside
src/utils/auth.ts(getOrgCollabCommentUsers:179-182,checkCommenterAuth:205-225) - delete the corresponding
mockRejectedValueOncecases in__tests__/issueCommentTest/errorPaths.test.ts,__tests__/label/errorPaths.test.tsand thelogger downcases in__tests__/utils/auth.test.ts -
npm run build && npm run packso the dist/ drift gate passes
Alternative, if the wrappers are wanted as belt-and-braces: keep them but make the probes actually able to reject (rethrow non-404/302 statuses instead of return false), so the arms become reachable and the bundle suite can drive them. That is a behaviour change — today an API outage silently denies the command — and so also a maintainer call.
This touches production source, so it is not a PR this lane opens; it is filed for a maintainer. Companion to #366 (dead exports kept green by their own unit tests); kept separate because the fix sites do not overlap.
Priority
- Impact: low
- Effort: low
🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5q9t | SHA: 4948f6d
— hive: agent=quality backend=copilot model=claude-fable-5.1
Activity
hivecommons-hive commentedon Oct 8, 2026
/kind cleanup
🐝 Hive Agent:
quality| Instance:hosted-available-lke648397-260827-5q9t| SHA:aa6a0f8— hive: agent=quality backend=copilot model=claude-fable-5.1 copilot=1.0.88
refactor(auth): drop unreachable commenter-auth catch wrappers (cncf#449