From dd01ef1ed9499ad9e0e1500409b39ffca247b138 Mon Sep 17 00:00:00 2001 From: Max Hoogenbosch Date: Tue, 3 Dec 2024 13:48:10 +0100 Subject: [PATCH] feat(framework): extend http testing methods (#790) --- .../Testing/Http/HttpRouterTester.php | 84 ++++++++++ src/Tempest/Http/src/Connect.php | 27 ++++ src/Tempest/Http/src/Head.php | 27 ++++ src/Tempest/Http/src/Options.php | 27 ++++ src/Tempest/Http/src/Trace.php | 27 ++++ tests/Fixtures/Controllers/TestController.php | 16 ++ .../Http/HttpRouterTesterIntegrationTest.php | 144 ++++++++++++++++++ 7 files changed, 352 insertions(+) create mode 100644 src/Tempest/Http/src/Connect.php create mode 100644 src/Tempest/Http/src/Head.php create mode 100644 src/Tempest/Http/src/Options.php create mode 100644 src/Tempest/Http/src/Trace.php diff --git a/src/Tempest/Framework/Testing/Http/HttpRouterTester.php b/src/Tempest/Framework/Testing/Http/HttpRouterTester.php index ae85d7271..ca0269b2b 100644 --- a/src/Tempest/Framework/Testing/Http/HttpRouterTester.php +++ b/src/Tempest/Framework/Testing/Http/HttpRouterTester.php @@ -32,6 +32,18 @@ public function get(string $uri, array $headers = []): TestResponseHelper ); } + public function head(string $uri, array $headers = []): TestResponseHelper + { + return $this->sendRequest( + new GenericRequest( + method: Method::HEAD, + uri: $uri, + body: [], + headers: $headers, + ), + ); + } + public function post(string $uri, array $body = [], array $headers = []): TestResponseHelper { return $this->sendRequest( @@ -44,6 +56,78 @@ public function post(string $uri, array $body = [], array $headers = []): TestRe ); } + public function put(string $uri, array $body = [], array $headers = []): TestResponseHelper + { + return $this->sendRequest( + new GenericRequest( + method: Method::PUT, + uri: $uri, + body: $body, + headers: $headers, + ), + ); + } + + public function delete(string $uri, array $body = [], array $headers = []): TestResponseHelper + { + return $this->sendRequest( + new GenericRequest( + method: Method::DELETE, + uri: $uri, + body: $body, + headers: $headers, + ), + ); + } + + public function connect(string $uri, array $body = [], array $headers = []): TestResponseHelper + { + return $this->sendRequest( + new GenericRequest( + method: Method::CONNECT, + uri: $uri, + body: $body, + headers: $headers, + ), + ); + } + + public function options(string $uri, array $body = [], array $headers = []): TestResponseHelper + { + return $this->sendRequest( + new GenericRequest( + method: Method::OPTIONS, + uri: $uri, + body: $body, + headers: $headers, + ), + ); + } + + public function trace(string $uri, array $body = [], array $headers = []): TestResponseHelper + { + return $this->sendRequest( + new GenericRequest( + method: Method::TRACE, + uri: $uri, + body: $body, + headers: $headers, + ), + ); + } + + public function patch(string $uri, array $body = [], array $headers = []): TestResponseHelper + { + return $this->sendRequest( + new GenericRequest( + method: Method::PATCH, + uri: $uri, + body: $body, + headers: $headers, + ), + ); + } + public function sendRequest(Request $request): TestResponseHelper { /** @var Router $router */ diff --git a/src/Tempest/Http/src/Connect.php b/src/Tempest/Http/src/Connect.php new file mode 100644 index 000000000..b41c4cb19 --- /dev/null +++ b/src/Tempest/Http/src/Connect.php @@ -0,0 +1,27 @@ +[] $middleware + */ + array $middleware = [], + ) { + parent::__construct( + uri: $uri, + method: Method::CONNECT, + middleware: $middleware, + ); + } +} diff --git a/src/Tempest/Http/src/Head.php b/src/Tempest/Http/src/Head.php new file mode 100644 index 000000000..905ee2f91 --- /dev/null +++ b/src/Tempest/Http/src/Head.php @@ -0,0 +1,27 @@ +[] $middleware + */ + array $middleware = [], + ) { + parent::__construct( + uri: $uri, + method: Method::HEAD, + middleware: $middleware, + ); + } +} diff --git a/src/Tempest/Http/src/Options.php b/src/Tempest/Http/src/Options.php new file mode 100644 index 000000000..f30719c53 --- /dev/null +++ b/src/Tempest/Http/src/Options.php @@ -0,0 +1,27 @@ +[] $middleware + */ + array $middleware = [], + ) { + parent::__construct( + uri: $uri, + method: Method::OPTIONS, + middleware: $middleware, + ); + } +} diff --git a/src/Tempest/Http/src/Trace.php b/src/Tempest/Http/src/Trace.php new file mode 100644 index 000000000..4bc1dc5b8 --- /dev/null +++ b/src/Tempest/Http/src/Trace.php @@ -0,0 +1,27 @@ +[] $middleware + */ + array $middleware = [], + ) { + parent::__construct( + uri: $uri, + method: Method::TRACE, + middleware: $middleware, + ); + } +} diff --git a/tests/Fixtures/Controllers/TestController.php b/tests/Fixtures/Controllers/TestController.php index ef44ef5f0..cca1b3b7c 100644 --- a/tests/Fixtures/Controllers/TestController.php +++ b/tests/Fixtures/Controllers/TestController.php @@ -4,13 +4,21 @@ namespace Tests\Tempest\Fixtures\Controllers; +use Tempest\Http\Connect; +use Tempest\Http\Delete; use Tempest\Http\Get; +use Tempest\Http\Head; +use Tempest\Http\Options; +use Tempest\Http\Patch; +use Tempest\Http\Post; +use Tempest\Http\Put; use Tempest\Http\Response; use Tempest\Http\Responses\Created; use Tempest\Http\Responses\NotFound; use Tempest\Http\Responses\Ok; use Tempest\Http\Responses\Redirect; use Tempest\Http\Responses\ServerError; +use Tempest\Http\Trace; use function Tempest\view; use Tempest\View\View; use Tests\Tempest\Fixtures\Views\ViewWithResponseData; @@ -36,6 +44,14 @@ public function withComplexCustomRegexParams(string $id): Response } #[Get(uri: '/test')] + #[Head(uri: '/test')] + #[Post(uri: '/test')] + #[Put(uri: '/test')] + #[Delete(uri: '/test')] + #[Connect(uri: '/test')] + #[Options(uri: '/test')] + #[Trace(uri: '/test')] + #[Patch(uri: '/test')] public function __invoke(): Response { return new Ok('test'); diff --git a/tests/Integration/Testing/Http/HttpRouterTesterIntegrationTest.php b/tests/Integration/Testing/Http/HttpRouterTesterIntegrationTest.php index 5f2a7e5e1..f1ad3a8cc 100644 --- a/tests/Integration/Testing/Http/HttpRouterTesterIntegrationTest.php +++ b/tests/Integration/Testing/Http/HttpRouterTesterIntegrationTest.php @@ -29,4 +29,148 @@ public function test_get_requests_failure(): void ->get('/this-route-does-not-exist') ->assertOk(); } + + public function test_head_requests(): void + { + $this + ->http + ->head('/test') + ->assertOk(); + } + + public function test_head_requests_failure(): void + { + $this->expectException(AssertionFailedError::class); + + $this + ->http + ->head('/this-route-does-not-exist') + ->assertOk(); + } + + public function test_post_requests(): void + { + $this + ->http + ->post('/test') + ->assertOk(); + } + + public function test_post_requests_failure(): void + { + $this->expectException(AssertionFailedError::class); + + $this + ->http + ->post('/this-route-does-not-exist') + ->assertOk(); + } + + public function test_put_requests(): void + { + $this + ->http + ->put('/test') + ->assertOk(); + } + + public function test_put_requests_failure(): void + { + $this->expectException(AssertionFailedError::class); + + $this + ->http + ->put('/this-route-does-not-exist') + ->assertOk(); + } + + public function test_delete_requests(): void + { + $this + ->http + ->delete('/test') + ->assertOk(); + } + + public function test_delete_requests_failure(): void + { + $this->expectException(AssertionFailedError::class); + + $this + ->http + ->delete('/this-route-does-not-exist') + ->assertOk(); + } + + public function test_connect_requests(): void + { + $this + ->http + ->connect('/test') + ->assertOk(); + } + + public function test_connect_requests_failure(): void + { + $this->expectException(AssertionFailedError::class); + + $this + ->http + ->connect('/this-route-does-not-exist') + ->assertOk(); + } + + public function test_options_requests(): void + { + $this + ->http + ->options('/test') + ->assertOk(); + } + + public function test_options_requests_failure(): void + { + $this->expectException(AssertionFailedError::class); + + $this + ->http + ->options('/this-route-does-not-exist') + ->assertOk(); + } + + public function test_trace_requests(): void + { + $this + ->http + ->trace('/test') + ->assertOk(); + } + + public function test_trace_requests_failure(): void + { + $this->expectException(AssertionFailedError::class); + + $this + ->http + ->trace('/this-route-does-not-exist') + ->assertOk(); + } + + public function test_patch_requests(): void + { + $this + ->http + ->patch('/test') + ->assertOk(); + } + + public function test_patch_requests_failure(): void + { + $this->expectException(AssertionFailedError::class); + + $this + ->http + ->patch('/this-route-does-not-exist') + ->assertOk(); + } }