Repository navigation
v0.7.0
-
Added. A conformance replay of generated traffic. The differentials in
this package have always been fed by a hand-written corpus of a dozen
requests, which bounds what they can disagree about — every finding of the
0.6.0 wave lived just outside those dozen.
rasuvaeff/property-testing-openapibuilds requests from a document and
knows by construction whether each is meant to pass; it depends on this
package, so it can never be a dev dependency here, and a recording is the
only way its traffic reaches this suite. 274 cases over 19 operations across
both OAS versions now replay from
tests/fixtures/generated-corpus/requests.json, asserting the verdict the
case was built for and, when it was built invalid, that the rejection lands
where the misuse was planted rather than somewhere convenient. What is
recorded is the generator's intent, not our own verdict — a corpus of the
latter would have faithfully pinned all four 0.6.0 bugs as correct
behaviour. Verified by replaying it on 0.5.1: thebounded.createdocument
will not compile and a validnumeric.createbody is rejected. A failing
case names the version the corpus was recorded against, so a moved
verdict reads as a question about this package rather than as an
unexplained disagreement. -
Changed. A header parameter is read as it was sent, not
percent-decoded (#66). OAS says a header usesstyle: simpleand simple
style is RFC 6570 expansion, which does define an encoding — but HTTP treats
a field value as opaque octets, no client in the wild escapes one, and the
two mistakes are not symmetric: decoding a value nobody encoded corrupts it
silently, while leaving an encoded value alone only makes a length or
pattern assertion stricter than its author meant.X-Path: /a%20bused to
become/a b, andX-Discount: 50%a broken escape. Decoding now happens
where an encoding provably exists — path, query, cookie — and nowhere else.
The price is named rather than hidden: a header value can no longer carry
its own style delimiter, because there is no escape left for it. The change
applies to response headers too, and closes the one live disagreement the
generated differential inproperty-testing-openapifound against
league/openapi-psr7-validator— the two now agree on the same request.