Files
ccs/tests
Aaron VuandClaude fe3447f487 fix(image-analysis): honor configured profile_backends at launch
resolveImageAnalysisRuntimeStatus defaulted to DEFAULT_IMAGE_ANALYSIS_CONFIG
when callers omitted the config argument. That constant ships empty
profile_backends and a gemini fallback_backend, so the launch paths that call
it without a config (settings profile dispatch and headless delegation) never
saw user-configured mappings.

A profile mapped to another backend still resolved to gemini, failed the
Gemini auth check, and silently dropped to native Read. Profiles whose model
has no vision support could not read images at all, even with a reachable
CLIProxy and an authenticated backend.

getImageAnalysisHookEnv already reads the saved config, so the launch env and
the runtime status disagreed on the same launch: CCS_IMAGE_ANALYSIS_BACKEND_ID
carried the mapped backend while the status object reported native-read.

Default to getImageAnalysisConfig() so both read the same source. Callers that
pass an explicit config keep their existing behavior.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-17 15:27:02 +07:00
..

CCS Test Suite

Root TypeScript and JavaScript tests run with Bun's test runner. Native shell, PowerShell, Docker, and standalone probes cover contracts that need a real platform or process boundary.

Ownership

Area Path Use for
Unit unit/ Focused module and command behavior
Integration integration/ Cross-module, process, proxy, auth, and web-server behavior
End to end e2e/ Packaged CLI workflows
npm package npm/ Installation, exports, and package behavior
Native native/ Unix and Windows shell behavior
Docker docker/ Compose and stable network/service contracts
Documentation docs/ Repository documentation invariants
Shared support shared/ Fixtures and helpers reused by suites
Mocks mocks/ Bounded test doubles and fixtures

Some source domains also keep focused tests in src/**/__tests__/. Follow the nearest established pattern and avoid moving tests solely for taxonomy.

Commands

Commands are defined in ../package.json. Bucket membership and execution live in ../scripts/run-test-bucket.js.

bun run test:fast      # Fast Bun test bucket
bun run test:slow      # Slow Bun test bucket
bun run test:all       # All root non-e2e Bun test buckets
bun run test:unit      # tests/unit
bun run test:npm       # tests/npm
bun run test:native    # Native Unix edge-case script
bun run test:e2e       # tests/e2e with fail-fast and extended timeout
bun run test           # Build, then test:all

For the normal contributor gate:

bun run format
bun run lint:fix
bun run validate

For the closest local equivalent to PR CI:

bun run validate:ci-parity

Dashboard tests use Vitest and are documented in ../ui/README.md.

Test Isolation

  • Set CCS_HOME to a temporary directory.
  • Never read or modify a contributor's real ~/.ccs/ or ~/.claude/.
  • Use getCcsDir() from ../src/utils/config-manager.ts for CCS paths.
  • Keep fixtures deterministic and free of credentials or private account data.
  • Use real behavior at the boundary under test; do not weaken assertions to hide regressions.

Adding Coverage

  • Add a focused unit test for isolated logic.
  • Add integration coverage when behavior crosses modules, processes, HTTP, or persistence boundaries.
  • Add e2e coverage when command routing or packaged CLI behavior is the contract.
  • Add native or Docker coverage only when platform/runtime behavior cannot be represented faithfully in Bun tests.
  • Run the smallest relevant command first, then broaden to the contributor or CI-parity gate when shared contracts changed.