Skip to content

Commit c120455

Browse files
author
Jérôme Deuchnord
committed
tests(v3.0): apply breaking changes to HttpCache
1 parent 1edc22f commit c120455

File tree

5 files changed

+11
-190
lines changed

5 files changed

+11
-190
lines changed

src/HttpCache/EventListener/AddHeadersListener.php

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
namespace ApiPlatform\HttpCache\EventListener;
1515

16-
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
1716
use ApiPlatform\Util\RequestAttributesExtractor;
1817
use Symfony\Component\HttpKernel\Event\ResponseEvent;
1918

@@ -31,18 +30,16 @@ final class AddHeadersListener
3130
private $sharedMaxAge;
3231
private $vary;
3332
private $public;
34-
private $resourceMetadataFactory;
3533
private $staleWhileRevalidate;
3634
private $staleIfError;
3735

38-
public function __construct(bool $etag = false, int $maxAge = null, int $sharedMaxAge = null, array $vary = null, bool $public = null, ResourceMetadataFactoryInterface $resourceMetadataFactory = null, int $staleWhileRevalidate = null, int $staleIfError = null)
36+
public function __construct(bool $etag = false, int $maxAge = null, int $sharedMaxAge = null, array $vary = null, bool $public = null, int $staleWhileRevalidate = null, int $staleIfError = null)
3937
{
4038
$this->etag = $etag;
4139
$this->maxAge = $maxAge;
4240
$this->sharedMaxAge = $sharedMaxAge;
4341
$this->vary = $vary;
4442
$this->public = $public;
45-
$this->resourceMetadataFactory = $resourceMetadataFactory;
4643
$this->staleWhileRevalidate = $staleWhileRevalidate;
4744
$this->staleIfError = $staleIfError;
4845
}
@@ -65,14 +62,7 @@ public function onKernelResponse(ResponseEvent $event): void
6562
return;
6663
}
6764

68-
$resourceCacheHeaders = [];
69-
70-
if ($this->resourceMetadataFactory) {
71-
$resourceMetadata = $this->resourceMetadataFactory->create($attributes['resource_class']);
72-
$resourceCacheHeaders = $resourceMetadata->getOperationAttribute($attributes, 'cache_headers', [], true);
73-
} else {
74-
$resourceCacheHeaders = $attributes['cache_headers'] ?? [];
75-
}
65+
$resourceCacheHeaders = $attributes['cache_headers'] ?? [];
7666

