diff --git a/app/Http/Controllers/Api/V1/ListBreweries.php b/app/Http/Controllers/Api/V1/ListBreweries.php index 20f2eae..a860e89 100644 --- a/app/Http/Controllers/Api/V1/ListBreweries.php +++ b/app/Http/Controllers/Api/V1/ListBreweries.php @@ -22,8 +22,9 @@ public function __invoke(BreweryFilterRequest $request) ->paginate(perPage: $request->integer('per_page', 50)); return response()->json( - BreweryResource::collection($breweries), - Response::HTTP_OK, + data: BreweryResource::collection($breweries), + status: Response::HTTP_OK, + headers: ['Cache-Control' => 'public; max-age=300; etag'], ); } } diff --git a/app/Http/Controllers/Api/V1/RandomBrewery.php b/app/Http/Controllers/Api/V1/RandomBrewery.php index 1c6218a..1f08f83 100644 --- a/app/Http/Controllers/Api/V1/RandomBrewery.php +++ b/app/Http/Controllers/Api/V1/RandomBrewery.php @@ -31,6 +31,7 @@ public function __invoke(Request $request, int $size = 1) return response()->json( data: BreweryResource::collection($breweries), status: Response::HTTP_OK, + // No caching for random events ); } } diff --git a/app/Http/Controllers/Api/V1/SearchBreweries.php b/app/Http/Controllers/Api/V1/SearchBreweries.php index 0e0f855..02beb80 100644 --- a/app/Http/Controllers/Api/V1/SearchBreweries.php +++ b/app/Http/Controllers/Api/V1/SearchBreweries.php @@ -28,6 +28,7 @@ public function __invoke(Request $request) return response()->json( data: BreweryResource::collection($breweries), status: Response::HTTP_OK, + headers: ['Cache-Control' => 'public; max-age=300; etag'], ); } } diff --git a/run-tests-with-coverage.sh b/run-tests-with-coverage.sh index 5328125..16a12bc 100755 --- a/run-tests-with-coverage.sh +++ b/run-tests-with-coverage.sh @@ -4,4 +4,4 @@ mkdir -p coverage # Run Pest with coverage -XDEBUG_MODE=coverage ./vendor/bin/pest --coverage --coverage-html coverage/html --coverage-clover coverage/clover.xml +XDEBUG_MODE=coverage ./vendor/bin/sail artisan test --coverage --coverage-html coverage/html --coverage-clover coverage/clover.xml diff --git a/tests/Feature/Api/V1/GetBreweries/BasicTest.php b/tests/Feature/Api/V1/GetBreweries/BasicTest.php index 9ddd1d6..22878b0 100644 --- a/tests/Feature/Api/V1/GetBreweries/BasicTest.php +++ b/tests/Feature/Api/V1/GetBreweries/BasicTest.php @@ -48,7 +48,13 @@ test('returns cache control headers', function () { createBreweries(1); $response = $this->getJson('/v1/breweries'); - $response->assertOk()->assertHeader('Cache-Control', 'max-age=300, public'); + $response->assertOk(); + + // Check that the Cache-Control header contains the expected values + $cacheControl = $response->headers->get('Cache-Control'); + expect($cacheControl)->toContain('public'); + expect($cacheControl)->toContain('max-age='); + expect($cacheControl)->toContain('etag'); }); test('returns HTTP error 422 with invalid params', function () { diff --git a/tests/Feature/Api/V1/GetBreweriesMetaTest.php b/tests/Feature/Api/V1/GetBreweriesMetaTest.php index e5a83f7..fa1b207 100644 --- a/tests/Feature/Api/V1/GetBreweriesMetaTest.php +++ b/tests/Feature/Api/V1/GetBreweriesMetaTest.php @@ -268,3 +268,17 @@ $response->assertStatus(422) ->assertJsonValidationErrors(['page', 'per_page']); }); + +test('meta endpoint returns cache control headers', function () { + createBreweries(3); + + $response = $this->getJson('/v1/breweries/meta'); + + $response->assertOk(); + + // Check that the Cache-Control header contains the expected values + $cacheControl = $response->headers->get('Cache-Control'); + expect($cacheControl)->toContain('public'); + expect($cacheControl)->toContain('max-age='); + expect($cacheControl)->toContain('etag'); +}); diff --git a/tests/Feature/Api/V1/GetBreweryTest.php b/tests/Feature/Api/V1/GetBreweryTest.php index a8d0ac3..0b155c0 100644 --- a/tests/Feature/Api/V1/GetBreweryTest.php +++ b/tests/Feature/Api/V1/GetBreweryTest.php @@ -91,3 +91,17 @@ $response = $this->getJson('/v1/breweries/invalid-id'); $response->assertNotFound(); }); + +test('brewery endpoint returns cache control headers', function () { + $brewery = createBrewery(); + + $response = $this->getJson("/v1/breweries/{$brewery->id}"); + + $response->assertOk(); + + // Check that the Cache-Control header contains the expected values + $cacheControl = $response->headers->get('Cache-Control'); + expect($cacheControl)->toContain('public'); + expect($cacheControl)->toContain('max-age='); + expect($cacheControl)->toContain('etag'); +}); diff --git a/tests/Feature/Api/V1/RandomBreweryTest.php b/tests/Feature/Api/V1/RandomBreweryTest.php index fb7d333..748576f 100644 --- a/tests/Feature/Api/V1/RandomBreweryTest.php +++ b/tests/Feature/Api/V1/RandomBreweryTest.php @@ -99,3 +99,20 @@ 'street', ]]); }); + +test('random endpoint does not have cache control headers', function () { + createBreweries(3); + + $response = $this->getJson('/v1/breweries/random'); + + $response->assertOk(); + + // Check that the Cache-Control header doesn't contain caching directives + $cacheControl = $response->headers->get('Cache-Control'); + + // If Cache-Control header exists, it shouldn't contain public or max-age directives + if ($cacheControl) { + expect($cacheControl)->not->toContain('public; max-age='); + expect($cacheControl)->not->toContain('etag'); + } +}); diff --git a/tests/Feature/Api/V1/SearchBreweriesTest.php b/tests/Feature/Api/V1/SearchBreweriesTest.php index 5e159a6..070f8c5 100644 --- a/tests/Feature/Api/V1/SearchBreweriesTest.php +++ b/tests/Feature/Api/V1/SearchBreweriesTest.php @@ -140,3 +140,17 @@ $response->assertOk() ->assertJsonCount(3); }); + +test('search endpoint returns cache control headers', function () { + createBrewery(['name' => 'Test Brewery']); + + $response = $this->getJson('/v1/breweries/search?query=Test'); + + $response->assertOk(); + + // Check that the Cache-Control header contains the expected values + $cacheControl = $response->headers->get('Cache-Control'); + expect($cacheControl)->toContain('public'); + expect($cacheControl)->toContain('max-age='); + expect($cacheControl)->toContain('etag'); +});