Skip to content

test: docker discovery + copilot provider compatibility#543

Closed
anandgupta42 wants to merge 1 commit intomainfrom
test/hourly-20260328-1414
Closed

test: docker discovery + copilot provider compatibility#543
anandgupta42 wants to merge 1 commit intomainfrom
test/hourly-20260328-1414

Conversation

@anandgupta42
Copy link
Copy Markdown
Contributor

@anandgupta42 anandgupta42 commented Mar 28, 2026

What does this PR do?

Adds 20 new tests covering two previously untested modules discovered during proactive test discovery.

1. containerToConfigsrc/altimate/native/connections/docker-discovery.ts (6 new tests)

This function converts discovered Docker containers into ConnectionConfig objects used to connect to databases. Zero tests existed. When users run warehouse auto-discovery with Docker, incorrect config generation would silently produce broken connections (wrong type, leaked Docker-specific fields, missing credentials).

New coverage includes:

  • Full container conversion with all optional fields (user, password, database)
  • Omission of optional fields when not present on the container
  • Correct db_typeconfig.type mapping across all supported database types
  • Partial field presence (user without password, database without credentials)
  • Ensuring Docker-specific metadata (container_id, name, image, status) does not leak into ConnectionConfig

2. mapOpenAICompatibleFinishReason and getResponseMetadatasrc/provider/sdk/copilot/chat/ (14 new tests)

These utility functions power the GitHub Copilot provider integration. mapOpenAICompatibleFinishReason translates OpenAI-style finish reasons into the AI SDK's LanguageModelV2FinishReason enum. An incorrect mapping (e.g., tool_callsunknown instead of tool-calls) would cause the system to misinterpret model responses, potentially dropping tool call results. getResponseMetadata converts Unix epoch timestamps to Date objects for response tracking.

New coverage includes:

  • All five known finish reason mappings (stop, length, content_filter, function_call, tool_calls)
  • Null, undefined, and unrecognized string inputs falling back to unknown
  • Full metadata conversion with id, model, and timestamp
  • Null/undefined/missing input handling for all metadata fields
  • Edge case: created=0 produces epoch Date (not undefined) — tests the != null guard

Type of change

  • New feature (non-breaking change which adds functionality)

Issue for this PR

N/A — proactive test coverage

How did you verify your code works?

bun test test/altimate/docker-discovery.test.ts   # 6 pass, 23 expect() calls
bun test test/provider/copilot-compat.test.ts      # 14 pass, 24 expect() calls

Checklist

  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes

https://claude.ai/code/session_01J8xz7ijLjbzEe3mu7ajdWh

Summary by CodeRabbit

  • Tests
    • Added comprehensive test coverage for Docker container configuration conversion, validating proper field mapping and handling of optional parameters.
    • Added test coverage for Copilot SDK compatibility helpers, ensuring correct transformation of finish reasons and response metadata parsing.

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
Copy link
Copy Markdown

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 28, 2026

📝 Walkthrough

Walkthrough

Two new test files are added to the OpenCode package. The first tests conversion of Docker containers into connection configurations, verifying correct handling of all fields and optional properties. The second tests Copilot-compatible SDK helpers, validating finish reason mappings and response metadata transformations.

Changes

Cohort / File(s) Summary
Docker Discovery Tests
packages/opencode/test/altimate/docker-discovery.test.ts
New test suite for containerToConfig function covering field mapping from DockerContainer to ConnectionConfig, optional field handling, and validation that Docker-specific fields are not included in output.
Copilot Compatibility Tests
packages/opencode/test/provider/copilot-compat.test.ts
New test suite for two SDK helpers: mapOpenAICompatibleFinishReason (validating reason mappings including edge cases) and getResponseMetadata (verifying transformation of response fields with timestamp conversion).

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~15 minutes

Suggested labels

contributor

Poem

🐰 Two test files hop into view,
Docker configs and OpenAI too,
With assertions that verify the way,
Coverage blooms bright as the day!
The rabbit's tests run true and straight,
Quality code—it's simply great! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main changes: adding tests for docker discovery and copilot provider compatibility modules.
Description check ✅ Passed The description comprehensively covers all required template sections with detailed explanations of what changed, why, and how it was tested, though explicit checklist completion is embedded in narrative form.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch test/hourly-20260328-1414

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
packages/opencode/test/altimate/docker-discovery.test.ts (2)

