7
7
8
8
namespace Magento \GraphQl \UrlRewrite ;
9
9
10
+ use Magento \Framework \Exception \AlreadyExistsException ;
11
+ use Magento \TestFramework \Helper \Bootstrap ;
10
12
use Magento \TestFramework \ObjectManager ;
11
13
use Magento \TestFramework \TestCase \GraphQlAbstract ;
14
+ use Magento \UrlRewrite \Model \ResourceModel \UrlRewrite as UrlRewriteResourceModel ;
15
+ use Magento \UrlRewrite \Model \UrlFinderInterface ;
16
+ use Magento \UrlRewrite \Model \UrlRewrite as UrlRewriteModel ;
17
+ use Magento \UrlRewrite \Service \V1 \Data \UrlRewrite as UrlRewriteService ;
12
18
13
19
/**
14
20
* Test the GraphQL endpoint's URLResolver query to verify canonical URL's are correctly returned.
@@ -20,7 +26,7 @@ class UrlResolverTest extends GraphQlAbstract
20
26
21
27
protected function setUp (): void
22
28
{
23
- $ this ->objectManager = \ Magento \ TestFramework \ Helper \ Bootstrap::getObjectManager ();
29
+ $ this ->objectManager = Bootstrap::getObjectManager ();
24
30
}
25
31
26
32
/**
@@ -50,4 +56,175 @@ public function testNonExistentEntityUrlRewrite()
50
56
);
51
57
$ this ->graphQlQuery ($ query );
52
58
}
59
+
60
+ /**
61
+ * Test for url rewrite to clean cache on rewrites update
62
+ *
63
+ * @magentoApiDataFixture Magento/Catalog/_files/product_with_category.php
64
+ * @magentoApiDataFixture Magento/Cms/_files/pages.php
65
+ *
66
+ * @dataProvider urlRewriteEntitiesDataProvider
67
+ * @param string $requestPath
68
+ * @throws AlreadyExistsException
69
+ */
70
+ public function testUrlRewriteCleansCacheOnChange (string $ requestPath )
71
+ {
72
+
73
+ /** @var UrlRewriteResourceModel $urlRewriteResourceModel */
74
+ $ urlRewriteResourceModel = $ this ->objectManager ->create (UrlRewriteResourceModel::class);
75
+ $ storeId = 1 ;
76
+ $ query = function ($ requestUrl ) {
77
+ return <<<QUERY
78
+ {
79
+ urlResolver(url:" {$ requestUrl }")
80
+ {
81
+ id
82
+ entity_uid
83
+ relative_url
84
+ type
85
+ redirectCode
86
+ }
87
+ }
88
+ QUERY ;
89
+ };
90
+
91
+ // warming up urlResolver API response cache for entity and validate proper response
92
+ $ apiResponse = $ this ->graphQlQuery ($ query ($ requestPath ))['urlResolver ' ];
93
+ $ this ->assertEquals ($ requestPath , $ apiResponse ['relative_url ' ]);
94
+
95
+ $ urlRewrite = $ this ->getUrlRewriteModelByRequestPath ($ requestPath , $ storeId );
96
+
97
+ // renaming entity request path and validating that API will not return cached response
98
+ $ urlRewrite ->setRequestPath ('test ' . $ requestPath );
99
+ $ urlRewriteResourceModel ->save ($ urlRewrite );
100
+ $ apiResponse = $ this ->graphQlQuery ($ query ($ requestPath ))['urlResolver ' ];
101
+ $ this ->assertNull ($ apiResponse ['relative_url ' ]);
102
+
103
+ // rolling back changes
104
+ $ urlRewrite ->setRequestPath ($ requestPath );
105
+ $ urlRewriteResourceModel ->save ($ urlRewrite );
106
+ }
107
+
108
+ public function urlRewriteEntitiesDataProvider (): array
109
+ {
110
+ return [
111
+ [
112
+ 'simple-product-in-stock.html '
113
+ ],
114
+ [
115
+ 'category-1.html '
116
+ ],
117
+ [
118
+ 'page100 '
119
+ ]
120
+ ];
121
+ }
122
+
123
+ /**
124
+ * Test for custom url rewrite to clean cache on update combinations
125
+ *
126
+ * @magentoApiDataFixture Magento/Catalog/_files/product_with_category.php
127
+ * @magentoApiDataFixture Magento/Cms/_files/pages.php
128
+ *
129
+ * @throws AlreadyExistsException
130
+ */
131
+ public function testUrlRewriteCleansCacheForCustomRewrites ()
132
+ {
133
+
134
+ /** @var UrlRewriteResourceModel $urlRewriteResourceModel */
135
+ $ urlRewriteResourceModel = $ this ->objectManager ->create (UrlRewriteResourceModel::class);
136
+ $ storeId = 1 ;
137
+ $ query = function ($ requestUrl ) {
138
+ return <<<QUERY
139
+ {
140
+ urlResolver(url:" {$ requestUrl }")
141
+ {
142
+ id
143
+ entity_uid
144
+ relative_url
145
+ type
146
+ redirectCode
147
+ }
148
+ }
149
+ QUERY ;
150
+ };
151
+
152
+ $ customRequestPath = 'test.html ' ;
153
+ $ customSecondRequestPath = 'test2.html ' ;
154
+ $ entitiesRequestPaths = [
155
+ 'simple-product-in-stock.html ' ,
156
+ 'category-1.html ' ,
157
+ 'page100 '
158
+ ];
159
+
160
+ // create custom url rewrite
161
+ $ urlRewrite = $ this ->objectManager ->create (UrlRewriteModel::class);
162
+ $ urlRewrite ->setEntityType ('custom ' )
163
+ ->setRedirectType (302 )
164
+ ->setStoreId ($ storeId )
165
+ ->setDescription (null )
166
+ ->setIsAutogenerated (0 );
167
+
168
+ // create second custom url rewrite and target it to previous one to check
169
+ // if proper final target url will be resolved
170
+ $ secondUrlRewrite = $ this ->objectManager ->create (UrlRewriteModel::class);
171
+ $ secondUrlRewrite ->setEntityType ('custom ' )
172
+ ->setRedirectType (302 )
173
+ ->setStoreId ($ storeId )
174
+ ->setRequestPath ($ customSecondRequestPath )
175
+ ->setTargetPath ($ customRequestPath )
176
+ ->setDescription (null )
177
+ ->setIsAutogenerated (0 );
178
+ $ urlRewriteResourceModel ->save ($ secondUrlRewrite );
179
+
180
+ foreach ($ entitiesRequestPaths as $ entityRequestPath ) {
181
+ // updating custom rewrite for each entity
182
+ $ urlRewrite ->setRequestPath ($ customRequestPath )
183
+ ->setTargetPath ($ entityRequestPath );
184
+ $ urlRewriteResourceModel ->save ($ urlRewrite );
185
+
186
+ // confirm that API returns non-cached response for the first custom rewrite
187
+ $ apiResponse = $ this ->graphQlQuery ($ query ($ customRequestPath ))['urlResolver ' ];
188
+ $ this ->assertEquals ($ entityRequestPath , $ apiResponse ['relative_url ' ]);
189
+
190
+ // confirm that API returns non-cached response for the second custom rewrite
191
+ $ apiResponse = $ this ->graphQlQuery ($ query ($ customSecondRequestPath ))['urlResolver ' ];
192
+ $ this ->assertEquals ($ entityRequestPath , $ apiResponse ['relative_url ' ]);
193
+ }
194
+
195
+ $ urlRewriteResourceModel ->delete ($ secondUrlRewrite );
196
+
197
+ // delete custom rewrite and validate that API will not return cached response
198
+ $ urlRewriteResourceModel ->delete ($ urlRewrite );
199
+ $ apiResponse = $ this ->graphQlQuery ($ query ($ customRequestPath ))['urlResolver ' ];
200
+ $ this ->assertNull ($ apiResponse ['relative_url ' ]);
201
+ }
202
+
203
+ /**
204
+ * Return UrlRewrite model instance by request_path
205
+ *
206
+ * @param string $requestPath
207
+ * @param int $storeId
208
+ * @return UrlRewriteModel
209
+ */
210
+ private function getUrlRewriteModelByRequestPath (string $ requestPath , int $ storeId ): UrlRewriteModel
211
+ {
212
+ /** @var UrlFinderInterface $urlFinder */
213
+ $ urlFinder = $ this ->objectManager ->get (UrlFinderInterface::class);
214
+
215
+ /** @var UrlRewriteService $urlRewriteService */
216
+ $ urlRewriteService = $ urlFinder ->findOneByData (
217
+ [
218
+ 'request_path ' => $ requestPath ,
219
+ 'store_id ' => $ storeId
220
+ ]
221
+ );
222
+
223
+ /** @var UrlRewriteModel $urlRewrite */
224
+ $ urlRewrite = $ this ->objectManager ->create (UrlRewriteModel::class);
225
+ $ urlRewrite ->load ($ urlRewriteService ->getUrlRewriteId ());
226
+
227
+ return $ urlRewrite ;
228
+ }
229
+
53
230
}
0 commit comments