1515
1616use ApiPlatform \Core \Api \CachedIdentifiersExtractor ;
1717use ApiPlatform \Core \Api \IdentifiersExtractorInterface ;
18+ use ApiPlatform \Core \Api \ResourceClassResolverInterface ;
1819use ApiPlatform \Core \Tests \Fixtures \TestBundle \Doctrine \Generator \Uuid ;
1920use ApiPlatform \Core \Tests \Fixtures \TestBundle \Entity \Dummy ;
2021use ApiPlatform \Core \Tests \Fixtures \TestBundle \Entity \RelatedDummy ;
2122use PHPUnit \Framework \TestCase ;
23+ use Prophecy \Argument ;
2224use Psr \Cache \CacheItemInterface ;
2325use Psr \Cache \CacheItemPoolInterface ;
2426
2729 */
2830class CachedIdentifiersExtractorTest extends TestCase
2931{
30- public function identifiersProvider ()
32+ public function itemProvider ()
3133 {
32- yield [1 , 1 ];
33- yield [$ uuid = new Uuid (), $ uuid ->__toString ()];
34+ $ dummy = new Dummy ();
35+ $ dummy ->setId ($ id = 1 );
36+ yield [$ dummy , ['id ' => $ id ]];
37+
38+ $ dummy = new Dummy ();
39+ $ dummy ->setId ($ id = new Uuid ());
40+ yield [$ dummy , ['id ' => $ id ]];
3441 }
3542
3643 /**
37- * @dataProvider identifiersProvider
44+ * @dataProvider itemProvider
3845 */
39- public function testFirstPass ($ identifier , $ identifierValue )
46+ public function testFirstPass ($ item , $ expected )
4047 {
4148 $ key = 'iri_identifiers ' .md5 (Dummy::class);
4249
@@ -48,29 +55,25 @@ public function testFirstPass($identifier, $identifierValue)
4855 $ cacheItemPool ->getItem ($ key )->shouldBeCalled ()->willReturn ($ cacheItem );
4956 $ cacheItemPool ->save ($ cacheItem )->shouldBeCalled ();
5057
51- $ dummy = new Dummy ();
52- $ dummy ->setId ($ identifier );
53-
5458 $ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
55- $ decoration ->getIdentifiersFromItem ($ dummy )->shouldBeCalled ()->willReturn ([ ' id ' => $ identifierValue ] );
59+ $ decoration ->getIdentifiersFromItem ($ item )->shouldBeCalled ()->willReturn ($ expected );
5660
57- $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null );
61+ $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null , $ this -> getResourceClassResolver () );
5862
59- $ expectedResult = ['id ' => $ identifierValue ];
60- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromItem ($ dummy ));
61- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromItem ($ dummy ), 'Trigger the local cache ' );
63+ $ this ->assertSame ($ expected , $ identifiersExtractor ->getIdentifiersFromItem ($ item ));
64+ $ this ->assertSame ($ expected , $ identifiersExtractor ->getIdentifiersFromItem ($ item ), 'Trigger the local cache ' );
6265
6366 $ decoration ->getIdentifiersFromResourceClass (Dummy::class)->shouldBeCalled ()->willReturn (['id ' ]);
6467
6568 $ expectedResult = ['id ' ];
66- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromResourceClass (Dummy::class));
67- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromResourceClass (Dummy::class), 'Trigger the local cache ' );
69+ $ this ->assertSame ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromResourceClass (Dummy::class));
70+ $ this ->assertSame ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromResourceClass (Dummy::class), 'Trigger the local cache ' );
6871 }
6972
7073 /**
71- * @dataProvider identifiersProvider
74+ * @dataProvider itemProvider
7275 */
73- public function testSecondPass ($ identifier , $ identifierValue )
76+ public function testSecondPass ($ item , $ expected )
7477 {
7578 $ key = 'iri_identifiers ' .md5 (Dummy::class);
7679
@@ -81,20 +84,49 @@ public function testSecondPass($identifier, $identifierValue)
8184 $ cacheItemPool = $ this ->prophesize (CacheItemPoolInterface::class);
8285 $ cacheItemPool ->getItem ($ key )->shouldBeCalled ()->willReturn ($ cacheItem );
8386
87+ $ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
88+ $ decoration ->getIdentifiersFromItem ($ item )->shouldNotBeCalled ();
89+
90+ $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null , $ this ->getResourceClassResolver ());
91+
92+ $ this ->assertSame ($ expected , $ identifiersExtractor ->getIdentifiersFromItem ($ item ));
93+ $ this ->assertSame ($ expected , $ identifiersExtractor ->getIdentifiersFromItem ($ item ), 'Trigger the local cache ' );
94+ }
95+
96+ public function identifiersRelatedProvider ()
97+ {
98+ $ related = new RelatedDummy ();
99+ $ related ->setId ($ relatedId = 2 );
100+
84101 $ dummy = new Dummy ();
85- $ dummy ->setId ($ identifier );
102+ $ dummy ->setId ($ id = 1 );
103+ $ dummy ->setRelatedDummy ($ related );
86104
87- $ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
88- $ decoration ->getIdentifiersFromItem ($ dummy )->shouldNotBeCalled ();
105+ yield [$ dummy , ['id ' => $ id , 'relatedDummy ' => $ relatedId ]];
89106
90- $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null );
107+ $ related = new RelatedDummy ();
108+ $ related ->setId ($ relatedId = 1 );
91109
92- $ expectedResult = ['id ' => $ identifierValue ];
93- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromItem ($ dummy ));
94- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromItem ($ dummy ), 'Trigger the local cache ' );
110+ $ dummy = new Dummy ();
111+ $ dummy ->setId ($ id = new Uuid ());
112+ $ dummy ->setRelatedDummy ($ related );
113+
114+ yield [$ dummy , ['id ' => $ id , 'relatedDummy ' => $ relatedId ]];
115+
116+ $ related = new RelatedDummy ();
117+ $ related ->setId ($ relatedId = new Uuid ());
118+
119+ $ dummy = new Dummy ();
120+ $ dummy ->setId ($ id = new Uuid ());
121+ $ dummy ->setRelatedDummy ($ related );
122+
123+ yield [$ dummy , ['id ' => $ id , 'relatedDummy ' => $ relatedId ]];
95124 }
96125
97- public function testFirstPassWithRelated ()
126+ /**
127+ * @dataProvider identifiersRelatedProvider
128+ */
129+ public function testFirstPassWithRelated ($ item , $ expected )
98130 {
99131 $ key = 'iri_identifiers ' .md5 (Dummy::class);
100132 $ keyRelated = 'iri_identifiers ' .md5 (RelatedDummy::class);
@@ -110,24 +142,19 @@ public function testFirstPassWithRelated()
110142 $ cacheItemPool ->getItem ($ key )->shouldBeCalled ()->willReturn ($ cacheItem );
111143 $ cacheItemPool ->getItem ($ keyRelated )->shouldBeCalled ()->willReturn ($ cacheItemRelated );
112144
113- $ related = new RelatedDummy ();
114- $ related ->setId (1 );
115-
116- $ dummy = new Dummy ();
117- $ dummy ->setId (1 );
118- $ dummy ->setRelatedDummy ($ related );
119-
120145 $ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
121- $ decoration ->getIdentifiersFromItem ($ dummy )->shouldBeCalled ()->willReturn ([ ' id ' => 1 , ' relatedDummy ' => 1 ] );
146+ $ decoration ->getIdentifiersFromItem ($ item )->shouldBeCalled ()->willReturn ($ expected );
122147
123- $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null );
148+ $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null , $ this -> getResourceClassResolver () );
124149
125- $ expectedResult = ['id ' => 1 , 'relatedDummy ' => 1 ];
126- $ this ->assertEquals (['id ' => 1 , 'relatedDummy ' => 1 ], $ identifiersExtractor ->getIdentifiersFromItem ($ dummy ));
127- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromItem ($ dummy ), 'Trigger the local cache ' );
150+ $ this ->assertSame ($ expected , $ identifiersExtractor ->getIdentifiersFromItem ($ item ));
151+ $ this ->assertSame ($ expected , $ identifiersExtractor ->getIdentifiersFromItem ($ item ), 'Trigger the local cache ' );
128152 }
129153
130- public function testSecondPassWithRelated ()
154+ /**
155+ * @dataProvider identifiersRelatedProvider
156+ */
157+ public function testSecondPassWithRelated ($ item , $ expected )
131158 {
132159 $ key = 'iri_identifiers ' .md5 (Dummy::class);
133160 $ keyRelated = 'iri_identifiers ' .md5 (RelatedDummy::class);
@@ -144,20 +171,38 @@ public function testSecondPassWithRelated()
144171 $ cacheItemPool ->getItem ($ key )->shouldBeCalled ()->willReturn ($ cacheItem );
145172 $ cacheItemPool ->getItem ($ keyRelated )->shouldBeCalled ()->willReturn ($ cacheItemRelated );
146173
147- $ related = new RelatedDummy ( );
148- $ related -> setId ( 1 );
174+ $ decoration = $ this -> prophesize (IdentifiersExtractorInterface::class );
175+ $ decoration -> getIdentifiersFromItem ( $ item )-> shouldNotBeCalled ( );
149176
150- $ dummy = new Dummy ();
151- $ dummy ->setId (1 );
152- $ dummy ->setRelatedDummy ($ related );
177+ $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null , $ this ->getResourceClassResolver ());
178+
179+ $ this ->assertSame ($ expected , $ identifiersExtractor ->getIdentifiersFromItem ($ item ));
180+ $ this ->assertSame ($ expected , $ identifiersExtractor ->getIdentifiersFromItem ($ item ), 'Trigger the local cache ' );
181+ }
153182
183+ /**
184+ * @group legacy
185+ * @expectedDeprecation Not injecting ApiPlatform\Core\Api\ResourceClassResolverInterface in the CachedIdentifiersExtractor might introduce cache issues with object identifiers.
186+ */
187+ public function testDeprecationResourceClassResolver ()
188+ {
189+ $ cacheItemPool = $ this ->prophesize (CacheItemPoolInterface::class);
154190 $ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
155- $ decoration ->getIdentifiersFromItem ($ dummy )->shouldNotBeCalled ();
156191
157192 $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null );
193+ }
194+
195+ private function getResourceClassResolver ()
196+ {
197+ $ resourceClassResolver = $ this ->prophesize (ResourceClassResolverInterface::class);
198+ $ resourceClassResolver ->isResourceClass (Argument::type ('string ' ))->will (function ($ args ) {
199+ if (Uuid::class === $ args [0 ]) {
200+ return false ;
201+ }
202+
203+ return true ;
204+ });
158205
159- $ expectedResult = ['id ' => 1 , 'relatedDummy ' => 1 ];
160- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromItem ($ dummy ));
161- $ this ->assertEquals ($ expectedResult , $ identifiersExtractor ->getIdentifiersFromItem ($ dummy ), 'Trigger the local cache ' );
206+ return $ resourceClassResolver ->reveal ();
162207 }
163208}
0 commit comments