[Testing 06] test: unit tests for access control, storage, user API keys and chat doc resolution

✅ merged · #229 · open-legal-products/mike ← amal66/mike · opened 3mo ago by amal66 · merged 3mo ago · +3,612-214 across 12 files · ↗ on GitHub

From the PR description

Summary

Unit tests for the backend's core libraries - access control, storage path/key handling, user API keys, and chat document-resolution - plus a v8 coverage ratchet. Ported from the amal66 fork (reference index #205) and adapted to this repo's backend/ layout and current behavior. Stacks on #228 (vitest harness).

Changes

  • backend/src/lib/__tests__/access.test.ts - 7 tests for listAccessibleProjectIds / filterAccessibleDocumentIds (owner vs shared-with access).
  • backend/src/lib/__tests__/storage.test.ts - 25 tests for the storage helpers.
  • backend/src/lib/__tests__/userApiKeys.test.ts - 10 tests (env clearing added so shell-exported keys can't leak into assertions).
  • backend/src/lib/__tests__/chatTypes.test.ts - 9 tests for resolveDoc / resolveDocLabel in lib/chat/types.ts.
  • backend/vitest.config.mts - node environment, 20s timeouts, v8 coverage over src/lib/** with threshold floors set just below measured coverage (statements 2 / branches 2 / functions 4 / lines 2 - a no-regression floor, not a target; raise as coverage grows).
  • @vitest/coverage-v8 dev-dependency + test:coverage script.

New tests: 51 (63 total with the harness seed suite).

Why

These libs gate who can read which project and document - the highest-value unit coverage in the codebase - and today nothing exercises them. The coverage ratchet means future PRs can only move lib coverage up.

What was deliberately not ported (and why)

  • Fork's org-RBAC access cases - access.ts here has no org branch.
  • upload.test.ts - tested a magic-bytes helper that doesn't exist here; not testable without production changes, which this PR doesn't make.
  • userSettings.test.ts - tested a fork-only tabular-model fallback. Worth noting: the fork's version fixes a real issue (the default tabular model fails for users who only have Claude/OpenAI keys); this repo still has the pre-fix behavior. Happy to raise that as its own small PR.

Testing

  • npm test --prefix backend - 5 files, 63/63 passing.
  • npm run test:coverage --prefix backend - passes thresholds.
  • npm run build --prefix backend - passes.

No production code is modified. Includes #228's commit as its base until proper stacking is possible - review the top commit only.

🤖 Generated with Claude Code

Our analysis

Add backend unit-test coverage ratchet — read the full analysis →

Think the analysis missed something the PR description covers?

Commits in this PR (2)

SHA Subject Author Date
4039b949 test: minimal vitest harness for backend and frontend QA Runner 2026-07-20 ↗ GitHub
commit body
Ported from amal66/mike#24 onto current main; lockfiles regenerated against
this tree. Adds vitest as a dev dependency with a `test` script in both
packages, excludes test files from the backend tsc build, and seeds one
suite per package (backend: downloadTokens, 12 tests; frontend: cn() utils,
8 tests). Verified locally: backend 12/12, frontend 8/8 passing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
c139acc3 test: unit tests for access, storage, userApiKeys, chat doc resolution QA Runner 2026-07-20 ↗ GitHub
commit body
Ported from the amal66 fork (see index Open-Legal-Products/mike#205)
onto current main, adapted to this repo's backend/ layout
(apps/api/src/lib -> backend/src/lib), plus a v8 coverage ratchet.

Suites ported (51 new tests, verified locally):
- access.test.ts (7): owner/shared/private project access, doc access,
  review sharing, document-ID filtering. Dropped the fork's "org RBAC"
  describe block (7 cases) - org_id/org_members multi-tenancy and the
  role/canManage fields do not exist in this repo's access.ts.
- storage.test.ts (25): filename normalization/sanitization, RFC 5987
  encoding, Content-Disposition, storage key helpers. Dropped the fork's
  vi.mock of lib/env - this repo has no env module; storage reads
  process.env directly and the tested helpers are pure.
- userApiKeys.test.ts (10): normalizeApiKeyProvider + hasEnvApiKey.
  Added a beforeEach env clear so shell-exported API keys can't leak
  into assertions.
- chatTypes.test.ts (9): resolveDoc/resolveDocLabel, which live in
  lib/chat/types.ts here (the fork's lib/chatTools.ts equivalent).
  Dropped generateSpotlightNonce cases (2) - no such export here.

Suites dropped entirely (subject not present in this repo):
- upload.test.ts - tested hasMagicBytes; this repo's lib/upload.ts is
  only the multer middleware and exports no magic-byte checker.
- userSettings.test.ts - tested resolveTabularModel (fork-only keyed-
  provider fallback); this repo resolves tabular_model via
  resolveModel with a static default.

Coverage ratchet: vitest.config.mts adds v8 coverage over src/lib/**
with floors measured against this tree (2.58% stmts, 2.00% branches,
4.61% funcs, 2.58% lines -> floors 2/2/4/2). Full suite: 5 files,
63 tests passing (incl. the pre-existing 12 in downloadTokens.test.ts);
npm run test:coverage and npm run build both pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Capture this PR into my fork

Download a Markdown prompt that tells Claude how to port every commit in this PR into your working tree. Run it via claude -p < capture-pull-229.md from inside the repo you want the changes in.

⬇ Download capture-pull-229.md