# Run: schemathesis run http://127.0.0.1:${DECNET_API_PORT}/openapi.json # Or: schemathesis run --config schemathesis.toml http://127.0.0.1:8000/openapi.json [[project]] title = "DECNET API" continue-on-failure = true request-timeout = 10.0 #suppress-health-check = ["too_slow", "data_too_large", "filter_too_much", "large_base_example"] workers = "auto" # ── Generation: throw everything at it ─────────────────────────────────────── [generation] mode = "all" # valid AND invalid inputs max-examples = 500 # 5× the default no-shrink = false # keep shrinking — you want minimal repros allow-x00 = true # null bytes in strings unique-inputs = true # no duplicate test cases codec = "utf-8" # full unicode range maximize = "response_time" # targeted: hunt for slow paths too # ── All phases on ───────────────────────────────────────────────────────────── [phases.examples] enabled = true fill-missing = true # generate random cases even where no examples exist [phases.coverage] enabled = true generate-duplicate-query-parameters = true # e.g. ?x=1&x=2 edge cases unexpected-methods = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "TRACE"] [phases.fuzzing] enabled = true [phases.stateful] enabled = true max-steps = 20 # ── Every check enabled ─────────────────────────────────────────────────────── [checks] not_a_server_error.enabled = true status_code_conformance.enabled = true content_type_conformance.enabled = true response_headers_conformance.enabled = true response_schema_conformance.enabled = true positive_data_acceptance.enabled = true negative_data_rejection.enabled = true missing_required_header.enabled = true unsupported_method.enabled = true use_after_free.enabled = true ensure_resource_availability.enabled = true ignored_auth.enabled = true max_response_time = 2.0 # anything slower than 2s is a failure # ── Per-operation timeouts ──────────────────────────────────────────────────── # Auth — must be instant [[operations]] include-operation-id = "login_api_v1_auth_login_post" request-timeout = 3.0 [[operations]] include-operation-id = "change_password_api_v1_auth_change_password_post" request-timeout = 3.0 # Deploy — expensive by design, give it room but not infinite [[operations]] include-operation-id = "api_deploy_deckies_api_v1_deckies_deploy_post" request-timeout = 30.0 checks.max_response_time = 30.0 # override the global 2s threshold for this op # Mutate — engine work, allow some slack [[operations]] include-operation-id = "api_mutate_decky_api_v1_deckies__decky_name__mutate_post" request-timeout = 15.0 checks.max_response_time = 15.0 # SSE stream — must not block the suite [[operations]] include-operation-id = "stream_events_api_v1_stream_get" request-timeout = 2.0 # Reinit — destructive, assert it never 500s regardless of state [[operations]] include-operation-id = "api_reinit_api_v1_config_reinit_delete" request-timeout = 10.0