test: lazy utility and credential-store — error retry, reset, sensitive field coverage#534
test: lazy utility and credential-store — error retry, reset, sensitive field coverage#534anandgupta42 wants to merge 1 commit intomainfrom
Conversation
…ve field coverage Cover untested behaviors in lazy() (error non-caching and reset) that power shell detection, plus complete isSensitiveField unit coverage for BigQuery/SSL/SSH fields. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01WoqeutgfwXNcktweCKoLwd
There was a problem hiding this comment.
Claude Code Review
This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.
Tip: disable this comment in your organization's Code Review settings.
📝 WalkthroughWalkthroughTwo test files were expanded with additional unit test cases: credential field sensitivity detection now includes Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Suggested labels
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (3)
packages/opencode/test/util/lazy.test.ts (1)
37-78: Consider removing PR-scoped marker comments before merge.
// altimate_change start/endlooks like temporary review scaffolding and can be dropped to keep test files clean.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/opencode/test/util/lazy.test.ts` around lines 37 - 78, Remove the temporary PR-scoped marker comments "// altimate_change start" and "// altimate_change end" that wrap the added tests; edit the test file to delete those two comment lines so the three tests ("reset() clears cached value and re-invokes factory", "factory error is not cached — retries on next call", and "reset() after error allows fresh initialization") remain intact and unchanged (references: the lazy() usage and getValue.reset() in the tests) with no scaffold comments left.packages/opencode/test/altimate/connections.test.ts (2)
839-845: Empty catch block silently swallows connection errors.While acceptable for retry scenarios, logging a debug message would aid troubleshooting when the native binding fails unexpectedly.
♻️ Consider adding minimal logging
} catch { + // Uncomment for debugging native binding issues: + // console.debug(`DuckDB connection attempt ${attempt} failed`) if (attempt < maxAttempts) { // Brief delay before retry to let concurrent native-binding loads settle await new Promise((r) => setTimeout(r, 100 * attempt)) } // Native binding unavailable — tests will skip via duckdbReady guard }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/opencode/test/altimate/connections.test.ts` around lines 839 - 845, Change the empty catch to capture the error (e.g., catch (err)) and emit a minimal debug log with the error and current retry state so connection failures aren’t silently swallowed; include attempt and maxAttempts in the message and use an existing debug/logging mechanism (for example console.debug or your test logger) so the duckdbReady guard behavior can be traced when native binding load fails.
857-864: Usetest.skipIfinstead of early returns for clearer test skipping.The
if (!duckdbReady) returnpattern silently passes skipped tests, which can be misleading in CI reporting. Bun'stest.skipIfsupports runtime evaluation of conditions, so you can refactor the tests to use it. SinceduckdbReadyis set inbeforeAll, the skip condition will evaluate to the correct value before test execution.♻️ Suggested refactor
- test("execute SELECT 1", async () => { - if (!duckdbReady) return + test.skipIf(!duckdbReady)("execute SELECT 1", async () => { const result = await connector.execute("SELECT 1 AS num") expect(result.columns).toEqual(["num"]) expect(result.rows).toEqual([[1]]) expect(result.row_count).toBe(1) expect(result.truncated).toBe(false) })Apply the same pattern to all other tests in this block.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/opencode/test/altimate/connections.test.ts` around lines 857 - 864, Replace the early-return skip pattern in these tests with Bun's runtime-aware test.skipIf: instead of beginning the test body with "if (!duckdbReady) return", use test.skipIf(!duckdbReady, "DuckDB not ready") (or the equivalent skipIf wrapper) so the test is reported as skipped rather than silently passing; update the SELECT test that calls connector.execute("SELECT 1 AS num") (and apply the same change to the other tests in this block that reference duckdbReady and connector) to use test.skipIf(!duckdbReady, ...) so the skip is evaluated correctly after beforeAll sets duckdbReady.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/opencode/test/altimate/connections.test.ts`:
- Around line 839-845: Change the empty catch to capture the error (e.g., catch
(err)) and emit a minimal debug log with the error and current retry state so
connection failures aren’t silently swallowed; include attempt and maxAttempts
in the message and use an existing debug/logging mechanism (for example
console.debug or your test logger) so the duckdbReady guard behavior can be
traced when native binding load fails.
- Around line 857-864: Replace the early-return skip pattern in these tests with
Bun's runtime-aware test.skipIf: instead of beginning the test body with "if
(!duckdbReady) return", use test.skipIf(!duckdbReady, "DuckDB not ready") (or
the equivalent skipIf wrapper) so the test is reported as skipped rather than
silently passing; update the SELECT test that calls connector.execute("SELECT 1
AS num") (and apply the same change to the other tests in this block that
reference duckdbReady and connector) to use test.skipIf(!duckdbReady, ...) so
the skip is evaluated correctly after beforeAll sets duckdbReady.
In `@packages/opencode/test/util/lazy.test.ts`:
- Around line 37-78: Remove the temporary PR-scoped marker comments "//
altimate_change start" and "// altimate_change end" that wrap the added tests;
edit the test file to delete those two comment lines so the three tests
("reset() clears cached value and re-invokes factory", "factory error is not
cached — retries on next call", and "reset() after error allows fresh
initialization") remain intact and unchanged (references: the lazy() usage and
getValue.reset() in the tests) with no scaffold comments left.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: b0569021-4a2f-4961-8141-75855fb9d772
📒 Files selected for processing (2)
packages/opencode/test/altimate/connections.test.tspackages/opencode/test/util/lazy.test.ts
… fixes Consolidates PRs #515, #526, #527, #528, #530, #531, #532, #533, #534, #535, #536, #537, #538, #539, #540, #541, #542, #543 into a single PR. Changes: - 30 files changed, ~3000 lines of new test coverage - Deduplicated redundant tests: - `copilot-compat.test.ts`: removed duplicate `mapOpenAICompatibleFinishReason` tests (already covered in `copilot/finish-reason.test.ts`) - `lazy.test.ts`: removed duplicate error-retry and `reset()` tests - `transform.test.ts`: kept most comprehensive version (#535) over subset PRs (#539, #541) - Bug fixes from PR #528: - `extractEquivalenceErrors`: `null` entries in `validation_errors` crashed with TypeError (`null.message` throws before `??` evaluates). Fixed with optional chaining: `e?.message` - `extractSemanticsErrors`: same fix applied - Updated test from `expect(...).toThrow(TypeError)` to verify the fix Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Consolidated into #545 |
… fixes (#545) * test: MCP auth — URL validation, token expiry, and client secret lifecycle Cover security-critical McpAuth functions (getForUrl, isTokenExpired) and McpOAuthProvider.clientInformation() expiry detection that had zero test coverage. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01CqcvvXp5hUVsNU441DFTwb * test: copilot provider — finish reason mapping and tool preparation Add 27 unit tests for three previously untested copilot SDK functions that are critical to the GitHub Copilot provider integration path. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: log-buffer, RWLock concurrency, SSE chunk splitting — 13 new tests Cover three untested risk areas: dbt ring buffer overflow (ties to #249 TUI corruption fix), reader-writer lock starvation ordering, and SSE event parsing across chunk boundaries and abort signals. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01153R7Dh9BMKiarndEUraBk * test: SQL tool formatters — check, equivalence, semantics (38 tests) Export and test pure formatting functions across three SQL analysis tools that had zero test coverage. Discovered a real bug: null entries in validation_errors crash extractEquivalenceErrors (TypeError on null.message). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01Lz8zxrbwHXfsC2FbHxXZh9 * test: stats display + MCP OAuth XSS prevention — 26 new tests Add first-ever test coverage for the `altimate-code stats` CLI output formatting and the MCP OAuth callback server's HTML escaping (XSS prevention boundary). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: util — proxy detection and lazy error recovery Add tests for proxied() corporate proxy detection (6 tests) and lazy() error recovery + reset behavior (2 tests) to cover untested code paths that affect package installation and initialization. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01EDCRjjHdb1dWvxyAfrLuhw * test: session compaction — observation mask and arg truncation Cover createObservationMask() which generates the replacement text when old tool outputs are pruned during session compaction. Tests verify format correctness, UTF-8 byte counting, arg truncation with surrogate pair safety, unserializable input handling, and fingerprint capping. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01SHDrUNHjUpTwPvcjQcJ4ug * test: bus — publish/subscribe/once/unsubscribe mechanics Zero dedicated tests existed for the core event Bus that powers session updates, permission prompts, file watcher notifications, and SSE delivery. New coverage includes subscriber delivery, unsubscribe correctness, wildcard subscriptions, type isolation, and Bus.once auto-removal. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01GchE7rUZayV1ouLEseVndK * test: lazy utility and credential-store — error retry, reset, sensitive field coverage Cover untested behaviors in lazy() (error non-caching and reset) that power shell detection, plus complete isSensitiveField unit coverage for BigQuery/SSL/SSH fields. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01WoqeutgfwXNcktweCKoLwd * test: provider/transform — temperature, topP, topK, smallOptions, maxOutputTokens Add 35 tests for five previously untested ProviderTransform functions that control model-specific inference parameters for all users. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_014NGgCMNXEg4Nn3JCpzDg5w * test: fingerprint + context — fill coverage gaps in core utilities Add tests for Fingerprint.refresh() cache invalidation and dbt-packages tag detection (both untested code paths), plus first-ever unit tests for the Context utility (AsyncLocalStorage wrapper) used by every module. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01N8kgPYhXX7SrYnZKJLiTfC * test: session todo — CRUD lifecycle with database persistence Adds 6 tests for the Todo module (zero prior coverage). Covers insert/get round-trip, position ordering, empty-array clear, replacement semantics, bus event emission, and cross-session isolation. These guard the TUI todo panel against stale or phantom tasks. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: finops recommendations + dbt manifest edge cases — 12 new tests Cover untested recommendation logic in warehouse-advisor and credit-analyzer edge cases in dbt manifest parsing that affect real-world dbt projects. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01XhZy7vaqdasKH5hQ6H9ee3 * test: provider — sampling parameter functions (temperature, topP, topK) Add 28 tests for ProviderTransform.temperature(), topP(), and topK() which had zero direct test coverage. These pure functions control LLM sampling behavior per model family and wrong values cause degraded output quality. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_011NoVCnMW9Kw6eh92ayU7GB * test: session utilities — isDefaultTitle, fromRow/toRow, createObservationMask Add 17 tests covering two untested modules in the session subsystem: session identity helpers and compaction observation masks. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: provider — temperature, topP, topK model parameter defaults Add 30 unit tests for ProviderTransform.temperature(), topP(), and topK() which are pure functions that return model-specific sampling defaults. These functions are the sole source of per-model parameter configuration and were previously untested, risking silent regressions when adding or modifying model ID patterns (e.g., kimi-k2 sub-variants, minimax-m2 dot/hyphen variants). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01WZthZmQczd51XXSjhiABNH * test: agent — .env read protection and analyst write denial Verify security-relevant agent permission defaults: builder agent asks before reading .env files (preventing accidental secret exposure), and analyst agent denies file modification tools (edit/write/todowrite/todoread). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01Wp9YaEvw6jAAL73VVdXFxA * test: docker discovery + copilot provider compatibility Add 20 new tests covering two previously untested modules: 1. Docker container discovery (containerToConfig) — verifies correct ConnectionConfig shape generation from discovered containers 2. Copilot provider finish-reason mapping and response metadata — ensures OpenAI-compatible finish reasons are correctly translated and response timestamps are properly converted Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01J8xz7ijLjbzEe3mu7ajdWh * test: consolidate 18 test PRs — 434 new tests, deduplicated, with bug fixes Consolidates PRs #515, #526, #527, #528, #530, #531, #532, #533, #534, #535, #536, #537, #538, #539, #540, #541, #542, #543 into a single PR. Changes: - 30 files changed, ~3000 lines of new test coverage - Deduplicated redundant tests: - `copilot-compat.test.ts`: removed duplicate `mapOpenAICompatibleFinishReason` tests (already covered in `copilot/finish-reason.test.ts`) - `lazy.test.ts`: removed duplicate error-retry and `reset()` tests - `transform.test.ts`: kept most comprehensive version (#535) over subset PRs (#539, #541) - Bug fixes from PR #528: - `extractEquivalenceErrors`: `null` entries in `validation_errors` crashed with TypeError (`null.message` throws before `??` evaluates). Fixed with optional chaining: `e?.message` - `extractSemanticsErrors`: same fix applied - Updated test from `expect(...).toThrow(TypeError)` to verify the fix Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: resolve typecheck errors in test files - `prepare-tools.test.ts`: use template literal type for provider tool `id` - `compaction-mask.test.ts`: use `as unknown as` for branded type casts Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove flaky `setTimeout` in todo bus event test `Bus.publish` is synchronous — the event is delivered immediately, no 50ms delay needed. Removes resource contention risk in parallel CI. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address CodeRabbit review feedback - `formatCheck`: harden validation error formatting against null entries using optional chaining and filter (CodeRabbit + GPT consensus) - `extractEquivalenceErrors`: propagate extracted errors into `formatEquivalence` output to prevent title/output inconsistency - `todo.test.ts`: use `tmpdir({ git: true })` + `await using` for proper test isolation instead of shared project root Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
What does this PR do?
1.
lazy()—src/util/lazy.ts(3 new tests)The
lazy()utility powers critical initialization paths includingShell.preferredandShell.acceptable(which determine which shell is used for all tool execution). The existing 3 tests only covered basic memoization and type support — two important behaviors were completely untested:whichfailure during shell detection), the error must NOT be cached. The next call should retry the factory. Without this, a single transient failure would permanently break shell detection for the entire session.reset()method: Used in Shell tests'beforeEach/afterEachand by the file watcher, but never directly tested. Verifies thatreset()clears both the cached value and the loaded flag, causing the factory to be re-invoked on the next call.Specific scenarios covered:
reset()clears cached value and re-invokes factoryreset()after error allows fresh initialization2.
isSensitiveField—src/altimate/native/connections/credential-store.ts(1 new test)The
SENSITIVE_FIELDSset incredential-store.tscontains 20 field names that should be stripped from config files and stored in the OS keychain. The existing unit test forisSensitiveFieldcovered 14 of 20 fields. This PR adds explicit assertions for the remaining 6 fields:credentials_json— BigQuery service account credentialskeyfile_json— BigQuery keyfile contentssl_key,ssl_cert,ssl_ca— TLS/SSL connection credentialsssh_password— SSH tunnel authenticationThese fields are already correctly handled by the implementation, but without explicit test coverage a future refactor could accidentally remove them from the set without any test failure.
Type of change
Issue for this PR
N/A — proactive test coverage
How did you verify your code works?
Checklist
https://claude.ai/code/session_01WoqeutgfwXNcktweCKoLwd
Summary by CodeRabbit
Tests