15
15
16
16
use ApiPlatform \Core \Api \CachedIdentifiersExtractor ;
17
17
use ApiPlatform \Core \Api \IdentifiersExtractorInterface ;
18
+ use ApiPlatform \Core \Api \ResourceClassResolverInterface ;
18
19
use ApiPlatform \Core \Tests \Fixtures \TestBundle \Doctrine \Generator \Uuid ;
19
20
use ApiPlatform \Core \Tests \Fixtures \TestBundle \Entity \Dummy ;
20
21
use ApiPlatform \Core \Tests \Fixtures \TestBundle \Entity \RelatedDummy ;
21
22
use PHPUnit \Framework \TestCase ;
23
+ use Prophecy \Argument ;
22
24
use Psr \Cache \CacheItemInterface ;
23
25
use Psr \Cache \CacheItemPoolInterface ;
24
26
27
29
*/
28
30
class CachedIdentifiersExtractorTest extends TestCase
29
31
{
30
- public function identifiersProvider ()
32
+ public function itemProvider ()
31
33
{
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 ]];
34
41
}
35
42
36
43
/**
37
- * @dataProvider identifiersProvider
44
+ * @dataProvider itemProvider
38
45
*/
39
- public function testFirstPass ($ identifier , $ identifierValue )
46
+ public function testFirstPass ($ item , $ expected )
40
47
{
41
48
$ key = 'iri_identifiers ' .md5 (Dummy::class);
42
49
@@ -48,29 +55,25 @@ public function testFirstPass($identifier, $identifierValue)
48
55
$ cacheItemPool ->getItem ($ key )->shouldBeCalled ()->willReturn ($ cacheItem );
49
56
$ cacheItemPool ->save ($ cacheItem )->shouldBeCalled ();
50
57
51
- $ dummy = new Dummy ();
52
- $ dummy ->setId ($ identifier );
53
-
54
58
$ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
55
- $ decoration ->getIdentifiersFromItem ($ dummy )->shouldBeCalled ()->willReturn ([ ' id ' => $ identifierValue ] );
59
+ $ decoration ->getIdentifiersFromItem ($ item )->shouldBeCalled ()->willReturn ($ expected );
56
60
57
- $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null );
61
+ $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null , $ this -> getResourceClassResolver () );
58
62
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 ' );
62
65
63
66
$ decoration ->getIdentifiersFromResourceClass (Dummy::class)->shouldBeCalled ()->willReturn (['id ' ]);
64
67
65
68
$ 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 ' );
68
71
}
69
72
70
73
/**
71
- * @dataProvider identifiersProvider
74
+ * @dataProvider itemProvider
72
75
*/
73
- public function testSecondPass ($ identifier , $ identifierValue )
76
+ public function testSecondPass ($ item , $ expected )
74
77
{
75
78
$ key = 'iri_identifiers ' .md5 (Dummy::class);
76
79
@@ -81,20 +84,49 @@ public function testSecondPass($identifier, $identifierValue)
81
84
$ cacheItemPool = $ this ->prophesize (CacheItemPoolInterface::class);
82
85
$ cacheItemPool ->getItem ($ key )->shouldBeCalled ()->willReturn ($ cacheItem );
83
86
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
+
84
101
$ dummy = new Dummy ();
85
- $ dummy ->setId ($ identifier );
102
+ $ dummy ->setId ($ id = 1 );
103
+ $ dummy ->setRelatedDummy ($ related );
86
104
87
- $ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
88
- $ decoration ->getIdentifiersFromItem ($ dummy )->shouldNotBeCalled ();
105
+ yield [$ dummy , ['id ' => $ id , 'relatedDummy ' => $ relatedId ]];
89
106
90
- $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null );
107
+ $ related = new RelatedDummy ();
108
+ $ related ->setId ($ relatedId = 1 );
91
109
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 ]];
95
124
}
96
125
97
- public function testFirstPassWithRelated ()
126
+ /**
127
+ * @dataProvider identifiersRelatedProvider
128
+ */
129
+ public function testFirstPassWithRelated ($ item , $ expected )
98
130
{
99
131
$ key = 'iri_identifiers ' .md5 (Dummy::class);
100
132
$ keyRelated = 'iri_identifiers ' .md5 (RelatedDummy::class);
@@ -110,24 +142,19 @@ public function testFirstPassWithRelated()
110
142
$ cacheItemPool ->getItem ($ key )->shouldBeCalled ()->willReturn ($ cacheItem );
111
143
$ cacheItemPool ->getItem ($ keyRelated )->shouldBeCalled ()->willReturn ($ cacheItemRelated );
112
144
113
- $ related = new RelatedDummy ();
114
- $ related ->setId (1 );
115
-
116
- $ dummy = new Dummy ();
117
- $ dummy ->setId (1 );
118
- $ dummy ->setRelatedDummy ($ related );
119
-
120
145
$ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
121
- $ decoration ->getIdentifiersFromItem ($ dummy )->shouldBeCalled ()->willReturn ([ ' id ' => 1 , ' relatedDummy ' => 1 ] );
146
+ $ decoration ->getIdentifiersFromItem ($ item )->shouldBeCalled ()->willReturn ($ expected );
122
147
123
- $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null );
148
+ $ identifiersExtractor = new CachedIdentifiersExtractor ($ cacheItemPool ->reveal (), $ decoration ->reveal (), null , $ this -> getResourceClassResolver () );
124
149
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 ' );
128
152
}
129
153
130
- public function testSecondPassWithRelated ()
154
+ /**
155
+ * @dataProvider identifiersRelatedProvider
156
+ */
157
+ public function testSecondPassWithRelated ($ item , $ expected )
131
158
{
132
159
$ key = 'iri_identifiers ' .md5 (Dummy::class);
133
160
$ keyRelated = 'iri_identifiers ' .md5 (RelatedDummy::class);
@@ -144,20 +171,38 @@ public function testSecondPassWithRelated()
144
171
$ cacheItemPool ->getItem ($ key )->shouldBeCalled ()->willReturn ($ cacheItem );
145
172
$ cacheItemPool ->getItem ($ keyRelated )->shouldBeCalled ()->willReturn ($ cacheItemRelated );
146
173
147
- $ related = new RelatedDummy ( );
148
- $ related -> setId ( 1 );
174
+ $ decoration = $ this -> prophesize (IdentifiersExtractorInterface::class );
175
+ $ decoration -> getIdentifiersFromItem ( $ item )-> shouldNotBeCalled ( );
149
176
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
+ }
153
182
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);
154
190
$ decoration = $ this ->prophesize (IdentifiersExtractorInterface::class);
155
- $ decoration ->getIdentifiersFromItem ($ dummy )->shouldNotBeCalled ();
156
191
157
192
$ 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
+ });
158
205
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 ();
162
207
}
163
208
}
0 commit comments