From 48381cb543973d4fd51f93adb5c6a2736e4eb77b Mon Sep 17 00:00:00 2001 From: Enzo Innocenzi Date: Tue, 13 Jan 2026 01:37:33 +0100 Subject: [PATCH 1/2] fix(http-client): support unknown status codes --- packages/http-client/src/Driver/Psr18Driver.php | 2 +- packages/http/src/Status.php | 16 ++++++++++++++-- packages/http/tests/StatusTest.php | 17 ++++++++++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) 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..3f9003d8a3 100644 --- a/packages/http/tests/StatusTest.php +++ b/packages/http/tests/StatusTest.php @@ -5,8 +5,11 @@ 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; +use ValueError; /** * @internal @@ -25,7 +28,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 +146,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)); + } } From b7fcf68aaf95089ca48be6387f636455ecd36be5 Mon Sep 17 00:00:00 2001 From: Enzo Innocenzi Date: Tue, 13 Jan 2026 01:45:20 +0100 Subject: [PATCH 2/2] style: apply fixes from mago --- packages/http/tests/StatusTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/http/tests/StatusTest.php b/packages/http/tests/StatusTest.php index 3f9003d8a3..e14d5fbd75 100644 --- a/packages/http/tests/StatusTest.php +++ b/packages/http/tests/StatusTest.php @@ -9,7 +9,6 @@ use PHPUnit\Framework\Attributes\TestWith; use PHPUnit\Framework\TestCase; use Tempest\Http\Status; -use ValueError; /** * @internal