🚀 Added
- Negative coverage case that omits a request body the operation declares required.
- Apollo Federation subgraph support:
_entitiesand_servicestay out unless filters select them. base_url_mismatchwarning when every response is 404 and--urlomits the schema's base path.unresolvable_referencewarning listing the parameters and responses skipped over a missing schema component.- Try each user in a WFC auth document, moving on from the ones an operation rejects.
--max-timestopsst runafter the given number of seconds.--auth-wfcand--auth-wfc-userfor Web Fuzzing Commons auth files.--report jsonwrites the run's verdict as one JSON document.- Support for
statein the ASGI lifespan scope.
🔧 Changed
- Drop
starlette-testclientandstarlettedependencies. - ASGI application state persists between generated test cases.
- ASGI lifespan shutdown runs per pytest test, or at process exit outside pytest.
- The operation serving the loaded schema stays out of testing unless filters select it.
🏎️ Performance
- ~100 ms less overhead in each examples, coverage, and fuzzing phase.
- Single event loop shared by ASGI applications, with one lifespan cycle per test.
🐛 Fixed
ASGI applications
- Incompatibility with
anyio4.15. HEADoperations failing with an internalAttributeError.- Applications that do not implement the lifespan protocol failing with a
TypeError. - Applications that reject the lifespan scope, such as Django, failing with a
ValueError. - Requests served after the application reports a failed startup.
- Lifespan failures after startup or after shutdown completes going unreported.
- Lifespan not started while fetching the schema.
- IPv6 and userinfo base URLs rejected.
sessionpassed tocase.call()ignored.- Request timeouts ignored, leaving a hung handler unbounded.
- Django's
ALLOWED_HOSTSrejection reported without an explanation.
WSGI applications
- Raw multipart bodies sent with an unparsable
Content-Type. - Binary form properties not sent as file parts.
multipart/mixedrequest bodies sent as an empty payload.
WFC authentication
authTemplatenot merged into each entry when loading auth files.- The first entry not selected when no
useris configured, as documented. - Token fetch failures disabling auth for the whole run instead of retrying after a cooldown.
- Login endpoints that specify neither
tokennorexpectCookiesrejected, ignoring the returned cookies. - Login endpoints that redirect after sign-in rejected, ignoring the cookies they set.
Data generation
- No test cases generated for schemas with
notoverpatternProperties. - No values generated for strings that several
patterns must match at once. - Generation failing for an OpenAPI 3.0
patternthat names a capture group. - Empty strings generated for query parameters declaring
allowEmptyValue: false. #4574 - Boolean and null example values in query and path sent as Python literals, and optional nulls sent instead of omitted.
- Delimited query and path array items sent as Python literals instead of
true/false/null. - Optional query parameters generated as
nullsent instead of omitted. - OpenAPI 3.1
contentMediaType: application/octet-streamform fields not sent as file uploads. - Request bodies declared with a media range like
application/*+jsonsent without a concreteContent-Type. - Crash on repeat runs when an operation's request body declares several media types.
- GraphQL scalars with no registered strategy misreported in some generation modes.
Coverage phase
- Emitting objects for
allOfrequiring a property no branch combination admits. - Treating
allOfbranches namingintegerandnumberas unsatisfiable. - Emitting valid values as
anyOf/oneOfviolations for branches with$refsiblings. - Emitting valid values as
itemsviolations for arrays declaringprefixItems. - Ignoring
prefixItemswhen building array cases for OpenAPI 3.1 operations. - Dropping a required name
propertiesdoes not declare from generated array items. - Emitting properties whose names
propertyNamesrejects. - Emitting a
multipleOfvalue outside the float boundminimumandmaximumpin. - Emitting a single-item array that exceeds
maxContains.
Schema handling
- A path item or
responsesthat is not an object reported as a generic parsing failure. - Header parameters written as a boolean schema crashing data generation.
- XML bodies whose schema is written as a boolean crashing serialization.
- Malformed
serversURL templates crashing instead of reporting a schema error. $refvalues that name no readable file crashing instead of reporting an unresolvable reference.- Response keys that are not status code patterns crashing response matching.
- Unresolvable
$refin an optional parameter or required body rejecting the operation. - Unresolvable
$refin a response schema rejecting the operation. openapiversions with a suffix, such as3.1.0-custom, rejected.- Non-object vendor extension values inside
responses, such asx-note: null, rejected.
False positives
ignored_authfor APIs that reject unauthenticated requests with 403.negative_data_rejectionfor example header and cookie values.negative_data_rejectionfor GraphQL when captured identifiers replaced the violating argument.negative_data_rejectionfor GraphQL arguments that declare a default value.negative_data_rejectionfor non-numeric query and path parameters whose serialized value is valid. #4600unsupported_methodwhen a secured operation answers 401 or 403 before routing.
Others
- False negative
unsupported_methodfor 404 responses on paths whose parameters are pinned. - Detect
ignored_authbypasses in APIs that accept any well-formed bearer or basic credentials. - Send requests without credentials when
securityaccepts unauthenticated access via{}. - Response schemas validated against undocumented content types.
- Write-only property violations in responses reported as
{} is not allowed. - Read-only property violations in requests reported as a valid value of its type.
negative_data_rejectionmessage omitting parameter names when several parameters are mutated. #4600positive_data_acceptanceextra-properties hint shown when the server rejects a declared field.- Stateful phase crashing when two links produce the same transition name.
- Several boundaries used in the reproduce cURL for multipart request bodies.
- Zero scenarios run when
st fuzzstartup outlasts--max-time.