diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php index 21b085c4c419f0d03bcb72389627ec665582f298..cb30f7abc71792b72d0b78e24b4ba89e25303d67 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php @@ -42,13 +42,18 @@ class CategoryUrlPathAutogeneratorObserver implements ObserverInterface /** * @param \Magento\Framework\Event\Observer $observer * @return void + * @throws \Magento\Framework\Exception\LocalizedException */ public function execute(\Magento\Framework\Event\Observer $observer) { /** @var Category $category */ $category = $observer->getEvent()->getCategory(); if ($category->getUrlKey() !== false) { - $category->setUrlKey($this->categoryUrlPathGenerator->getUrlKey($category)) + $resultUrlKey = $this->categoryUrlPathGenerator->getUrlKey($category); + if (empty($resultUrlKey)) { + throw new \Magento\Framework\Exception\LocalizedException(__('Invalid URL key')); + } + $category->setUrlKey($resultUrlKey) ->setUrlPath($this->categoryUrlPathGenerator->getUrlPath($category)); if (!$category->isObjectNew()) { $category->getResource()->saveAttribute($category, 'url_path'); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php index f2d10d59e02c499fca965ce2a38a03804adc3654..45a74260e927001bcf39148dc2f5d9a9574d0189 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php @@ -30,18 +30,38 @@ class Save extends \Magento\Backend\App\Action */ protected $dataPersistor; + /** + * @var \Magento\Cms\Model\PageFactory + */ + private $pageFactory; + + /** + * @var \Magento\Cms\Api\PageRepositoryInterface + */ + private $pageRepository; + /** * @param Action\Context $context * @param PostDataProcessor $dataProcessor * @param DataPersistorInterface $dataPersistor + * @param \Magento\Cms\Model\PageFactory $pageFactory + * @param \Magento\Cms\Api\PageRepositoryInterface $pageRepository + * */ public function __construct( Action\Context $context, PostDataProcessor $dataProcessor, - DataPersistorInterface $dataPersistor + DataPersistorInterface $dataPersistor, + \Magento\Cms\Model\PageFactory $pageFactory = null, + \Magento\Cms\Api\PageRepositoryInterface $pageRepository = null ) { $this->dataProcessor = $dataProcessor; $this->dataPersistor = $dataPersistor; + $this->pageFactory = $pageFactory + ?: \Magento\Framework\App\ObjectManager::getInstance()->get(\Magento\Cms\Model\PageFactory::class); + $this->pageRepository = $pageRepository + ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Cms\Api\PageRepositoryInterface::class); parent::__construct($context); } @@ -66,7 +86,7 @@ class Save extends \Magento\Backend\App\Action } /** @var \Magento\Cms\Model\Page $model */ - $model = $this->_objectManager->create(\Magento\Cms\Model\Page::class); + $model = $this->pageFactory->create(); $id = $this->getRequest()->getParam('page_id'); if ($id) { @@ -85,7 +105,7 @@ class Save extends \Magento\Backend\App\Action } try { - $model->save(); + $this->pageRepository->save($model); $this->messageManager->addSuccess(__('You saved the page.')); $this->dataPersistor->clear('cms_page'); if ($this->getRequest()->getParam('back')) { diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php index 7495a2ad1bad924c241e9fae564785574f13a3a1..12057d2681c20cf8cbc5822d6180b9df96b095ee 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php @@ -13,73 +13,61 @@ class SaveTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $requestMock; + private $requestMock; /** * @var \Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor|\PHPUnit_Framework_MockObject_MockObject */ - protected $dataProcessorMock; + private $dataProcessorMock; /** * @var \Magento\Framework\App\Request\DataPersistorInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $dataPersistorMock; + private $dataPersistorMock; /** * @var \Magento\Backend\Model\View\Result\RedirectFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $resultRedirectFactory; + private $resultRedirectFactory; /** * @var \Magento\Backend\Model\View\Result\Redirect|\PHPUnit_Framework_MockObject_MockObject */ - protected $resultRedirect; + private $resultRedirect; /** - * @var \Magento\Backend\App\Action\Context|\PHPUnit_Framework_MockObject_MockObject - */ - protected $contextMock; - - /** - * @var \Magento\Framework\ObjectManager\ObjectManager|\PHPUnit_Framework_MockObject_MockObject - */ - protected $objectManagerMock; - - /** - * @var \Magento\Cms\Model\Page|\PHPUnit_Framework_MockObject_MockObject $pageMock + * @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $pageMock; + private $messageManagerMock; /** - * @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $messageManagerMock; + private $eventManagerMock; /** - * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Cms\Model\PageFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $eventManagerMock; + private $pageFactory; /** - * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + * @var \Magento\Cms\Api\PageRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $objectManager; + private $pageRepository; /** * @var \Magento\Cms\Controller\Adminhtml\Page\Save */ - protected $saveController; + private $saveController; /** * @var int */ - protected $pageId = 1; + private $pageId = 1; protected function setUp() { - $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - - $this->contextMock = $this->getMock(\Magento\Backend\App\Action\Context::class, [], [], '', false); + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->resultRedirectFactory = $this->getMockBuilder(\Magento\Backend\Model\View\Result\RedirectFactory::class) ->disableOriginalConstructor() @@ -91,69 +79,37 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->resultRedirectFactory->expects($this->atLeastOnce()) ->method('create') ->willReturn($this->resultRedirect); - - $this->dataProcessorMock = $this->getMock( - \Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor::class, - ['filter'], - [], - '', - false - ); - + $this->dataProcessorMock = $this->getMockBuilder( + \Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor::class + )->setMethods(['filter'])->disableOriginalConstructor()->getMock(); $this->dataPersistorMock = $this->getMockBuilder(\Magento\Framework\App\Request\DataPersistorInterface::class) ->getMock(); - - $this->requestMock = $this->getMockForAbstractClass( - \Magento\Framework\App\RequestInterface::class, - [], - '', - false, - true, - true, - ['getParam', 'getPostValue'] - ); - - $this->pageMock = $this->getMockBuilder( - \Magento\Cms\Model\Page::class - )->disableOriginalConstructor()->getMock(); - - $this->messageManagerMock = $this->getMock( - \Magento\Framework\Message\ManagerInterface::class, - [], - [], - '', - false - ); - - $this->eventManagerMock = $this->getMockForAbstractClass( - \Magento\Framework\Event\ManagerInterface::class, - [], - '', - false, - true, - true, - ['dispatch'] - ); - - $this->objectManagerMock = $this->getMockBuilder(\Magento\Framework\ObjectManager\ObjectManager::class) + $this->requestMock = $this->getMockBuilder(\Magento\Framework\App\RequestInterface::class) + ->setMethods(['getParam', 'getPostValue']) + ->getMockForAbstractClass(); + $this->messageManagerMock = $this->getMockBuilder(\Magento\Framework\Message\ManagerInterface::class) + ->getMockForAbstractClass(); + $this->eventManagerMock = $this->getMockBuilder(\Magento\Framework\Event\ManagerInterface::class) + ->setMethods(['dispatch']) + ->getMockForAbstractClass(); + $this->pageFactory = $this->getMockBuilder(\Magento\Cms\Model\PageFactory::class) ->disableOriginalConstructor() - ->setMethods(['get', 'create']) + ->setMethods(['create']) ->getMock(); - - $this->contextMock->expects($this->any())->method('getRequest')->willReturn($this->requestMock); - $this->contextMock->expects($this->any())->method('getObjectManager')->willReturn($this->objectManagerMock); - $this->contextMock->expects($this->any())->method('getMessageManager')->willReturn($this->messageManagerMock); - $this->contextMock->expects($this->any())->method('getEventManager')->willReturn($this->eventManagerMock); - $this->contextMock->expects($this->any()) - ->method('getResultRedirectFactory') - ->willReturn($this->resultRedirectFactory); - - $this->saveController = $this->objectManager->getObject( + $this->pageRepository = $this->getMockBuilder(\Magento\Cms\Api\PageRepositoryInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->saveController = $objectManager->getObject( \Magento\Cms\Controller\Adminhtml\Page\Save::class, [ - 'context' => $this->contextMock, + 'request' => $this->requestMock, + 'messageManager' => $this->messageManagerMock, + 'eventManager' => $this->eventManagerMock, + 'resultRedirectFactory' => $this->resultRedirectFactory, 'dataProcessor' => $this->dataProcessorMock, 'dataPersistor' => $this->dataPersistorMock, + 'pageFactory' => $this->pageFactory, + 'pageRepository' => $this->pageRepository ] ); } @@ -190,20 +146,21 @@ class SaveTest extends \PHPUnit_Framework_TestCase ['back', null, false], ] ); - - $this->objectManagerMock->expects($this->atLeastOnce()) + $page = $this->getMockBuilder(\Magento\Cms\Model\Page::class) + ->disableOriginalConstructor() + ->getMock(); + $this->pageFactory->expects($this->atLeastOnce()) ->method('create') - ->with($this->equalTo(\Magento\Cms\Model\Page::class)) - ->willReturn($this->pageMock); + ->willReturn($page); - $this->pageMock->expects($this->any()) + $page->expects($this->any()) ->method('load') ->willReturnSelf(); - $this->pageMock->expects($this->any()) + $page->expects($this->any()) ->method('getId') ->willReturn(true); - $this->pageMock->expects($this->once())->method('setData'); - $this->pageMock->expects($this->once())->method('save'); + $page->expects($this->once())->method('setData'); + $this->pageRepository->expects($this->once())->method('save')->with($page); $this->dataPersistorMock->expects($this->any()) ->method('clear') @@ -240,20 +197,21 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->dataProcessorMock->expects($this->any()) ->method('filter') ->willReturnArgument(0); - - $this->objectManagerMock->expects($this->atLeastOnce()) + $page = $this->getMockBuilder(\Magento\Cms\Model\Page::class) + ->disableOriginalConstructor() + ->getMock(); + $this->pageFactory->expects($this->atLeastOnce()) ->method('create') - ->with($this->equalTo(\Magento\Cms\Model\Page::class)) - ->willReturn($this->pageMock); + ->willReturn($page); - $this->pageMock->expects($this->any()) + $page->expects($this->any()) ->method('load') ->willReturnSelf(); - $this->pageMock->expects($this->any()) + $page->expects($this->any()) ->method('getId') ->willReturn(true); - $this->pageMock->expects($this->once())->method('setData'); - $this->pageMock->expects($this->once())->method('save'); + $page->expects($this->once())->method('setData'); + $this->pageRepository->expects($this->once())->method('save')->with($page); $this->messageManagerMock->expects($this->once()) ->method('addSuccess') @@ -286,20 +244,22 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->dataProcessorMock->expects($this->any()) ->method('filter') ->willReturnArgument(0); - - $this->objectManagerMock->expects($this->atLeastOnce()) + $page = $this->getMockBuilder(\Magento\Cms\Model\Page::class) + ->disableOriginalConstructor() + ->getMock(); + $this->pageFactory->expects($this->atLeastOnce()) ->method('create') - ->with($this->equalTo(\Magento\Cms\Model\Page::class)) - ->willReturn($this->pageMock); + ->willReturn($page); - $this->pageMock->expects($this->any()) + $page->expects($this->any()) ->method('load') ->willReturnSelf(); - $this->pageMock->expects($this->any()) + $page->expects($this->any()) ->method('getId') ->willReturn(true); - $this->pageMock->expects($this->once())->method('setData'); - $this->pageMock->expects($this->once())->method('save')->willThrowException(new \Exception('Error message.')); + $page->expects($this->once())->method('setData'); + $this->pageRepository->expects($this->once())->method('save')->with($page) + ->willThrowException(new \Exception('Error message.')); $this->messageManagerMock->expects($this->never()) ->method('addSuccess'); diff --git a/app/code/Magento/CmsUrlRewrite/Test/Unit/Model/CmsPageUrlRewriteGeneratorTest.php b/app/code/Magento/CmsUrlRewrite/Test/Unit/Model/CmsPageUrlRewriteGeneratorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..96a964c3d2d33aa7b0e49baec1db61666718a6a9 --- /dev/null +++ b/app/code/Magento/CmsUrlRewrite/Test/Unit/Model/CmsPageUrlRewriteGeneratorTest.php @@ -0,0 +1,133 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CmsUrlRewrite\Test\Unit\Model; + + +class CmsPageUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $storeManager; + + /** + * @var \Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $urlRewriteFactory; + + /** + * @var \Magento\CmsUrlRewrite\Model\CmsPageUrlPathGenerator|\PHPUnit_Framework_MockObject_MockObject + */ + private $urlPathGenerator; + + /** + * @var \Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator + */ + private $urlRewriteGenerator; + + /** + * @return void + */ + protected function setUp() + { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->storeManager = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class) + ->getMockForAbstractClass(); + $this->urlRewriteFactory = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->urlPathGenerator = $this->getMockBuilder(\Magento\CmsUrlRewrite\Model\CmsPageUrlPathGenerator::class) + ->disableOriginalConstructor() + ->getMock(); + $this->urlRewriteGenerator = $this->objectManager->getObject( + \Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator::class, + [ + 'storeManager' => $this->storeManager, + 'urlRewriteFactory' => $this->urlRewriteFactory, + 'cmsPageUrlPathGenerator' => $this->urlPathGenerator + ] + ); + } + + public function testGenerateForAllStores() + { + $initializesStores = [0]; + $cmsPageId = 1; + $cmsPage = $this->getMockBuilder(\Magento\Cms\Model\Page::class) + ->disableOriginalConstructor() + ->getMock(); + $cmsPage->expects($this->any())->method('getStores')->willReturn($initializesStores); + $store = $this->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class) + ->setMethods(['getStoreId']) + ->getMockForAbstractClass(); + $this->storeManager->expects($this->any())->method('getStores')->willReturn([$store]); + $store->expects($this->any())->method('getStoreId')->willReturn($initializesStores[0]); + $urlRewrite = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) + ->getMockForAbstractClass(); + $this->urlRewriteFactory->expects($this->any())->method('create')->willReturn($urlRewrite); + $cmsPage->expects($this->any())->method('getId')->willReturn($cmsPageId); + $cmsPage->expects($this->any())->method('getIdentifier')->willReturn('request_path'); + $this->urlPathGenerator->expects($this->any())->method('getCanonicalUrlPath')->with($cmsPage) + ->willReturn('cms/page/view/page_id/' . $cmsPageId); + + $urls = $this->urlRewriteGenerator->generate($cmsPage); + $this->assertEquals($initializesStores[0], $urls[0]->getStoreId()); + $this->assertFalse(isset($urls[1])); + } + + public function testGenerateForSpecificStores() + { + $initializesStores = [1, 2]; + $cmsPageId = 1; + $cmsPage = $this->getMockBuilder(\Magento\Cms\Model\Page::class) + ->disableOriginalConstructor() + ->getMock(); + $cmsPage->expects($this->any())->method('getStores')->willReturn($initializesStores); + $firstStore = $this->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class) + ->setMethods(['getStoreId']) + ->getMockForAbstractClass(); + $secondStore = $this->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class) + ->setMethods(['getStoreId']) + ->getMockForAbstractClass(); + $this->storeManager->expects($this->any())->method('getStores')->willReturn( + [ + 1 => $firstStore, + 2 => $secondStore + ] + ); + $firstStore->expects($this->any())->method('getStoreId')->willReturn($initializesStores[0]); + $secondStore->expects($this->any())->method('getStoreId')->willReturn($initializesStores[1]); + + $urlRewriteFirst = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) + ->getMockForAbstractClass(); + $urlRewriteSecond = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) + ->getMockForAbstractClass(); + $this->urlRewriteFactory->expects($this->at(0))->method('create')->willReturn($urlRewriteFirst); + $this->urlRewriteFactory->expects($this->at(1))->method('create')->willReturn($urlRewriteSecond); + + $cmsPage->expects($this->any())->method('getId')->willReturn($cmsPageId); + $cmsPage->expects($this->any())->method('getIdentifier')->willReturn('request_path'); + $this->urlPathGenerator->expects($this->any())->method('getCanonicalUrlPath')->with($cmsPage) + ->willReturn('cms/page/view/page_id/' . $cmsPageId); + $urls = $this->urlRewriteGenerator->generate($cmsPage); + $this->assertEquals( + [ + $initializesStores[0], + $initializesStores[1] + ], + [ + $urls[0]->getStoreId(), + $urls[1]->getStoreId(), + ] + ); + } +} diff --git a/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php b/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php index d079c962cad3716d557feb593a10d246433bdd66..602c5db5c226e78ad2320e5ff6e2f0525ed32864 100644 --- a/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php +++ b/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php @@ -600,74 +600,74 @@ class ProcessCronQueueObserverTest extends \PHPUnit_Framework_TestCase public function testDispatchGenerate() { $jobConfig = [ - 'test_group' => [ - 'default' => [ - 'test_job1' => [ - 'instance' => 'CronJob', - 'method' => 'execute', - ], + 'default' => [ + 'test_job1' => [ + 'instance' => 'CronJob', + 'method' => 'execute', ], ], ]; - $this->_config->expects($this->at(0))->method('getJobs')->will($this->returnValue($jobConfig)); $jobs = [ - 'test_group' => [ - 'default' => [ - 'job1' => ['config_path' => 'test/path'], - 'job2' => ['schedule' => ''], - 'job3' => ['schedule' => '* * * * *'], - ], + 'default' => [ + 'job1' => ['config_path' => 'test/path'], + 'job2' => ['schedule' => ''], + 'job3' => ['schedule' => '* * * * *'], ], ]; - $this->_config->expects($this->at(1))->method('getJobs')->will($this->returnValue($jobs)); - $this->_request->expects($this->any())->method('getParam')->will($this->returnValue('test_group')); + $this->_config->expects($this->at(0))->method('getJobs')->willReturn($jobConfig); + $this->_config->expects($this->at(1))->method('getJobs')->willReturn($jobs); + $this->_request->expects($this->any())->method('getParam')->willReturn('default'); $this->_cache->expects( $this->at(0) )->method( 'load' )->with( - $this->equalTo(ProcessCronQueueObserver::CACHE_KEY_LAST_SCHEDULE_GENERATE_AT . 'test_group') - )->will( - $this->returnValue(time() - 10000000) - ); + $this->equalTo(ProcessCronQueueObserver::CACHE_KEY_LAST_SCHEDULE_GENERATE_AT . 'default') + )->willReturn(time() - 10000000); $this->_cache->expects( $this->at(2) )->method( 'load' )->with( - $this->equalTo(ProcessCronQueueObserver::CACHE_KEY_LAST_HISTORY_CLEANUP_AT . 'test_group') - )->will( - $this->returnValue(time() + 10000000) - ); + $this->equalTo(ProcessCronQueueObserver::CACHE_KEY_LAST_HISTORY_CLEANUP_AT . 'default') + )->willReturn(time() + 10000000); - $this->_scopeConfig->expects($this->at(0))->method('getValue')->will($this->returnValue(0)); + $this->_scopeConfig->expects($this->any())->method('getValue')->willReturnMap( + [ + [ + 'system/cron/default/schedule_generate_every', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE, + null, + 0 + ], + [ + 'system/cron/default/schedule_ahead_for', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE, + null, + 2 + ] + ] + ); - $scheduleMethods = ['getJobCode', 'getScheduledAt', 'trySchedule', 'unsScheduleId', 'save', '__wakeup']; $schedule = $this->getMockBuilder( \Magento\Cron\Model\Schedule::class )->setMethods( - $scheduleMethods + ['getJobCode', 'save', 'getScheduledAt', 'unsScheduleId', 'trySchedule', 'getCollection'] )->disableOriginalConstructor()->getMock(); - $schedule->expects($this->any())->method('getJobCode')->will($this->returnValue('job_code1')); - $schedule->expects($this->once())->method('getScheduledAt')->will($this->returnValue('* * * * *')); - $schedule->expects($this->any())->method('unsScheduleId')->will($this->returnSelf()); - $schedule->expects($this->any())->method('trySchedule')->will($this->returnSelf()); + $schedule->expects($this->any())->method('getJobCode')->willReturn('job_code1'); + $schedule->expects($this->once())->method('getScheduledAt')->willReturn('* * * * *'); + $schedule->expects($this->any())->method('unsScheduleId')->willReturnSelf(); + $schedule->expects($this->any())->method('trySchedule')->willReturnSelf(); + $schedule->expects($this->any())->method('getCollection')->willReturn($this->_collection); + $schedule->expects($this->exactly(1))->method('save')->willReturnSelf(); $this->_collection->addItem(new \Magento\Framework\DataObject()); $this->_collection->addItem($schedule); $this->_cache->expects($this->any())->method('save'); - $scheduleMock = $this->getMockBuilder( - \Magento\Cron\Model\Schedule::class - )->disableOriginalConstructor()->setMethods( - ['getCollection', '__wakeup'] - )->getMock(); - $scheduleMock->expects($this->any())->method('getCollection')->will($this->returnValue($this->_collection)); - $this->_scheduleFactory->expects($this->any())->method('create')->will($this->returnValue($scheduleMock)); - - $this->_scheduleFactory->expects($this->any())->method('create')->will($this->returnValue($schedule)); + $this->_scheduleFactory->expects($this->any())->method('create')->willReturn($schedule); $this->_observer->execute($this->observer); } diff --git a/app/code/Magento/Customer/Model/Account/Redirect.php b/app/code/Magento/Customer/Model/Account/Redirect.php index ac03bd02553c762535ba575a7ca1ad398afb606a..5a1470959b60d37758bc698cdc2abaeadd3aea25 100644 --- a/app/code/Magento/Customer/Model/Account/Redirect.php +++ b/app/code/Magento/Customer/Model/Account/Redirect.php @@ -9,6 +9,7 @@ use Magento\Customer\Model\Session; use Magento\Customer\Model\Url as CustomerUrl; use Magento\Framework\App\RequestInterface; use Magento\Framework\Controller\ResultFactory; +use Magento\Framework\Url\HostChecker; use Magento\Framework\UrlInterface; use Magento\Store\Model\ScopeInterface; use Magento\Store\Model\StoreManagerInterface; @@ -53,6 +54,7 @@ class Redirect protected $customerUrl; /** + * @deprecated * @var UrlInterface */ protected $url; @@ -67,6 +69,11 @@ class Redirect */ protected $cookieManager; + /** + * @var HostChecker + */ + private $hostChecker; + /** * @param RequestInterface $request * @param Session $customerSession @@ -76,6 +83,7 @@ class Redirect * @param DecoderInterface $urlDecoder * @param CustomerUrl $customerUrl * @param ResultFactory $resultFactory + * @param HostChecker|null $hostChecker */ public function __construct( RequestInterface $request, @@ -85,7 +93,8 @@ class Redirect UrlInterface $url, DecoderInterface $urlDecoder, CustomerUrl $customerUrl, - ResultFactory $resultFactory + ResultFactory $resultFactory, + HostChecker $hostChecker = null ) { $this->request = $request; $this->session = $customerSession; @@ -95,6 +104,7 @@ class Redirect $this->urlDecoder = $urlDecoder; $this->customerUrl = $customerUrl; $this->resultFactory = $resultFactory; + $this->hostChecker = $hostChecker ?: ObjectManager::getInstance()->get(HostChecker::class); } /** @@ -196,7 +206,7 @@ class Redirect $referer = $this->request->getParam(CustomerUrl::REFERER_QUERY_PARAM_NAME); if ($referer) { $referer = $this->urlDecoder->decode($referer); - if ($this->url->isOwnOriginUrl()) { + if ($this->hostChecker->isOwnOrigin($referer)) { $this->applyRedirect($referer); } } diff --git a/app/code/Magento/Customer/Model/Url.php b/app/code/Magento/Customer/Model/Url.php index fa2ff49aafd3abfab8d69c21589b0c6366150424..470093717549a871fb3deb6d74690dcfc45f4f2b 100644 --- a/app/code/Magento/Customer/Model/Url.php +++ b/app/code/Magento/Customer/Model/Url.php @@ -56,25 +56,43 @@ class Url */ protected $urlEncoder; + /** + * @var \Magento\Framework\Url\DecoderInterface + */ + private $urlDecoder; + + /** + * @var \Magento\Framework\Url\HostChecker + */ + private $hostChecker; + /** * @param Session $customerSession * @param ScopeConfigInterface $scopeConfig * @param RequestInterface $request * @param UrlInterface $urlBuilder * @param EncoderInterface $urlEncoder + * @param \Magento\Framework\Url\DecoderInterface|null $urlDecoder + * @param \Magento\Framework\Url\HostChecker|null $hostChecker */ public function __construct( Session $customerSession, ScopeConfigInterface $scopeConfig, RequestInterface $request, UrlInterface $urlBuilder, - EncoderInterface $urlEncoder + EncoderInterface $urlEncoder, + \Magento\Framework\Url\DecoderInterface $urlDecoder = null, + \Magento\Framework\Url\HostChecker $hostChecker = null ) { $this->request = $request; $this->urlBuilder = $urlBuilder; $this->scopeConfig = $scopeConfig; $this->customerSession = $customerSession; $this->urlEncoder = $urlEncoder; + $this->urlDecoder = $urlDecoder ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Url\DecoderInterface::class); + $this->hostChecker = $hostChecker ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Url\HostChecker::class); } /** @@ -95,7 +113,7 @@ class Url public function getLoginUrlParams() { $params = []; - $referer = $this->request->getParam(self::REFERER_QUERY_PARAM_NAME); + $referer = $this->getRequestReferrer(); if (!$referer && !$this->scopeConfig->isSetFlag( self::XML_PATH_CUSTOMER_STARTUP_REDIRECT_TO_DASHBOARD, @@ -122,9 +140,10 @@ class Url public function getLoginPostUrl() { $params = []; - if ($this->request->getParam(self::REFERER_QUERY_PARAM_NAME)) { + $referer = $this->getRequestReferrer(); + if ($referer) { $params = [ - self::REFERER_QUERY_PARAM_NAME => $this->request->getParam(self::REFERER_QUERY_PARAM_NAME), + self::REFERER_QUERY_PARAM_NAME => $referer, ]; } return $this->urlBuilder->getUrl('customer/account/loginPost', $params); @@ -220,4 +239,16 @@ class Url { return $this->urlBuilder->getUrl('customer/account/confirmation', ['email' => $email]); } + + /** + * @return mixed|null + */ + private function getRequestReferrer() + { + $referer = $this->request->getParam(self::REFERER_QUERY_PARAM_NAME); + if ($referer && $this->hostChecker->isOwnOrigin($this->urlDecoder->decode($referer))) { + return $referer; + } + return null; + } } diff --git a/app/code/Magento/Customer/Test/Unit/Model/Account/RedirectTest.php b/app/code/Magento/Customer/Test/Unit/Model/Account/RedirectTest.php index 5d512bcc6bda1a4fc0f154447a9ec91d74b74228..47b7ea669de30ead287169d1170acbb2c18ae301 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/Account/RedirectTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/Account/RedirectTest.php @@ -13,6 +13,7 @@ namespace Magento\Customer\Test\Unit\Model\Account; use Magento\Customer\Model\Account\Redirect; use Magento\Customer\Model\Url as CustomerUrl; use Magento\Framework\Controller\ResultFactory; +use Magento\Framework\Url\HostChecker; use Magento\Store\Model\ScopeInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -81,6 +82,11 @@ class RedirectTest extends \PHPUnit_Framework_TestCase */ protected $resultFactory; + /** + * @var HostChecker | \PHPUnit_Framework_MockObject_MockObject + */ + private $hostChecker; + protected function setUp() { $this->request = $this->getMockForAbstractClass(\Magento\Framework\App\RequestInterface::class); @@ -134,6 +140,10 @@ class RedirectTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); + $this->hostChecker = $this->getMockBuilder(HostChecker::class) + ->disableOriginalConstructor() + ->getMock(); + $objectManager = new ObjectManager($this); $this->model = $objectManager->getObject( \Magento\Customer\Model\Account\Redirect::class, @@ -145,7 +155,8 @@ class RedirectTest extends \PHPUnit_Framework_TestCase 'url' => $this->url, 'urlDecoder' => $this->urlDecoder, 'customerUrl' => $this->customerUrl, - 'resultFactory' => $this->resultFactory + 'resultFactory' => $this->resultFactory, + 'hostChecker' => $this->hostChecker ] ); } @@ -254,6 +265,7 @@ class RedirectTest extends \PHPUnit_Framework_TestCase $this->resultRedirect->expects($this->once()) ->method('setUrl') + ->with($beforeAuthUrl) ->willReturnSelf(); $this->resultFactory->expects($this->once()) @@ -286,6 +298,7 @@ class RedirectTest extends \PHPUnit_Framework_TestCase return [ // Loggend In, Redirect by Referer [1, 2, 'referer', 'base', '', '', 'account', '', '', '', true, false], + [1, 2, 'http://referer.com/', 'http://base.com/', '', '', 'account', '', '', 'dashboard', true, false], // Loggend In, Redirect by AfterAuthUrl [1, 2, 'referer', 'base', '', 'defined', 'account', '', '', '', true, true], // Not logged In, Redirect by LoginUrl diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/Backend/Test/Repository/ConfigData.xml index a341341cf7c1dfd873ed552c202a2ece65c4ef6c..fcf6e2ac0c4d0ece60aa742dfcb438456a0d9bd5 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Repository/ConfigData.xml +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Repository/ConfigData.xml @@ -212,5 +212,21 @@ <item name="inherit" xsi:type="string">1</item> </field> </dataset> + <dataset name="enable_single_store_mode"> + <field name="general/single_store_mode/enabled" xsi:type="array"> + <item name="scope" xsi:type="string">default</item> + <item name="scope_id" xsi:type="number">0</item> + <item name="label" xsi:type="string">Yes</item> + <item name="value" xsi:type="number">1</item> + </field> + </dataset> + <dataset name="enable_single_store_mode_rollback"> + <field name="general/single_store_mode/enabled" xsi:type="array"> + <item name="scope" xsi:type="string">default</item> + <item name="scope_id" xsi:type="number">0</item> + <item name="label" xsi:type="string">No</item> + <item name="value" xsi:type="number">0</item> + </field> + </dataset> </repository> </config> diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageFormSingleStoreMode.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageFormSingleStoreMode.php new file mode 100644 index 0000000000000000000000000000000000000000..4f96b2e3944751082b3371393d976e469bc7b81a --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageFormSingleStoreMode.php @@ -0,0 +1,40 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Cms\Test\Constraint; + +use Magento\Cms\Test\Fixture\CmsPage; +use Magento\Cms\Test\Page\Adminhtml\CmsPageIndex; +use Magento\Cms\Test\Page\Adminhtml\CmsPageNew; + +/** + * Assert that displayed CMS page data on edit page equals passed from fixture. + */ +class AssertCmsPageFormSingleStoreMode extends AssertCmsPageForm +{ + /** + * Assert that displayed CMS page data on edit page equals passed from fixture with enabled single store mode. + * + * @param CmsPage $cms + * @param CmsPageIndex $cmsIndex + * @param CmsPageNew $cmsPageNew + * @return void + */ + public function processAssert( + CmsPage $cms, + CmsPageIndex $cmsIndex, + CmsPageNew $cmsPageNew + ) { + $cmsIndex->open(); + $filter = ['title' => $cms->getTitle()]; + $cmsIndex->getCmsPageGridBlock()->searchAndOpen($filter); + + $cmsFormData = $cmsPageNew->getPageForm()->getData($cms); + $cmsFixtureData = $cms->getData(); + $errors = $this->verifyData($cmsFixtureData, $cmsFormData); + \PHPUnit_Framework_Assert::assertEmpty($errors, $errors); + } +} diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php index 250c55ff00d444635f08c2ea4a5f31d8b225fe10..4f02e7c4caf245528fab63d09d959ff3b8981779 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php @@ -6,6 +6,7 @@ namespace Magento\Cms\Test\TestCase; +use Magento\Config\Test\Fixture\ConfigData; use Magento\Cms\Test\Fixture\CmsPage as CmsPageFixture; use Magento\Cms\Test\Page\Adminhtml\CmsPageIndex; use Magento\Cms\Test\Page\Adminhtml\CmsPageNew; @@ -53,6 +54,13 @@ class CreateCmsPageEntityTest extends Injectable */ protected $fixtureFactory; + /** + * Configuration data. + * + * @var string + */ + private $configData; + /** * Inject pages. * @@ -73,10 +81,18 @@ class CreateCmsPageEntityTest extends Injectable * * @param array $data * @param string $fixtureType + * @param string $configData * @return array */ - public function test(array $data, $fixtureType) + public function test(array $data, $fixtureType, $configData = '') { + $this->configData = $configData; + + // Preconditions + $this->objectManager->create( + \Magento\Config\Test\TestStep\SetupConfigurationStep::class, + ['configData' => $configData] + )->run(); // Steps $cms = $this->fixtureFactory->createByCode($fixtureType, ['data' => $data]); $this->cmsIndex->open(); @@ -86,4 +102,19 @@ class CreateCmsPageEntityTest extends Injectable return ['cms' => $cms]; } + + /** + * Disable single store mode on config level. + * + * @return void + */ + public function tearDown() + { + if ($this->configData) { + $this->objectManager->create( + \Magento\Config\Test\TestStep\SetupConfigurationStep::class, + ['configData' => 'enable_single_store_mode', 'rollback' => true] + )->run(); + } + } } diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml index f8b6c8c3d9e06da90b122ba39d0c3f01eebc1978..fc024be14c699d1abb07629e701255ca0c6118f0 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml @@ -67,5 +67,17 @@ <constraint name="Magento\Cms\Test\Constraint\AssertCmsPagePreview" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageOnFrontend" /> </variation> + <variation name="CreateCmsPageEntityTestVariation6" summary="Create CMS page with single store mode" ticketId="MAGETWO-59654"> + <data name="tag" xsi:type="string">test_type:acceptance_test, test_type:extended_acceptance_test</data> + <data name="configData" xsi:type="string">enable_single_store_mode</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> + <data name="data/is_active" xsi:type="string">Yes</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/identifier" xsi:type="string">identifier-%isolation%</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> + <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageFormSingleStoreMode" /> + <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageOnFrontend" /> + </variation> </testCase> </config> diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php index 568450995f87ae0d0d11edd9dee5b03890e42129..042334a7619d85f31ed00623aff712086873c37a 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php @@ -41,6 +41,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase } /** + * @magentoAppArea adminhtml * @magentoDataFixture Magento/Catalog/_files/indexer_catalog_category.php * @magentoDbIsolation enabled */ @@ -214,7 +215,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase \Magento\Catalog\Model\Category::class ); - $result = $category->getCollection()->getItems(); + $result = $category->getCollection()->addAttributeToSelect('name')->getItems(); $result = array_slice($result, 2); return array_slice($result, 0, $count); diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php index 991d598401236c81a6be641b384e5a6587d55914..93fe95f83cbc98676bd14be0320b8517258ee7f3 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php @@ -25,13 +25,6 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); } - public function tearDown() - { - $category = $this->objectManager->create(\Magento\Catalog\Model\Category::class); - $category->load(3); - $category->delete(); - } - /** * @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories.php * @magentoDbIsolation enabled @@ -96,6 +89,37 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase $this->assertResults($categoryExpectedResult, $actualResults); } + /** + * @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories.php + * @magentoDbIsolation enabled + * @magentoAppIsolation enabled + * @param string $urlKey + * @dataProvider incorrectUrlRewritesDataProvider + */ + public function testGenerateUrlRewritesWithIncorrectUrlKey($urlKey) + { + $this->setExpectedException( + \Magento\Framework\Exception\LocalizedException::class, + 'Invalid URL key' + ); + /** @var \Magento\Catalog\Api\CategoryRepositoryInterface $repository */ + $repository = $this->objectManager->get(\Magento\Catalog\Api\CategoryRepositoryInterface::class); + $category = $repository->get(3); + $category->setUrlKey($urlKey); + $repository->save($category); + } + + /** + * @return array + */ + public function incorrectUrlRewritesDataProvider() + { + return [ + ['#'], + ['//'] + ]; + } + /** * @param array $filter * @return array diff --git a/lib/internal/Magento/Framework/Test/Unit/UrlTest.php b/lib/internal/Magento/Framework/Test/Unit/UrlTest.php index 36fce179395b5463fc3cf522defc5075038fc5c1..939e9a39bea584adc34037fcb9a899c4d3fe3e68 100644 --- a/lib/internal/Magento/Framework/Test/Unit/UrlTest.php +++ b/lib/internal/Magento/Framework/Test/Unit/UrlTest.php @@ -7,6 +7,7 @@ // @codingStandardsIgnoreFile namespace Magento\Framework\Test\Unit; +use Magento\Framework\Url\HostChecker; /** * Test class for Magento\Framework\Url @@ -59,6 +60,11 @@ class UrlTest extends \PHPUnit_Framework_TestCase */ protected $urlModifier; + /** + * @var HostChecker|\PHPUnit_Framework_MockObject_MockObject + */ + private $hostChecker; + protected function setUp() { $this->routeParamsResolverMock = $this->getMock( @@ -549,18 +555,17 @@ class UrlTest extends \PHPUnit_Framework_TestCase /** * @param bool $result - * @param string $baseUrl * @param string $referrer * @dataProvider isOwnOriginUrlDataProvider */ - public function testIsOwnOriginUrl($result, $baseUrl, $referrer) + public function testIsOwnOriginUrl($result, $referrer) { $requestMock = $this->getRequestMock(); - $model = $this->getUrlModel(['scopeResolver' => $this->scopeResolverMock, 'request' => $requestMock]); + $this->hostChecker = $this->getMockBuilder(HostChecker::class) + ->disableOriginalConstructor()->getMock(); + $this->hostChecker->expects($this->once())->method('isOwnOrigin')->with($referrer)->willReturn($result); + $model = $this->getUrlModel(['hostChecker' => $this->hostChecker, 'request' => $requestMock]); - $this->scopeMock->expects($this->any())->method('getBaseUrl')->will($this->returnValue($baseUrl)); - $this->scopeResolverMock->expects($this->any())->method('getScopes') - ->will($this->returnValue([$this->scopeMock])); $requestMock->expects($this->once())->method('getServer')->with('HTTP_REFERER') ->will($this->returnValue($referrer)); @@ -570,8 +575,8 @@ class UrlTest extends \PHPUnit_Framework_TestCase public function isOwnOriginUrlDataProvider() { return [ - 'is origin url' => [true, 'http://localhost/', 'http://localhost/'], - 'is not origin url' => [false, 'http://localhost/', 'http://example.com/'], + 'is origin url' => [true, 'http://localhost/'], + 'is not origin url' => [false, 'http://example.com/'], ]; } diff --git a/lib/internal/Magento/Framework/Url.php b/lib/internal/Magento/Framework/Url.php index 7361fdb336dd8ecd9ce58507dda027f1731f1d58..30af3528b2baba392095ecb86f9e65eb78bfd8a1 100644 --- a/lib/internal/Magento/Framework/Url.php +++ b/lib/internal/Magento/Framework/Url.php @@ -8,6 +8,8 @@ namespace Magento\Framework; +use Magento\Framework\Url\HostChecker; + /** * URL * @@ -178,6 +180,11 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur */ private $escaper; + /** + * @var HostChecker + */ + private $hostChecker; + /** * @param \Magento\Framework\App\Route\ConfigInterface $routeConfig * @param \Magento\Framework\App\RequestInterface $request @@ -191,6 +198,7 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur * @param \Magento\Framework\Url\RouteParamsPreprocessorInterface $routeParamsPreprocessor * @param string $scopeType * @param array $data + * @param HostChecker|null $hostChecker * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -205,7 +213,8 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Framework\Url\RouteParamsPreprocessorInterface $routeParamsPreprocessor, $scopeType, - array $data = [] + array $data = [], + HostChecker $hostChecker = null ) { $this->_request = $request; $this->_routeConfig = $routeConfig; @@ -218,6 +227,8 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur $this->_scopeConfig = $scopeConfig; $this->routeParamsPreprocessor = $routeParamsPreprocessor; $this->_scopeType = $scopeType; + $this->hostChecker = $hostChecker ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(HostChecker::class); parent::__construct($data); } @@ -1086,17 +1097,7 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur */ public function isOwnOriginUrl() { - $scopeDomains = []; - $referer = parse_url($this->_request->getServer('HTTP_REFERER'), PHP_URL_HOST); - foreach ($this->_scopeResolver->getScopes() as $scope) { - $scopeDomains[] = parse_url($scope->getBaseUrl(), PHP_URL_HOST); - $scopeDomains[] = parse_url($scope->getBaseUrl(UrlInterface::URL_TYPE_LINK, true), PHP_URL_HOST); - } - $scopeDomains = array_unique($scopeDomains); - if (empty($referer) || in_array($referer, $scopeDomains)) { - return true; - } - return false; + return $this->hostChecker->isOwnOrigin($this->_request->getServer('HTTP_REFERER')); } /** @@ -1163,7 +1164,7 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur private function getUrlModifier() { if ($this->urlModifier === null) { - $this->urlModifier = \Magento\Framework\App\ObjectManager::getInstance()->get( + $this->urlModifier = \Magento\Framework\App\ObjectManager::getInstance()->get( \Magento\Framework\Url\ModifierInterface::class ); } diff --git a/lib/internal/Magento/Framework/Url/HostChecker.php b/lib/internal/Magento/Framework/Url/HostChecker.php new file mode 100644 index 0000000000000000000000000000000000000000..32546595a040dee59dfd9de3dae2577c35bbf444 --- /dev/null +++ b/lib/internal/Magento/Framework/Url/HostChecker.php @@ -0,0 +1,48 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Url; + +use Magento\Framework\UrlInterface; + +/** + * Class provides functionality for checks of a host name + */ +class HostChecker +{ + /** + * @var \Magento\Framework\Url\ScopeResolverInterface + */ + private $scopeResolver; + + /** + * @param ScopeResolverInterface $scopeResolver + */ + public function __construct(ScopeResolverInterface $scopeResolver) + { + $this->scopeResolver = $scopeResolver; + } + + /** + * Check if provided URL is one of the domain URLs assigned to scopes + * + * @param string $url + * @return bool + */ + public function isOwnOrigin($url) + { + $scopeHostNames = []; + $hostName = parse_url($url, PHP_URL_HOST); + if (empty($hostName)) { + return true; + } + foreach ($this->scopeResolver->getScopes() as $scope) { + $scopeHostNames[] = parse_url($scope->getBaseUrl(), PHP_URL_HOST); + $scopeHostNames[] = parse_url($scope->getBaseUrl(UrlInterface::URL_TYPE_LINK, true), PHP_URL_HOST); + } + $scopeHostNames = array_unique($scopeHostNames); + return in_array($hostName, $scopeHostNames); + } +} diff --git a/lib/internal/Magento/Framework/Url/Test/Unit/HostCheckerTest.php b/lib/internal/Magento/Framework/Url/Test/Unit/HostCheckerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a6be097ac38ea19c2d1bdc2f8bac4cc12306f7b6 --- /dev/null +++ b/lib/internal/Magento/Framework/Url/Test/Unit/HostCheckerTest.php @@ -0,0 +1,63 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Url\Test\Unit; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; + +class HostCheckerTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Framework\Url\HostChecker */ + private $object; + + /** @var \Magento\Framework\Url\ScopeResolverInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $scopeResolver; + + /** + * @inheritdoc + */ + protected function setUp() + { + $this->scopeResolver = $this->getMockBuilder( + \Magento\Framework\Url\ScopeResolverInterface::class + )->getMock(); + + $objectManager = new ObjectManager($this); + $this->object = $objectManager->getObject( + \Magento\Framework\Url\HostChecker::class, + [ + 'scopeResolver' => $this->scopeResolver + ] + ); + } + + /** + * @dataProvider isOwnOriginDataProvider + * @param string $url + * @param boolean $result + */ + public function testIsOwnOrigin($url, $result) + { + $scopes[0] = $this->getMockBuilder(\Magento\Framework\Url\ScopeInterface::class)->getMock(); + $scopes[0]->expects($this->any())->method('getBaseUrl')->willReturn('http://www.example.com'); + $scopes[1] = $this->getMockBuilder(\Magento\Framework\Url\ScopeInterface::class)->getMock(); + $scopes[1]->expects($this->any())->method('getBaseUrl')->willReturn('https://www.example2.com'); + + $this->scopeResolver->expects($this->atLeastOnce())->method('getScopes')->willReturn($scopes); + + $this->assertEquals($result, $this->object->isOwnOrigin($url)); + } + + /** + * @return array + */ + public function isOwnOriginDataProvider() + { + return [ + ['http://www.example.com/some/page/', true], + ['http://www.test.com/other/page/', false], + ]; + } +}