```json
{
"tests": [
{
"name": "test_risk_endpoint_san_francisco",
"endpoint": "/risk",
"method": "GET",
"headers": {},
"payload": {},
"params": {"lat": 37.7749, "lon": -122.4194},
"expected_status": 200,
"expected_behavior": "Returns climate risk assessment for San Francisco",
"metrics": ["latency", "accuracy", "status_code"],
"validation": {
"field": "risk_score",
"type": "number",
"min_value": 0,
"max_value": 100
}
},
{
"name": "test_risk_endpoint_miami",
"endpoint": "/risk",
"method": "GET",
"headers": {},
"payload": {},
"params": {"lat": 25.7617, "lon": -80.1918},
"expected_status": 200,
"expected_behavior": "Returns climate risk assessment for Miami (high hurricane/flood risk area)",
"metrics": ["latency", "accuracy", "status_code"],
"validation": {
"field": "risk_score",
"type": "number",
"min_value": 0,
"max_value": 100
}
},
{
"name": "test_projections_endpoint",
"endpoint": "/projections",
"method": "GET",
"headers": {},
"payload": {},
"params": {"lat": 40.7128, "lon": -74.0060},
"expected_status": 200,
"expected_behavior": "Returns 30-year climate projections for New York",
"metrics": ["latency", "accuracy", "status_code"],
"validation": {
"field": "projections",
"type": "array",
"min_length": 1
}
},
{
"name": "test_batch_endpoint",
"endpoint": "/batch",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"payload": {
"locations": [
{"lat": 37.7749, "lon": -122.4194},
{"lat": 25.7617, "lon": -80.1918},
{"lat": 40.7128, "lon": -74.0060}
]
},
"expected_status": 200,
"expected_behavior": "Returns batch climate risk scores for multiple locations",
"metrics": ["latency", "accuracy", "status_code"],
"validation": {
"field": "results",
"type": "array",
"min_length": 3
}
},
{
"name": "test_invalid_coordinates",
"endpoint": "/risk",
"method": "GET",
"headers": {},
"payload": {},
"params": {"lat": 999, "lon": 999},
"expected_status": 400,
"expected_behavior": "Returns error for invalid coordinates",
"metrics": ["latency", "status_code"],
"validation": {
"field": "error",
"type": "string"
}
},
{
"name": "test_missing_lat_parameter",
"endpoint": "/risk",
"method": "GET",
"headers": {},
"payload": {},
"params": {"lon": -122.4194},
"expected_status": 400,
"expected_behavior": "Returns error when latitude parameter is missing",
"metrics": ["latency", "status_code"],
"validation": {
"field": "error",
"type": "string"
}
},
{
"name": "test_missing_lon_parameter",
"endpoint": "/risk",
"method": "GET",
"headers": {},
"payload": {},
"params": {"lat": 37.7749},
"expected_status": 400,
"expected_behavior": "Returns error when longitude parameter is missing",
"metrics": ["latency", "status_code"],
"validation": {
"field": "error",
"type": "string"
}
},
{
"name": "test_unauthenticated_request",
"endpoint": "/risk",
"method": "GET",
"headers": {},
"payload": {},
"params": {"lat": 37.7749, "lon": -122.4194},
"expected_status": 401,
"expected_behavior": "Returns unauthorized error without API key",
"metrics": ["latency", "status_code"],
"validation": {
"field": "error",
"type": "string"
},
"skip_auth": true
}
],
"pricing_probes": [
{
"name": "verify_request_usage",
"description": "Check if API returns usage metrics or rate limit headers",
"endpoint": "/risk",
"method": "GET",
"payload": {"lat": 37.7749, "lon": -122.4194},
"check": "response.headers should contain rate limit or usage information"
},
{
"name": "verify_batch_vs_individual_cost",
"description": "Compare batch request cost vs individual requests",
"endpoint": "/batch",
"method": "POST",
"payload": {
"locations": [
{"lat": 37.7749, "lon": -122.4194},
{"lat": 25.7617, "lon": -80.1918}
]
},
"check": "batch request should be more efficient than 2 individual requests"
}
],
"stress_profile": {
"concurrent_requests": 3,
"duration_seconds": 15,
"ramp_up": true,
"notes": "Respecting 60 RPM rate limit (1 req/sec), using 3 concurrent for brief periods"
}
}
```