Middleware
The gatekeepers of your application
Middleware runs before your controller. It deserves its own tests.
Middleware
// app/Http/Middleware/RequireApiKey.php
class RequireApiKey
{
public function handle(Request $request, Closure $next): mixed
{
if (! $request->hasHeader('X-Api-Key')) {
abort(Response::HTTP_UNAUTHORIZED, 'API key required.');
}
return $next($request);
}
}
Feature Test — assert middleware is applied
// tests/Feature/Http/Controllers/ApiControllerTest.php
$response = $this->get(route('api.data'));
$response->assertMiddlewareIsApplied('require-api-key');
Unit Test — assert middleware logic
// tests/Unit/Http/Middleware/RequireApiKeyTest.php
public function missing_header_aborts_request(): void
{
$this->expectException(HttpException::class);
$middleware = new RequireApiKey;
$request = new Request;
$middleware->handle($request, function () {
$this->fail('Next middleware was called.');
});
}
public function valid_header_continues_request(): void
{
$request = Request::create('/api/data', 'GET');
$request->headers->set('X-Api-Key', 'secret');
$expectedResponse = new Response('allowed', Response::HTTP_OK);
$next = fn() => $expectedResponse;
$actualResponse = (new RequireApiKey)->handle($request, $next);
$this->assertSame($expectedResponse, $actualResponse);
}
Powered by @jcergolj additional-test-assertions-for-laravel