52-68: Consider using test.each for better test isolation and output.

The for-loop approach works, but if any iteration fails, subsequent iterations won't run. Using test.each provides isolated test cases with clearer reporting.

Suggested refactor
-  test("preserves db_type as config.type for all supported databases", () => {
-    const dbTypes = ["postgres", "mysql", "sqlserver", "oracle", "duckdb", "sqlite", "mongodb"]
-
-    for (const dbType of dbTypes) {
-      const container: DockerContainer = {
-        container_id: "x",
-        name: `test-${dbType}`,
-        image: `${dbType}:latest`,
-        db_type: dbType,
-        host: "127.0.0.1",
-        port: 5432,
-        status: "running",
-      }
-      const config = containerToConfig(container)
-      expect(config.type).toBe(dbType)
-    }
-  })
+  test.each(["postgres", "mysql", "sqlserver", "oracle", "duckdb", "sqlite", "mongodb"])(
+    "preserves db_type=%s as config.type",
+    (dbType) => {
+      const container: DockerContainer = {
+        container_id: "x",
+        name: `test-${dbType}`,
+        image: `${dbType}:latest`,
+        db_type: dbType,
+        host: "127.0.0.1",
+        port: 5432,
+        status: "running",
+      }
+      const config = containerToConfig(container)
+      expect(config.type).toBe(dbType)
+    }
+  )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/opencode/test/altimate/docker-discovery.test.ts` around lines 52 -
68, Replace the looped assertion with isolated parameterized tests using Jest's
test.each to improve failure isolation and reporting: convert the for..of over
dbTypes in the test that calls containerToConfig into a
test.each([...dbTypes])(...) table-driven test that constructs the
DockerContainer object (container) per case and asserts
expect(config.type).toBe(dbType); keep the same fields and values (container_id,
name, image, db_type, host, port, status) and reference the containerToConfig
function and dbTypes values so each db type runs as its own test case.

5-5: Describe block name is misleading.

The describe block is named "full container with all fields" but contains tests for omission of optional fields, partial fields, and metadata exclusion. Consider renaming to just "containerToConfig" to accurately reflect the scope.

Suggested fix
-describe("containerToConfig: full container with all fields", () => {
+describe("containerToConfig", () => {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/opencode/test/altimate/docker-discovery.test.ts` at line 5, Rename
the misleading describe block title "containerToConfig: full container with all
fields" to simply "containerToConfig" so the block accurately reflects that it
tests various cases (optional omissions, partial fields, metadata exclusion);
locate the describe call string in the test file (the describe(...) that
currently reads "containerToConfig: full container with all fields") and update
it to "containerToConfig", and if any nested test descriptions or snapshots rely
on the old describe title, adjust those references to match the new describe
name.
🤖 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/docker-discovery.test.ts`:
- Around line 52-68: Replace the looped assertion with isolated parameterized
tests using Jest's test.each to improve failure isolation and reporting: convert
the for..of over dbTypes in the test that calls containerToConfig into a
test.each([...dbTypes])(...) table-driven test that constructs the
DockerContainer object (container) per case and asserts
expect(config.type).toBe(dbType); keep the same fields and values (container_id,
name, image, db_type, host, port, status) and reference the containerToConfig
function and dbTypes values so each db type runs as its own test case.
- Line 5: Rename the misleading describe block title "containerToConfig: full
container with all fields" to simply "containerToConfig" so the block accurately
reflects that it tests various cases (optional omissions, partial fields,
metadata exclusion); locate the describe call string in the test file (the
describe(...) that currently reads "containerToConfig: full container with all
fields") and update it to "containerToConfig", and if any nested test
descriptions or snapshots rely on the old describe title, adjust those
references to match the new describe name.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 47d4da55-e73d-41cf-8502-b28e3116db8e

📥 Commits

Reviewing files that changed from the base of the PR and between 9ba2114 and 72819b1.

📒 Files selected for processing (2)
  • packages/opencode/test/altimate/docker-discovery.test.ts
  • packages/opencode/test/provider/copilot-compat.test.ts

anandgupta42 added a commit that referenced this pull request Mar 28, 2026
… 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>
@anandgupta42
Copy link
Copy Markdown
Contributor Author

Consolidated into #545

anandgupta42 added a commit that referenced this pull request Mar 28, 2026
… 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants