name: SDK Tests
on:
push:
branches: [ "main", "debug/*", "feature/*", "claude/*" ]
pull_request:
branches: [ main ]
# Security: Explicit permissions following principle of least privilege
permissions:
contents: read
jobs:
sdk-tests:
name: SDK Test Suite
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Install Rust
uses: dtolnay/rust-toolchain@1.92.0
- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-sdk-1.92.0-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-sdk-1.92.0-
${{ runner.os }}-cargo-
- name: Install SDK dependencies
working-directory: sdk
run: bun install --frozen-lockfile
- name: Lint SDK code
working-directory: sdk
run: bun run lint
- name: Type check SDK
working-directory: sdk
run: bun run type-check
- name: Validate response schemas
working-directory: sdk
run: |
echo "Validating Zod response schemas..."
# Check that response-schemas.ts exists
if [ ! -f "src/response-schemas.ts" ]; then
echo "Error: src/response-schemas.ts not found"
exit 1
fi
# Count tools in schema map (should be >= 35)
MAP_COUNT=$(grep -E "^\s+\"[a-z_]+\":" src/response-schemas.ts | wc -l)
echo "Found $MAP_COUNT tools in ToolResponseSchemaMap"
if [ "$MAP_COUNT" -lt 35 ]; then
echo "Warning: Only $MAP_COUNT tools have response schemas (expected >= 35)"
fi
# Run schema unit tests
bun test test/unit/response-schemas.test.ts || {
echo "Response schema tests failed - schemas may be out of sync"
exit 1
}
echo "Response schema validation passed"
- name: Build SDK bridge
working-directory: sdk
run: bun run build
- name: Run SDK unit tests
working-directory: sdk
run: bun run test:unit
- name: Build Pierre server (debug, for integration tests)
run: cargo build
env:
CARGO_INCREMENTAL: 0
- name: Generate SDK types from server
run: |
./target/debug/pierre-mcp-server &
SERVER_PID=$!
for i in {1..30}; do
curl -s http://localhost:8081/health > /dev/null 2>&1 && break
sleep 1
done
cd sdk && bun run generate-types || true
kill $SERVER_PID 2>/dev/null || true
env:
DATABASE_URL: "sqlite::memory:"
PIERRE_MASTER_ENCRYPTION_KEY: "rEFe91l6lqLahoyl9OSzum9dKa40VvV5RYj8bHGNTeo="
PIERRE_RSA_KEY_SIZE: "2048"
HTTP_PORT: "8081"
STRAVA_CLIENT_ID: "test_client_id_ci"
STRAVA_CLIENT_SECRET: "test_client_secret_ci"
STRAVA_REDIRECT_URI: "http://localhost:8080/auth/strava/callback"
- name: Run SDK integration tests
working-directory: sdk
run: bun run test:integration
env:
DATABASE_URL: "sqlite::memory:"
PIERRE_MASTER_ENCRYPTION_KEY: "rEFe91l6lqLahoyl9OSzum9dKa40VvV5RYj8bHGNTeo="
PIERRE_RSA_KEY_SIZE: "2048"
STRAVA_CLIENT_ID: "test_client_id_ci"
STRAVA_CLIENT_SECRET: "test_client_secret_ci"
STRAVA_REDIRECT_URI: "http://localhost:8080/auth/strava/callback"
- name: Run SDK E2E tests
working-directory: sdk
run: bun run test:e2e
env:
DATABASE_URL: "sqlite::memory:"
PIERRE_MASTER_ENCRYPTION_KEY: "rEFe91l6lqLahoyl9OSzum9dKa40VvV5RYj8bHGNTeo="
PIERRE_RSA_KEY_SIZE: "2048"
STRAVA_CLIENT_ID: "test_client_id_ci"
STRAVA_CLIENT_SECRET: "test_client_secret_ci"
STRAVA_REDIRECT_URI: "http://localhost:8080/auth/strava/callback"
- name: Run bridge test suite (validates run_bridge_tests.sh)
run: ./scripts/run_bridge_tests.sh
env:
DATABASE_URL: "sqlite::memory:"
PIERRE_MASTER_ENCRYPTION_KEY: "rEFe91l6lqLahoyl9OSzum9dKa40VvV5RYj8bHGNTeo="
PIERRE_RSA_KEY_SIZE: "2048"
STRAVA_CLIENT_ID: "test_client_id_ci"
STRAVA_CLIENT_SECRET: "test_client_secret_ci"
STRAVA_REDIRECT_URI: "http://localhost:8080/auth/strava/callback"
- name: Upload SDK test results
if: always()
uses: actions/upload-artifact@v4
with:
name: sdk-test-results
path: sdk/test-results/
retention-days: 7
if-no-files-found: ignore