Skip to content

Commit 15ac863

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

File tree

4 files changed

+7
-167
lines changed

4 files changed

+7
-167
lines changed

src/HttpCache/EventListener/AddHeadersListener.php

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

1414
namespace ApiPlatform\HttpCache\EventListener;
1515

16-
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
16+
//use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
1717
use ApiPlatform\Util\RequestAttributesExtractor;
1818
use Symfony\Component\HttpKernel\Event\ResponseEvent;
1919

@@ -31,18 +31,16 @@ final class AddHeadersListener
3131
private $sharedMaxAge;
3232
private $vary;
3333
private $public;
34-
private $resourceMetadataFactory;
3534
private $staleWhileRevalidate;
3635
private $staleIfError;
3736

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)
37+
public function __construct(bool $etag = false, int $maxAge = null, int $sharedMaxAge = null, array $vary = null, bool $public = null, int $staleWhileRevalidate = null, int $staleIfError = null)
3938
{
4039
$this->etag = $etag;
4140
$this->maxAge = $maxAge;
4241
$this->sharedMaxAge = $sharedMaxAge;
4342
$this->vary = $vary;
4443
$this->public = $public;
45-
$this->resourceMetadataFactory = $resourceMetadataFactory;
4644
$this->staleWhileRevalidate = $staleWhileRevalidate;
4745
$this->staleIfError = $staleIfError;
4846
}
@@ -65,14 +63,7 @@ public function onKernelResponse(ResponseEvent $event): void
6563
return;
6664
}
6765

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-
}
66+
$resourceCacheHeaders = $attributes['cache_headers'] ?? [];
7667

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

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: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,14 @@ 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
}
5643

5744
$hasRequestAttributeKey = false;
58-
if (isset($attributes['_api_operation_name'])) {
45+
if (isset($attributes['_api_item_operation_name'])) {
5946
$hasRequestAttributeKey = true;
60-
$result['operation_name'] = $attributes['_api_operation_name'];
47+
$result['operation_name'] = $attributes['_api_item_operation_name'];
6148
}
6249
if (isset($attributes['_api_operation'])) {
6350
$result['operation'] = $attributes['_api_operation'];

tests/HttpCache/EventListener/AddHeadersListenerTest.php

Lines changed: 2 additions & 139 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;
@@ -108,10 +106,7 @@ public function testAddHeaders()
108106
$response
109107
);
110108

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);
109+
$listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, 15, 30);
115110
$listener->onKernelResponse($event);
116111

117112
$this->assertSame('"9893532233caff98cd083a116b013c0b"', $response->getEtag());
@@ -134,143 +129,11 @@ public function testDoNotSetHeaderWhenAlreadySet()
134129
$response
135130
);
136131

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);
132+
$listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, 15, 30);
141133
$listener->onKernelResponse($event);
142134

143135
$this->assertSame('"etag"', $response->getEtag());
144136
$this->assertSame('max-age=300, public, s-maxage=400, stale-if-error=30, stale-while-revalidate=15', $response->headers->get('Cache-Control'));
145137
$this->assertSame(['Accept', 'Cookie', 'Accept-Encoding'], $response->getVary());
146138
}
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-
}
276139
}

0 commit comments

Comments
 (0)