172 lines
4.0 KiB
Markdown
172 lines
4.0 KiB
Markdown
|
|
# Test Fixtures for Snapshot Testing
|
||
|
|
|
||
|
|
This directory contains captured Claude Code protocol interactions for snapshot-based integration testing.
|
||
|
|
|
||
|
|
## Fixture Structure
|
||
|
|
|
||
|
|
Each fixture is a JSON file representing a complete request-response cycle:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"name": "simple_text_query",
|
||
|
|
"description": "Basic text query with no tools",
|
||
|
|
"category": "text|tool_use|multi_tool|streaming",
|
||
|
|
"captured_at": "2025-01-15T10:30:00Z",
|
||
|
|
"request": {
|
||
|
|
"headers": {
|
||
|
|
"anthropic-version": "2023-06-01",
|
||
|
|
"anthropic-beta": "oauth-2025-04-20,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14",
|
||
|
|
"content-type": "application/json"
|
||
|
|
},
|
||
|
|
"body": {
|
||
|
|
"model": "claude-sonnet-4.5",
|
||
|
|
"max_tokens": 4096,
|
||
|
|
"messages": [...],
|
||
|
|
"tools": [...],
|
||
|
|
"stream": true
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"response": {
|
||
|
|
"type": "streaming",
|
||
|
|
"events": [
|
||
|
|
{
|
||
|
|
"event": "message_start",
|
||
|
|
"data": {
|
||
|
|
"type": "message_start",
|
||
|
|
"message": {
|
||
|
|
"id": "msg_***NORMALIZED***",
|
||
|
|
"type": "message",
|
||
|
|
"role": "assistant",
|
||
|
|
"content": [],
|
||
|
|
"model": "claude-sonnet-4.5",
|
||
|
|
"stop_reason": null,
|
||
|
|
"stop_sequence": null,
|
||
|
|
"usage": {
|
||
|
|
"input_tokens": 0,
|
||
|
|
"cache_creation_input_tokens": 0,
|
||
|
|
"cache_read_input_tokens": 0,
|
||
|
|
"output_tokens": 0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"event": "content_block_start",
|
||
|
|
"data": {
|
||
|
|
"type": "content_block_start",
|
||
|
|
"index": 0,
|
||
|
|
"content_block": {
|
||
|
|
"type": "text",
|
||
|
|
"text": ""
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"event": "content_block_delta",
|
||
|
|
"data": {
|
||
|
|
"type": "content_block_delta",
|
||
|
|
"index": 0,
|
||
|
|
"delta": {
|
||
|
|
"type": "text_delta",
|
||
|
|
"text": "Hello"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"event": "content_block_stop",
|
||
|
|
"data": {
|
||
|
|
"type": "content_block_stop",
|
||
|
|
"index": 0
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"event": "message_delta",
|
||
|
|
"data": {
|
||
|
|
"type": "message_delta",
|
||
|
|
"delta": {
|
||
|
|
"stop_reason": "end_turn",
|
||
|
|
"stop_sequence": null
|
||
|
|
},
|
||
|
|
"usage": {
|
||
|
|
"input_tokens": 100,
|
||
|
|
"output_tokens": 50
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"event": "message_stop",
|
||
|
|
"data": {
|
||
|
|
"type": "message_stop"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"assertions": {
|
||
|
|
"eventSequence": [
|
||
|
|
"message_start",
|
||
|
|
"content_block_start",
|
||
|
|
"content_block_delta",
|
||
|
|
"content_block_stop",
|
||
|
|
"message_delta",
|
||
|
|
"message_stop"
|
||
|
|
],
|
||
|
|
"contentBlocks": [
|
||
|
|
{
|
||
|
|
"index": 0,
|
||
|
|
"type": "text",
|
||
|
|
"hasContent": true
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"stopReason": "end_turn",
|
||
|
|
"hasUsage": true,
|
||
|
|
"minInputTokens": 50,
|
||
|
|
"minOutputTokens": 10
|
||
|
|
},
|
||
|
|
"notes": "Captured from real Claude Code interaction"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Normalized Values
|
||
|
|
|
||
|
|
Dynamic values are normalized during capture for reproducible tests:
|
||
|
|
|
||
|
|
- **IDs**: `msg_***NORMALIZED***`, `toolu_***NORMALIZED***`
|
||
|
|
- **Timestamps**: ISO 8601 format
|
||
|
|
- **Token counts**: Preserved but assertions use minimums
|
||
|
|
- **Text content**: Can vary by model, asserted structurally
|
||
|
|
|
||
|
|
## Fixture Categories
|
||
|
|
|
||
|
|
1. **text** - Simple text responses, no tools
|
||
|
|
2. **tool_use** - Single tool call scenarios
|
||
|
|
3. **multi_tool** - Multiple tool calls in one response
|
||
|
|
4. **streaming** - Long streaming responses with ping events
|
||
|
|
5. **error** - Error scenarios and edge cases
|
||
|
|
|
||
|
|
## Generating Fixtures
|
||
|
|
|
||
|
|
Run monitor mode to capture traffic:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
bun run build
|
||
|
|
./dist/index.js --monitor --debug "Your query here" 2>&1 | tee logs/capture.log
|
||
|
|
```
|
||
|
|
|
||
|
|
Then extract fixtures:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
bun tests/capture-fixture.ts logs/capture.log --output tests/fixtures/my_test.json
|
||
|
|
```
|
||
|
|
|
||
|
|
## Running Snapshot Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
bun test tests/snapshot.test.ts
|
||
|
|
```
|
||
|
|
|
||
|
|
This will:
|
||
|
|
1. Load all fixtures from this directory
|
||
|
|
2. Replay requests through the proxy
|
||
|
|
3. Compare responses to captured snapshots
|
||
|
|
4. Report any protocol violations
|