89 lines
1.9 KiB
Markdown
89 lines
1.9 KiB
Markdown
# Integration Failure Debug Example
|
|
|
|
Debugging API integration failures and contract violations.
|
|
|
|
## Error: 422 Unprocessable Entity from Payment API
|
|
|
|
```json
|
|
{
|
|
"detail": [
|
|
{
|
|
"loc": ["body", "amount"],
|
|
"msg": "ensure this value is greater than 0",
|
|
"type": "value_error.number.not_gt"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Investigation
|
|
|
|
### Request Sent
|
|
|
|
```python
|
|
# Our code
|
|
await payment_api.create_charge({
|
|
"amount": order.total, # Sending cents: 0 (empty cart!)
|
|
"currency": "usd",
|
|
"customer_id": "cus_123"
|
|
})
|
|
```
|
|
|
|
### API Contract (OpenAPI Spec)
|
|
|
|
```yaml
|
|
/charges:
|
|
post:
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
properties:
|
|
amount:
|
|
type: integer
|
|
minimum: 50 # $0.50 minimum!
|
|
```
|
|
|
|
**Issue**: Sending `amount: 0` violates API's minimum amount requirement.
|
|
|
|
## Root Cause
|
|
|
|
Order validation allows empty carts ($0 total). Payment API requires minimum $0.50.
|
|
|
|
## Fix
|
|
|
|
```python
|
|
from pydantic import BaseModel, validator
|
|
|
|
class CreateChargeRequest(BaseModel):
|
|
amount: int
|
|
currency: str
|
|
customer_id: str
|
|
|
|
@validator('amount')
|
|
def amount_must_meet_minimum(cls, v):
|
|
if v < 50: # Match API's minimum
|
|
raise ValueError('Amount must be at least $0.50 (50 cents)')
|
|
return v
|
|
|
|
# Service layer
|
|
async def create_charge(order: Order):
|
|
# Validate before API call
|
|
request = CreateChargeRequest(
|
|
amount=order.total_cents,
|
|
currency="usd",
|
|
customer_id=order.customer_id
|
|
)
|
|
return await payment_api.create_charge(request.dict())
|
|
```
|
|
|
|
## Prevention
|
|
|
|
1. **Schema validation**: Validate against OpenAPI spec
|
|
2. **Contract tests**: Test API contract compliance
|
|
3. **Integration tests**: Test with real API (or mocks matching spec)
|
|
|
|
---
|
|
|
|
**Result**: API contract violations caught at service boundary, not production.
|