objectManager = Bootstrap::getObjectManager(); } /** * Test for custom type which point to the invalid product/category/cms page. * * @magentoApiDataFixture Magento/UrlRewrite/_files/url_rewrite_not_existing_entity.php */ public function testNonExistentEntityUrlRewrite() { $urlPath = 'non-exist-entity.html'; $query = <<expectExceptionMessage( "No such entity found with matching URL key: " . $urlPath ); $this->graphQlQuery($query); } /** * Test for url rewrite to clean cache on rewrites update * * @magentoApiDataFixture Magento/Catalog/_files/product_with_category.php * @magentoApiDataFixture Magento/Cms/_files/pages.php * * @dataProvider urlRewriteEntitiesDataProvider * @param string $requestPath * @throws AlreadyExistsException */ public function testUrlRewriteCleansCacheOnChange(string $requestPath) { /** @var UrlRewriteResourceModel $urlRewriteResourceModel */ $urlRewriteResourceModel = $this->objectManager->create(UrlRewriteResourceModel::class); $storeId = 1; $query = function ($requestUrl) { return <<graphQlQuery($query($requestPath)); $this->assertEquals($requestPath, $apiResponse['urlResolver']['relative_url']); $urlRewrite = $this->getUrlRewriteModelByRequestPath($requestPath, $storeId); // renaming entity request path and validating that API will not return cached response $urlRewrite->setRequestPath('test' . $requestPath); $urlRewriteResourceModel->save($urlRewrite); $apiResponse = $this->graphQlQuery($query($requestPath)); $this->assertNull($apiResponse['urlResolver']); // rolling back changes $urlRewrite->setRequestPath($requestPath); $urlRewriteResourceModel->save($urlRewrite); } public function urlRewriteEntitiesDataProvider(): array { return [ [ 'simple-product-in-stock.html' ], [ 'category-1.html' ], [ 'page100' ] ]; } /** * Test for custom url rewrite to clean cache on update combinations * * @magentoApiDataFixture Magento/Catalog/_files/product_with_category.php * @magentoApiDataFixture Magento/Cms/_files/pages.php * * @throws AlreadyExistsException */ public function testUrlRewriteCleansCacheForCustomRewrites() { /** @var UrlRewriteResourceModel $urlRewriteResourceModel */ $urlRewriteResourceModel = $this->objectManager->create(UrlRewriteResourceModel::class); $storeId = 1; $query = function ($requestUrl) { return <<objectManager->create(UrlRewriteModel::class); $urlRewrite->setEntityType('custom') ->setRedirectType(302) ->setStoreId($storeId) ->setDescription(null) ->setIsAutogenerated(0); // create second custom url rewrite and target it to previous one to check // if proper final target url will be resolved $secondUrlRewrite = $this->objectManager->create(UrlRewriteModel::class); $secondUrlRewrite->setEntityType('custom') ->setRedirectType(302) ->setStoreId($storeId) ->setRequestPath($customSecondRequestPath) ->setTargetPath($customRequestPath) ->setDescription(null) ->setIsAutogenerated(0); $urlRewriteResourceModel->save($secondUrlRewrite); foreach ($entitiesRequestPaths as $entityRequestPath) { // updating custom rewrite for each entity $urlRewrite->setRequestPath($customRequestPath) ->setTargetPath($entityRequestPath); $urlRewriteResourceModel->save($urlRewrite); // confirm that API returns non-cached response for the first custom rewrite $apiResponse = $this->graphQlQuery($query($customRequestPath)); $this->assertEquals($entityRequestPath, $apiResponse['urlResolver']['relative_url']); // confirm that API returns non-cached response for the second custom rewrite $apiResponse = $this->graphQlQuery($query($customSecondRequestPath)); $this->assertEquals($entityRequestPath, $apiResponse['urlResolver']['relative_url']); } $urlRewriteResourceModel->delete($secondUrlRewrite); // delete custom rewrite and validate that API will not return cached response $urlRewriteResourceModel->delete($urlRewrite); $apiResponse = $this->graphQlQuery($query($customRequestPath)); $this->assertNull($apiResponse['urlResolver']); } /** * Return UrlRewrite model instance by request_path * * @param string $requestPath * @param int $storeId * @return UrlRewriteModel */ private function getUrlRewriteModelByRequestPath(string $requestPath, int $storeId): UrlRewriteModel { /** @var UrlFinderInterface $urlFinder */ $urlFinder = $this->objectManager->get(UrlFinderInterface::class); /** @var UrlRewriteService $urlRewriteService */ $urlRewriteService = $urlFinder->findOneByData( [ 'request_path' => $requestPath, 'store_id' => $storeId ] ); /** @var UrlRewriteModel $urlRewrite */ $urlRewrite = $this->objectManager->create(UrlRewriteModel::class); $urlRewrite->load($urlRewriteService->getUrlRewriteId()); return $urlRewrite; } }