diff --git a/packages/http-client/src/Driver/Psr18Driver.php b/packages/http-client/src/Driver/Psr18Driver.php index 10796e988f..af7ecad268 100644 --- a/packages/http-client/src/Driver/Psr18Driver.php +++ b/packages/http-client/src/Driver/Psr18Driver.php @@ -67,7 +67,7 @@ private function convertTempestRequestToPsrRequest(Request $tempestRequest): Req private function convertPsrResponseToTempestResponse(ResponseInterface $response): Response { return new GenericResponse( - status: Status::code($response->getStatusCode()), + status: Status::fromCode($response->getStatusCode()), body: $response->getBody()->getContents(), headers: $response->getHeaders(), ); diff --git a/packages/http/src/Status.php b/packages/http/src/Status.php index 2080f63106..ae4feedb66 100644 --- a/packages/http/src/Status.php +++ b/packages/http/src/Status.php @@ -4,6 +4,8 @@ namespace Tempest\Http; +use ValueError; + enum Status: int { // Informational @@ -79,9 +81,19 @@ enum Status: int case NOT_EXTENDED = 510; case NETWORK_AUTHENTICATION_REQUIRED = 511; - public static function code(int $code): self + public static function fromCode(int $code): self { - return self::from($code); + try { + return self::from($code); + } catch (ValueError) { + return match (intdiv($code, 100) * 100) { + 100 => self::CONTINUE, + 200 => self::OK, + 300 => self::MULTIPLE_CHOICES, + 400 => self::BAD_REQUEST, + default => self::INTERNAL_SERVER_ERROR, + }; + } } public function description(): string diff --git a/packages/http/tests/StatusTest.php b/packages/http/tests/StatusTest.php index f8637d932d..e14d5fbd75 100644 --- a/packages/http/tests/StatusTest.php +++ b/packages/http/tests/StatusTest.php @@ -5,6 +5,8 @@ namespace Tempest\Http\Tests; use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; +use PHPUnit\Framework\Attributes\TestWith; use PHPUnit\Framework\TestCase; use Tempest\Http\Status; @@ -25,7 +27,7 @@ private static function descriptionToStatus(string $description): Status #[DataProvider('provide_status_code_cases')] public function test_status_code(int $code, string $description): void { - $status = Status::code($code); + $status = Status::fromCode($code); $this->assertSame( self::descriptionToStatus($description), @@ -143,4 +145,16 @@ public static function provide_status_code_cases(): iterable [511, 'Network Authentication Required'], ]; } + + #[TestWith([150, Status::CONTINUE])] + #[TestWith([250, Status::OK])] + #[TestWith([399, Status::MULTIPLE_CHOICES])] + #[TestWith([450, Status::BAD_REQUEST])] + #[TestWith([550, Status::INTERNAL_SERVER_ERROR])] + #[TestWith([650, Status::INTERNAL_SERVER_ERROR])] + #[Test] + public function unknown_status_code_maps_to_class_base(int $code, Status $expected): void + { + $this->assertSame($expected, Status::fromCode($code)); + } }