(mess) Stuffing commit.
This commit is contained in:
@@ -94,6 +94,48 @@ apophis replay --artifact reports/apophis/failure-2026-04-28T12-30-22Z.json
|
||||
|
||||
Fix the bug in your handler. Re-run verify. The failure should now pass.
|
||||
|
||||
## Behavioral vs Structural Contracts
|
||||
|
||||
APOPHIS contracts should verify **behavior**, not structure. Fastify and `@fastify/swagger` already enforce status codes, required fields, and types. Behavioral contracts catch what schemas cannot:
|
||||
|
||||
| Structural (avoid) | Behavioral (prefer) |
|
||||
|---|---|
|
||||
| `status:200` | `response_body(this) == request_body(this)` |
|
||||
| `response_body(this).id != null` | `response_code(GET /users/{response_body(this).id}) == 200` |
|
||||
| `response_body(this).name != null` | `response_body(GET /users/{id}).name == previous(response_body(this).name)` |
|
||||
|
||||
**Good behavioral patterns (from the paper):**
|
||||
- **Constructor precondition**: Resource must not exist before creation
|
||||
```apostl
|
||||
response_code(GET /users/{request_body(this).email}) == 404
|
||||
```
|
||||
- **Round-trip equality**: POST response matches the request body
|
||||
```apostl
|
||||
response_body(this) == request_body(this)
|
||||
```
|
||||
- **Cross-route retrievability**: Creating a resource makes it readable via GET
|
||||
```apostl
|
||||
response_code(GET /users/{response_body(this).id}) == 200
|
||||
```
|
||||
- **State-change verification**: DELETE causes subsequent GET to return 404
|
||||
```apostl
|
||||
response_code(GET /users/{request_params(this).id}) == 404
|
||||
```
|
||||
- **Previous state preservation**: DELETE returns the last known state
|
||||
```apostl
|
||||
response_body(this) == previous(response_body(GET /users/{request_params(this).id}))
|
||||
```
|
||||
- **Invariant over collections**: All resources satisfy a cross-resource constraint
|
||||
```apostl
|
||||
for t in response_body(GET /tournaments) :-
|
||||
response_body(GET /tournaments/{t.id}/players).length <= t.capacity
|
||||
```
|
||||
|
||||
**Anti-patterns to avoid:**
|
||||
- Checking status codes (handled by schema validation)
|
||||
- Checking field existence (handled by schema validation)
|
||||
- Checking field types (handled by schema validation)
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Add more routes to your profile: `apophis verify --profile quick --routes "POST /users,PUT /users/:id"`
|
||||
|
||||
Reference in New Issue
Block a user