Test Runner for Worktrees
Guide for running integration tests properly in both git worktrees and the main repository, with emphasis on environment variable sourcing and working directory context.
⚠️ CRITICAL FIRST STEP: Source Environment Variables
Before running ANY tests, pre-commit checks, or cargo commands in a worktree, ALWAYS source environment variables:
source /workspace/.devcontainer/.env
Why this matters:
- •Integration tests require
LANGSMITH_API_KEYand other credentials - •Pre-commit checks (
cargo test,cargo clippy, etc.) will fail without proper environment - •Worktrees do NOT automatically inherit environment variables from the main workspace
- •Tests will fail with authentication errors or panics if variables are missing
- •This was the root cause of test failures in issue #232
This applies to:
- •✅
cargo test- Any test command - •✅ Pre-commit checks - The full
cargo fmt && cargo check && cargo clippy && cargo testsuite - •✅
cargo clippy- Linting may trigger tests - •✅
cargo build- Build may run build scripts that need credentials - •✅ Any cargo command that might run tests or build scripts
Quick Check:
# Verify environment variables are set [ -n "$LANGSMITH_API_KEY" ] && echo "✓ Ready to test" || echo "✗ Run: source /workspace/.devcontainer/.env"
Quick Start for Pre-Commit Checks:
# One command to source and run full pre-commit suite source /workspace/.devcontainer/.env && cargo fmt && cargo check --workspace --all-features && cargo clippy --workspace --all-features -- -D warnings && cargo test --workspace --all-features && cargo fmt --check
Overview
During development in git worktrees, running tests requires careful attention to:
- •Environment variables - MUST be sourced from
/workspace/.devcontainer/.envbefore testing - •Working directory - Tests may behave differently in main vs worktree due to SDK version differences
- •Context awareness - Understanding whether you're in main workspace or a feature branch worktree
This skill codifies the lessons learned from issues #186 and #232 to prevent future confusion and wasted time.
Key Principles
1. Always Check Environment Variables First
Problem: Repeatedly asking users for credentials when they're already available in the environment.
Solution: Check if environment variables are set BEFORE asking the user.
# ✅ CORRECT: Check without exposing values [ -n "$LANGSMITH_API_KEY" ] && echo "LANGSMITH_API_KEY is set" || echo "LANGSMITH_API_KEY not set" [ -n "$ANTHROPIC_API_KEY" ] && echo "ANTHROPIC_API_KEY is set" || echo "ANTHROPIC_API_KEY not set"
If not set, source from devcontainer:
# Source devcontainer environment file source /workspace/.devcontainer/.env # Verify variables are now set [ -n "$LANGSMITH_API_KEY" ] && echo "LANGSMITH_API_KEY is set" || echo "LANGSMITH_API_KEY not set"
Never expose actual values:
# ❌ WRONG: Exposes sensitive data echo "LANGSMITH_API_KEY=$LANGSMITH_API_KEY" # ✅ CORRECT: Checks without exposing [ -n "$LANGSMITH_API_KEY" ] && echo "Set" || echo "Not set"
2. Always Verify Current Working Directory
Problem: Running tests from the wrong directory leads to unexpected failures and confusion.
Key Difference: Tests run from worktrees use the feature branch SDK, while tests from main workspace use the main branch SDK.
Example from #186:
- •Background tests ran from
/workspace(main branch) → FAILED (old SDK withoutQueuedenum) - •Worktree tests ran from
/workspace/wip/codekiln-186-test-helpers→ PASSED (new SDK withQueuedfrom PR #185)
Solution: Always verify working directory before running tests.
# ✅ CORRECT: Verify and navigate to worktree pwd cd /workspace/wip/<worktree-name> # Run tests from worktree cargo test --test integration_test -- --ignored --nocapture
3. Understand Test Types and Their Requirements
Different tests have different requirements and durations:
Unit Tests (No API Required):
# Fast (<1 second), no credentials needed cargo test --test integration_deployment_workflow test_deployment_url_extraction -- --nocapture
Helper Tests (API Required, 1-5 seconds):
# Require credentials, fast feedback cargo test --test integration_deployment_workflow test_list_github_integrations -- --ignored --nocapture cargo test --test integration_deployment_workflow test_list_github_repositories -- --ignored --nocapture cargo test --test integration_deployment_workflow test_find_integration_for_repo -- --ignored --nocapture
Full Workflow Tests (5-30 minutes):
# Long-running, creates real resources cargo test --test integration_deployment_workflow test_deployment_workflow -- --ignored --nocapture
Workflows
Workflow 1: Run Tests in Worktree (Recommended)
When working on a feature branch in a worktree, always run tests from the worktree directory.
Steps:
# Step 1: Navigate to worktree cd /workspace/wip/<worktree-name> # Step 2: Source environment variables (CRITICAL - do this first!) source /workspace/.devcontainer/.env # Step 3: Verify you're in the correct location pwd # Should output: /workspace/wip/<worktree-name> # Step 4: Verify environment variables are loaded [ -n "$LANGSMITH_API_KEY" ] && echo "✓ LANGSMITH_API_KEY is set" || echo "✗ LANGSMITH_API_KEY not set" # Step 5: Run tests # For unit tests (no API) cargo test --test integration_deployment_workflow test_deployment_url_extraction -- --nocapture # For helper tests (fast, require API) cargo test --test integration_deployment_workflow test_list_github_integrations -- --ignored --nocapture # For full workflow tests (slow, require API) cargo test --test integration_deployment_workflow test_deployment_workflow -- --ignored --nocapture
Why this matters:
- •Worktree has the feature branch code
- •Feature branch may have SDK changes not in main
- •Tests will use the correct SDK version
Workflow 2: Run Tests in Main Workspace
When testing against the main/release branch SDK, run from main workspace.
Steps:
# Step 1: Navigate to main workspace cd /workspace # Step 2: Verify branch git branch --show-current # Should output: main (or release/vX.Y.Z) # Step 3: Check environment variables [ -n "$LANGSMITH_API_KEY" ] && echo "LANGSMITH_API_KEY is set" || echo "LANGSMITH_API_KEY not set" # Step 4: Run tests cargo test --workspace --all-features
Workflow 3: Pre-Commit Testing
Before committing, run all checks from the worktree.
Steps:
# From worktree directory cd /workspace/wip/<worktree-name> # CRITICAL: Source environment variables first! source /workspace/.devcontainer/.env # Run pre-commit checklist cargo fmt cargo check --workspace --all-features cargo clippy --workspace --all-features -- -D warnings cargo test --workspace --all-features cargo fmt --check
Why from worktree:
- •Tests your feature branch changes
- •Catches issues before CI
- •Prevents wasted CI cycles
Common Mistakes to Avoid
❌ Mistake 1: Running Pre-Commit Checks Without Sourcing Environment
Wrong approach:
# Running pre-commit checks immediately in worktree without sourcing cd /workspace/wip/<worktree-name> cargo fmt && cargo check --workspace --all-features && cargo clippy --workspace --all-features -- -D warnings && cargo test --workspace --all-features && cargo fmt --check # Tests will fail with "byte index out of bounds" or authentication errors
Symptom: Tests fail with cryptic errors like:
- •
byte index 8 is out of bounds of \`` - •
thread 'main' panicked at cli/src/commands/prompt.rs:183:52 - •Authentication failures in integration tests
Correct approach:
# ALWAYS source environment variables FIRST in worktrees cd /workspace/wip/<worktree-name> source /workspace/.devcontainer/.env cargo fmt && cargo check --workspace --all-features && cargo clippy --workspace --all-features -- -D warnings && cargo test --workspace --all-features && cargo fmt --check
Why this happens:
- •Worktrees don't inherit environment variables from main workspace
- •Tests that require credentials fail without
LANGSMITH_API_KEY - •Some tests read empty environment variables and panic on string operations
- •This is the #1 cause of mysterious test failures in worktrees
❌ Mistake 2: Asking User for Credentials When Already Set
Wrong approach:
# Don't ask user to provide credentials without checking first echo "Please provide your LANGSMITH_API_KEY"
Correct approach:
# Check first
if [ -z "$LANGSMITH_API_KEY" ]; then
# Try sourcing from devcontainer
source /workspace/.devcontainer/.env
# If still not set, then ask
if [ -z "$LANGSMITH_API_KEY" ]; then
echo "LANGSMITH_API_KEY not found. Please set it in /workspace/.devcontainer/.env"
fi
fi
❌ Mistake 3: Running Tests from Wrong Directory
Wrong approach:
# Running from main workspace when working on feature branch cd /workspace cargo test --test integration_deployment_workflow -- --ignored # May fail due to old SDK version in main branch
Correct approach:
# Always verify pwd first pwd cd /workspace/wip/codekiln-186-test-helpers cargo test --test integration_deployment_workflow -- --ignored
❌ Mistake 4: Exposing Sensitive Environment Variables
Wrong approach:
# Never expose actual values
echo "LANGSMITH_API_KEY=$LANGSMITH_API_KEY"
echo "Using key: ${LANGSMITH_API_KEY}"
Correct approach:
# Only check if set, never show value [ -n "$LANGSMITH_API_KEY" ] && echo "LANGSMITH_API_KEY is set" || echo "LANGSMITH_API_KEY not set"
❌ Mistake 5: Not Understanding Test Context
Wrong approach:
# Running background tests from main workspace while developing in worktree cd /workspace cargo test --test integration_test -- --ignored & # This will test old SDK from main, not your changes
Correct approach:
# Run from worktree to test your changes cd /workspace/wip/<worktree-name> cargo test --test integration_test -- --ignored
Environment Variable Reference
Required Variables for Integration Tests
LangSmith API:
- •
LANGSMITH_API_KEY- API key for LangSmith authentication - •
LANGSMITH_ORGANIZATION_ID- Organization ID (optional, auto-detected)
Anthropic API:
- •
ANTHROPIC_API_KEY- API key for Claude models
Checking Variables (Template)
# Check all required variables at once echo "Checking required environment variables..." [ -n "$LANGSMITH_API_KEY" ] && echo "✓ LANGSMITH_API_KEY is set" || echo "✗ LANGSMITH_API_KEY not set" [ -n "$ANTHROPIC_API_KEY" ] && echo "✓ ANTHROPIC_API_KEY is set" || echo "✗ ANTHROPIC_API_KEY not set" # Source from devcontainer if any are missing if [ -z "$LANGSMITH_API_KEY" ] || [ -z "$ANTHROPIC_API_KEY" ]; then echo "Sourcing from /workspace/.devcontainer/.env..." source /workspace/.devcontainer/.env # Check again [ -n "$LANGSMITH_API_KEY" ] && echo "✓ LANGSMITH_API_KEY is set" || echo "✗ LANGSMITH_API_KEY not set" [ -n "$ANTHROPIC_API_KEY" ] && echo "✓ ANTHROPIC_API_KEY is set" || echo "✗ ANTHROPIC_API_KEY not set" fi
Test Execution Templates
Template 1: Run Single Test
# Navigate to worktree cd /workspace/wip/<worktree-name> # Source environment (ALWAYS do this first!) source /workspace/.devcontainer/.env # Verify location pwd # Run specific test cargo test --test <test_file> <test_name> -- --ignored --nocapture
Template 2: Run All Helper Tests
# Navigate to worktree cd /workspace/wip/<worktree-name> # Source environment (ALWAYS do this first!) source /workspace/.devcontainer/.env # Run all integration tests (fast ones) cargo test --test integration_deployment_workflow test_list_ -- --ignored --nocapture
Template 3: Run Long-Running Test in Background
# Navigate to worktree cd /workspace/wip/<worktree-name> # Source environment (ALWAYS do this first!) source /workspace/.devcontainer/.env # Run test in background cargo test --test integration_deployment_workflow test_deployment_workflow -- --ignored --nocapture > test_output.log 2>&1 & # Save PID echo $! > test_pid.txt # Monitor progress tail -f test_output.log
Troubleshooting
Tests Fail with "API key not found"
Symptom: Tests fail immediately with authentication errors.
Diagnosis:
# Check if env vars are set [ -n "$LANGSMITH_API_KEY" ] && echo "Set" || echo "Not set"
Solution:
# Source from devcontainer source /workspace/.devcontainer/.env # Verify [ -n "$LANGSMITH_API_KEY" ] && echo "Set" || echo "Not set"
Tests Fail with "type/enum not found"
Symptom: Tests fail with compilation errors about missing types or enum variants.
Diagnosis:
# Check current location pwd # If output is /workspace, you're in main workspace (may have old SDK)
Solution:
# Navigate to worktree with feature branch cd /workspace/wip/<worktree-name> # Run tests from worktree cargo test --test integration_test -- --ignored --nocapture
Tests Pass in Worktree, Fail in CI
Symptom: Tests work locally in worktree but fail when pushed to CI.
Common Causes:
- •Feature branch depends on another PR not yet merged
- •SDK changes in worktree not compatible with main branch
Diagnosis:
# Test from main workspace to simulate CI environment cd /workspace git checkout main git pull origin main cargo test --workspace --all-features
Solution:
- •Ensure prerequisite PRs are merged first
- •Update feature branch to include necessary changes
Background Tests Show Different Results
Symptom: Running tests in background from main workspace shows failures, but running same test from worktree passes.
Cause: Background tests are using main branch SDK, not feature branch SDK.
Solution:
# Always run from worktree when testing feature branch cd /workspace/wip/<worktree-name> cargo test --test integration_test -- --ignored --nocapture
Security Best Practices
Never Expose Credentials
✅ CORRECT:
# Check without exposing [ -n "$LANGSMITH_API_KEY" ] && echo "Set" || echo "Not set" # Use in commands without echoing cargo test --test integration_test -- --ignored --nocapture
❌ WRONG:
# Never do these echo $LANGSMITH_API_KEY echo "Key: $LANGSMITH_API_KEY" env | grep LANGSMITH
Store Credentials Securely
Best practices:
- •Store in
/workspace/.devcontainer/.env(gitignored) - •Never commit
.envfiles - •Use placeholders in documentation:
<your-api-key>
Integration with Other Tools
With git-worktrees Skill
After creating a worktree, use this skill to run tests:
# Create worktree (from git-worktrees skill) git worktree add -b codekiln/186-test-helpers wip/codekiln-186-test-helpers main # Navigate and run tests (from this skill) cd wip/codekiln-186-test-helpers [ -n "$LANGSMITH_API_KEY" ] && echo "Set" || source /workspace/.devcontainer/.env cargo test --test integration_test -- --ignored --nocapture
With Pre-Commit Checklist
Before committing, run the pre-commit checklist from worktree:
cd /workspace/wip/<worktree-name> cargo fmt && \ cargo check --workspace --all-features && \ cargo clippy --workspace --all-features -- -D warnings && \ cargo test --workspace --all-features && \ cargo fmt --check
Quick Reference
Environment Check One-Liner
[ -n "$LANGSMITH_API_KEY" ] && echo "✓ LANGSMITH_API_KEY set" || (source /workspace/.devcontainer/.env && [ -n "$LANGSMITH_API_KEY" ] && echo "✓ LANGSMITH_API_KEY set after source" || echo "✗ LANGSMITH_API_KEY not found")
Worktree Test One-Liner
cd /workspace/wip/<worktree-name> && [ -n "$LANGSMITH_API_KEY" ] || source /workspace/.devcontainer/.env && cargo test --test integration_test -- --ignored --nocapture
Complete Test Flow
# 1. Navigate to worktree cd /workspace/wip/<worktree-name> # 2. Source environment variables (CRITICAL FIRST STEP!) source /workspace/.devcontainer/.env # 3. Verify location pwd # 4. Run tests cargo test --test integration_test -- --ignored --nocapture
Related Documentation
- •Issue #186 - Where environment sourcing patterns were discovered
- •Issue #232 - Where test failures led to skill improvements
- •git-worktrees skill - For creating and managing worktrees
- •Pre-Commit Checklist -
@docs/dev/README.md"Pre-Commit Checklist" section - •GitHub Workflow -
@docs/dev/github-workflow.md
Key Takeaways
- •ALWAYS source environment variables FIRST:
source /workspace/.devcontainer/.env- •This applies to ALL cargo commands in worktrees, including pre-commit checks
- •
cargo test,cargo clippy,cargo check,cargo buildmay all require environment variables
- •Pre-commit checks MUST source environment first - Don't run the pre-commit suite without sourcing
- •Always verify
pwdbefore running tests - Ensure you're in the correct worktree - •Run tests from worktree when working on feature branch - Use feature branch SDK
- •Never expose sensitive environment variable values - Check without showing
- •Understand test context (main workspace vs worktree) - Different SDK versions
The #1 cause of test failures in worktrees is missing environment variables. Always source them first, especially before running pre-commit checks.
The #1 symptom: Cryptic panics like byte index 8 is out of bounds of \`` that disappear after sourcing environment variables.
These principles save time, prevent confusion, and improve security.