diff --git a/src/PSR7/SpecFinder.php b/src/PSR7/SpecFinder.php index 8d586895..a3ad854b 100644 --- a/src/PSR7/SpecFinder.php +++ b/src/PSR7/SpecFinder.php @@ -26,6 +26,7 @@ use function json_decode; use function json_encode; use function property_exists; +use function substr; final class SpecFinder { @@ -211,6 +212,10 @@ public function findResponseSpec($addr): ResponseSpec $response = $operation->responses->getResponse((string) $addr->responseCode()); + if (! $response) { + $response = $operation->responses->getResponse(substr((string) $addr->responseCode(), 0, 1) . 'XX'); + } + if (! $response) { $response = $operation->responses->getResponse('default'); } diff --git a/tests/PSR7/SpecFinderTest.php b/tests/PSR7/SpecFinderTest.php index 98e2e362..2a5501b7 100644 --- a/tests/PSR7/SpecFinderTest.php +++ b/tests/PSR7/SpecFinderTest.php @@ -6,6 +6,7 @@ use League\OpenAPIValidation\PSR7\CallbackAddress; use League\OpenAPIValidation\PSR7\OperationAddress; +use League\OpenAPIValidation\PSR7\ResponseAddress; use League\OpenAPIValidation\PSR7\SpecFinder; use League\OpenAPIValidation\PSR7\ValidatorBuilder; use PHPUnit\Framework\TestCase; @@ -122,4 +123,61 @@ public function testHandleParameters(): void $pathItem = $specFinder->findPathSpec(new OperationAddress('/api/1.0/order/123', 'get')); self::assertSame('The order object', $pathItem->get->responses[200]->description); } + + public function testResponseStatusCodesWithWildcards(): void + { + $yaml = <<fromYaml($yaml)->getServerRequestValidator()->getSchema(); + $specFinder = new SpecFinder($schema); + $responseSpec = $specFinder->findResponseSpec( + new ResponseAddress('/products.find', 'get', 404) + ); + self::assertSame('Not Found', $responseSpec->description); + + $responseSpec = $specFinder->findResponseSpec( + new ResponseAddress('/products.find', 'get', 400) + ); + self::assertSame('Client Error', $responseSpec->description); + + $responseSpec = $specFinder->findResponseSpec( + new ResponseAddress('/products.find', 'get', 500) + ); + self::assertSame('Unexpected Error', $responseSpec->description); + } }