7767
if ($this->etag && !$response->getEtag()) {
7868
$response->setEtag(md5((string) $response->getContent()));

src/HttpCache/EventListener/AddTagsListener.php

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,7 @@ final class AddTagsListener
4747
private $iriConverter;
4848
private $purger;
4949

50-
/**
51-
* @param LegacyPurgerInterface|PurgerInterface|null $purger
52-
* @param LegacyIriConverterInterface|IriConverterInterface $iriConverter
53-
* @param mixed|null $purger
54-
*/
55-
public function __construct($iriConverter, ResourceMetadataCollectionFactoryInterface $resourceMetadataCollectionFactory = null, $purger = null)
50+
public function __construct(IriConverterInterface $iriConverter, ResourceMetadataCollectionFactoryInterface $resourceMetadataCollectionFactory = null, ?PurgerInterface $purger = null)
5651
{
5752
$this->iriConverter = $iriConverter;
5853
$this->resourceMetadataCollectionFactory = $resourceMetadataCollectionFactory;
@@ -80,12 +75,7 @@ public function onKernelResponse(ResponseEvent $event): void
8075
if (isset($attributes['collection_operation_name']) || ($attributes['subresource_context']['collection'] ?? false) || ($operation && $operation instanceof CollectionOperationInterface)) {
8176
// Allows to purge collections
8277
$uriVariables = $this->getOperationUriVariables($operation, $request->attributes->all(), $attributes['resource_class']);
83-
84-
if ($this->iriConverter instanceof LegacyIriConverterInterface) {
85-
$iri = $this->iriConverter->getIriFromResourceClass($attributes['resource_class'], UrlGeneratorInterface::ABS_PATH);
86-
} else {
87-
$iri = $this->iriConverter->getIriFromResource($attributes['resource_class'], UrlGeneratorInterface::ABS_PATH, $operation, ['uri_variables' => $uriVariables]);
88-
}
78+
$iri = $this->iriConverter->getIriFromResource($attributes['resource_class'], UrlGeneratorInterface::ABS_PATH, $operation, ['uri_variables' => $uriVariables]);
8979

9080
$resources[$iri] = $iri;
9181
}
@@ -94,13 +84,6 @@ public function onKernelResponse(ResponseEvent $event): void
9484
return;
9585
}
9686

97-
if ($this->purger instanceof LegacyPurgerInterface || !$this->purger) {
98-
$response->headers->set('Cache-Tags', implode(',', $resources));
99-
trigger_deprecation('api-platform/core', '2.7', sprintf('The interface "%s" is deprecated, use "%s" instead.', LegacyPurgerInterface::class, PurgerInterface::class));
100-
101-
return;
102-
}
103-
10487
$headers = $this->purger->getResponseHeaders($resources);
10588

10689
foreach ($headers as $key => $value) {

src/Symfony/Bundle/Resources/config/http_cache.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
<argument>%api_platform.http_cache.shared_max_age%</argument>
1212
<argument>%api_platform.http_cache.vary%</argument>
1313
<argument>%api_platform.http_cache.public%</argument>
14-
<argument>null</argument>
1514

1615
<tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" priority="-1" />
1716
</service>

src/Util/AttributesExtractor.php

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,6 @@ public static function extractAttributes(array $attributes): array
3737
$result['subresource_context'] = $subresourceContext;
3838
}
3939

40-
// // Normalizing identifiers tuples
41-
// // TODO: 3.0 remove
42-
// $identifiers = [];
43-
// foreach (($attributes['_api_identifiers'] ?? ['id']) as $parameterName => $identifiedBy) {
44-
// if (\is_string($identifiedBy)) {
45-
// $identifiers[$identifiedBy] = [$result['resource_class'], $identifiedBy];
46-
// } else {
47-
// $identifiers[$parameterName] = $identifiedBy;
48-
// }
49-
// }
50-
//
51-
// $result['identifiers'] = $identifiers;
52-
5340
if (null === $result['resource_class']) {
5441
return [];
5542
}

tests/HttpCache/EventListener/AddHeadersListenerTest.php

Lines changed: 7 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313

1414
namespace ApiPlatform\Tests\HttpCache\EventListener;
1515

16-
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
17-
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
1816
use ApiPlatform\HttpCache\EventListener\AddHeadersListener;
1917
use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Dummy;
2018
use ApiPlatform\Tests\ProphecyTrait;
@@ -26,15 +24,14 @@
2624

2725
/**
2826
* @author Kévin Dunglas <[email protected]>
29-
* @group legacy
3027
*/
3128
class AddHeadersListenerTest extends TestCase
3229
{
3330
use ProphecyTrait;
3431

3532
public function testDoNotSetHeaderWhenMethodNotCacheable()
3633
{
37-
$request = new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']);
34+
$request = new Request([], [], ['_api_resource_class' => Dummy::class, '_api_operation_name' => 'get']);
3835
$request->setMethod('PUT');
3936
$response = new Response();
4037
$event = new ResponseEvent(
@@ -52,7 +49,7 @@ public function testDoNotSetHeaderWhenMethodNotCacheable()
5249

5350
public function testDoNotSetHeaderOnUnsuccessfulResponse()
5451
{
55-
$request = new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']);
52+
$request = new Request([], [], ['_api_resource_class' => Dummy::class, '_api_operation_name' => 'get']);
5653
$response = new Response('{}', Response::HTTP_BAD_REQUEST);
5754
$event = new ResponseEvent(
5855
$this->prophesize(HttpKernelInterface::class)->reveal(),
@@ -88,7 +85,7 @@ public function testDoNotSetHeaderWhenNoContent()
8885
$response = new Response();
8986
$event = new ResponseEvent(
9087
$this->prophesize(HttpKernelInterface::class)->reveal(),
91-
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']),
88+
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_operation_name' => 'get']),
9289
\defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST,
9390
$response
9491
);
@@ -103,15 +100,12 @@ public function testAddHeaders()
103100
$response = new Response('some content', 200, ['Vary' => ['Accept', 'Cookie']]);
104101
$event = new ResponseEvent(
105102
$this->prophesize(HttpKernelInterface::class)->reveal(),
106-
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']),
103+
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_operation_name' => 'get']),
107104
\defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST,
108105
$response
109106
);
110107

111-
$factory = $this->prophesize(ResourceMetadataFactoryInterface::class);
112-
$factory->create(Dummy::class)->willReturn(new ResourceMetadata())->shouldBeCalled();
113-
114-
$listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, $factory->reveal(), 15, 30);
108+
$listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, 15, 30);
115109
$listener->onKernelResponse($event);
116110

117111
$this->assertSame('"9893532233caff98cd083a116b013c0b"', $response->getEtag());
@@ -129,148 +123,16 @@ public function testDoNotSetHeaderWhenAlreadySet()
129123

130124
$event = new ResponseEvent(
131125
$this->prophesize(HttpKernelInterface::class)->reveal(),
132-
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']),
126+
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_operation_name' => 'get']),
133127
\defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST,
134128
$response
135129
);
136130

137-
$factory = $this->prophesize(ResourceMetadataFactoryInterface::class);
138-
$factory->create(Dummy::class)->willReturn(new ResourceMetadata())->shouldBeCalled();
139-
140-
$listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, $factory->reveal(), 15, 30);
131+
$listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, 15, 30);
141132
$listener->onKernelResponse($event);
142133

143134
$this->assertSame('"etag"', $response->getEtag());
144135
$this->assertSame('max-age=300, public, s-maxage=400, stale-if-error=30, stale-while-revalidate=15', $response->headers->get('Cache-Control'));
145136
$this->assertSame(['Accept', 'Cookie', 'Accept-Encoding'], $response->getVary());
146137
}
147-
148-
public function testSetHeadersFromResourceMetadata()
149-
{
150-
$response = new Response('some content', 200, ['Vary' => ['Accept', 'Cookie']]);
151-
$event = new ResponseEvent(
152-
$this->prophesize(HttpKernelInterface::class)->reveal(),
153-
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']),
154-
\defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST,
155-
$response
156-
);
157-
158-
$metadata = new ResourceMetadata(null, null, null, null, null, ['cache_headers' => ['max_age' => 123, 'shared_max_age' => 456, 'stale_while_revalidate' => 928, 'stale_if_error' => 70, 'vary' => ['Vary-1', 'Vary-2']]]);
159-
$factory = $this->prophesize(ResourceMetadataFactoryInterface::class);
160-
$factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled();
161-
162-
$listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, $factory->reveal(), 15, 30);
163-
$listener->onKernelResponse($event);
164-
165-
$this->assertSame('max-age=123, public, s-maxage=456, stale-if-error=70, stale-while-revalidate=928', $response->headers->get('Cache-Control'));
166-
$this->assertSame(['Accept', 'Cookie', 'Vary-1', 'Vary-2'], $response->getVary());
167-
}
168-
169-
public function testSetHeadersFromResourceMetadataMarkedAsPrivate()
170-
{
171-
$response = new Response('some content', 200);
172-
$event = new ResponseEvent(
173-
$this->prophesize(HttpKernelInterface::class)->reveal(),
174-
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']),
175-
\defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST,
176-
$response
177-
);
178-
179-
$metadata = new ResourceMetadata(null, null, null, null, null, [
180-
'cache_headers' => [
181-
'max_age' => 123,
182-
'public' => false,
183-
'shared_max_age' => 456,
184-
],
185-
]);
186-
$factory = $this->prophesize(ResourceMetadataFactoryInterface::class);
187-
$factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled();
188-
189-
$listener = new AddHeadersListener(true, 100, 200, [], true, $factory->reveal());
190-
$listener->onKernelResponse($event);
191-
192-
$this->assertSame('max-age=123, private', $response->headers->get('Cache-Control'));
193-
194-
// resource's cache marked as private must not contain s-maxage
195-
$this->assertStringNotContainsString('s-maxage', $response->headers->get('Cache-Control'));
196-
}
197-
198-
public function testSetHeadersFromResourceMetadataMarkedAsPublic()
199-
{
200-
$response = new Response('some content', 200);
201-
$event = new ResponseEvent(
202-
$this->prophesize(HttpKernelInterface::class)->reveal(),
203-
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']),
204-
\defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST,
205-
$response
206-
);
207-
208-
$metadata = new ResourceMetadata(null, null, null, null, null, [
209-
'cache_headers' => [
210-
'max_age' => 123,
211-
'public' => true,
212-
'shared_max_age' => 456,
213-
],
214-
]);
215-
$factory = $this->prophesize(ResourceMetadataFactoryInterface::class);
216-
$factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled();
217-
218-
$listener = new AddHeadersListener(true, 100, 200, [], true, $factory->reveal());
219-
$listener->onKernelResponse($event);
220-
221-
$this->assertSame('max-age=123, public, s-maxage=456', $response->headers->get('Cache-Control'));
222-
}
223-
224-
public function testSetHeadersFromResourceMetadataWithNoPrivacy()
225-
{
226-
$response = new Response('some content', 200);
227-
$event = new ResponseEvent(
228-
$this->prophesize(HttpKernelInterface::class)->reveal(),
229-
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']),
230-
\defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST,
231-
$response
232-
);
233-
234-
$metadata = new ResourceMetadata(null, null, null, null, null, [
235-
'cache_headers' => [
236-
'max_age' => 123,
237-
'shared_max_age' => 456,
238-
],
239-
]);
240-
$factory = $this->prophesize(ResourceMetadataFactoryInterface::class);
241-
$factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled();
242-
243-
$listener = new AddHeadersListener(true, 100, 200, [], true, $factory->reveal());
244-
$listener->onKernelResponse($event);
245-
246-
$this->assertSame('max-age=123, public, s-maxage=456', $response->headers->get('Cache-Control'));
247-
}
248-
249-
public function testSetHeadersFromResourceMetadataWithNoPrivacyDefaultsPrivate()
250-
{
251-
$response = new Response('some content', 200);
252-
$event = new ResponseEvent(
253-
$this->prophesize(HttpKernelInterface::class)->reveal(),
254-
new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']),
255-
\defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST,
256-
$response
257-
);
258-
259-
$metadata = new ResourceMetadata(null, null, null, null, null, [
260-
'cache_headers' => [
261-
'max_age' => 123,
262-
'shared_max_age' => 456,
263-
],
264-
]);
265-
$factory = $this->prophesize(ResourceMetadataFactoryInterface::class);
266-
$factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled();
267-
268-
$listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], false, $factory->reveal());
269-
$listener->onKernelResponse($event);
270-
271-
$this->assertSame('max-age=123, private', $response->headers->get('Cache-Control'));
272-
273-
// resource's cache marked as private must not contain s-maxage
274-
$this->assertStringNotContainsString('s-maxage', $response->headers->get('Cache-Control'));
275-
}
276138
}

0 commit comments

Comments
 (0)