diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet.php b/app/code/Magento/Authorizenet/Model/Authorizenet.php index 9ab3317a43bb97d950ab32196ce1f9596ba8f7e4..4408c68436707cbfae7332f32cf7d3c902b531f0 100644 --- a/app/code/Magento/Authorizenet/Model/Authorizenet.php +++ b/app/code/Magento/Authorizenet/Model/Authorizenet.php @@ -332,7 +332,7 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc ->setXCity($billing->getCity()) ->setXState($billing->getRegion()) ->setXZip($billing->getPostcode()) - ->setXCountry($billing->getCountry()) + ->setXCountry($billing->getCountryId()) ->setXPhone($billing->getTelephone()) ->setXFax($billing->getFax()) ->setXCustId($order->getCustomerId()) @@ -352,7 +352,7 @@ abstract class Authorizenet extends \Magento\Payment\Model\Method\Cc ->setXShipToCity($shipping->getCity()) ->setXShipToState($shipping->getRegion()) ->setXShipToZip($shipping->getPostcode()) - ->setXShipToCountry($shipping->getCountry()); + ->setXShipToCountry($shipping->getCountryId()); } $request->setXPoNum($payment->getPoNumber()) diff --git a/app/code/Magento/Authorizenet/Model/Directpost/Request.php b/app/code/Magento/Authorizenet/Model/Directpost/Request.php index 8be7ed5da15ac1dd627ce691ef1cd6eaf9455824..4d5da3e76dc1c3eb4ff204e9ec388f9cece87865 100644 --- a/app/code/Magento/Authorizenet/Model/Directpost/Request.php +++ b/app/code/Magento/Authorizenet/Model/Directpost/Request.php @@ -123,7 +123,7 @@ class Request extends AuthorizenetRequest ->setXCity(strval($billing->getCity())) ->setXState(strval($billing->getRegion())) ->setXZip(strval($billing->getPostcode())) - ->setXCountry(strval($billing->getCountry())) + ->setXCountry(strval($billing->getCountryId())) ->setXPhone(strval($billing->getTelephone())) ->setXFax(strval($billing->getFax())) ->setXCustId(strval($billing->getCustomerId())) @@ -151,7 +151,7 @@ class Request extends AuthorizenetRequest )->setXShipToZip( strval($shipping->getPostcode()) )->setXShipToCountry( - strval($shipping->getCountry()) + strval($shipping->getCountryId()) ); } diff --git a/app/code/Magento/Backend/App/Config.php b/app/code/Magento/Backend/App/Config.php index 0edfd070faa5689b23b2577eda73e8b3dec860f5..f0bae2a9d3c6fc64d0f6a3b26ce60043c05b06da 100644 --- a/app/code/Magento/Backend/App/Config.php +++ b/app/code/Magento/Backend/App/Config.php @@ -10,57 +10,66 @@ namespace Magento\Backend\App; +use Magento\Config\App\Config\Type\System; use Magento\Framework\App\Config\ScopeConfigInterface; /** - * Backend config accessor + * Backend config accessor. */ class Config implements ConfigInterface { /** - * @var \Magento\Framework\App\Config\ScopePool + * @var \Magento\Framework\App\Config */ - protected $_scopePool; + protected $appConfig; /** - * @param \Magento\Framework\App\Config\ScopePool $scopePool + * @var array */ - public function __construct(\Magento\Framework\App\Config\ScopePool $scopePool) + private $data; + + /** + * @param \Magento\Framework\App\Config $appConfig + * @return void + */ + public function __construct(\Magento\Framework\App\Config $appConfig) { - $this->_scopePool = $scopePool; + $this->appConfig = $appConfig; } /** - * Retrieve config value by path and scope - * - * @param string $path - * @return mixed + * @inheritdoc */ public function getValue($path) { - return $this->_scopePool->getScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null)->getValue($path); + if (isset($this->data[$path])) { + return $this->data[$path]; + } + + $configPath = ScopeConfigInterface::SCOPE_TYPE_DEFAULT; + if ($path) { + $configPath .= '/' . $path; + } + return $this->appConfig->get(System::CONFIG_TYPE, $configPath); } /** - * Set config value in the corresponding config scope - * - * @param string $path - * @param mixed $value - * @return void + * @inheritdoc */ public function setValue($path, $value) { - $this->_scopePool->getScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null)->setValue($path, $value); + $this->data[$path] = $value; } /** - * Retrieve config flag - * - * @param string $path - * @return bool + * @inheritdoc */ public function isSetFlag($path) { - return !!$this->_scopePool->getScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null)->getValue($path); + $configPath = ScopeConfigInterface::SCOPE_TYPE_DEFAULT; + if ($path) { + $configPath .= '/' . $path; + } + return (bool) $this->appConfig->get(System::CONFIG_TYPE, $configPath); } } diff --git a/app/code/Magento/Backend/App/ConfigInterface.php b/app/code/Magento/Backend/App/ConfigInterface.php index 4000b54cc983406a7e0707fe29a633f03d659e5a..5e73225a6aa694fff6f4afcb9ee6804b7faf9931 100644 --- a/app/code/Magento/Backend/App/ConfigInterface.php +++ b/app/code/Magento/Backend/App/ConfigInterface.php @@ -15,6 +15,8 @@ interface ConfigInterface /** * Retrieve config value by path * + * Path should looks like keys imploded by "/". For example scopes/stores/admin + * * @param string $path * @return mixed * @api @@ -24,6 +26,7 @@ interface ConfigInterface /** * Set config value * + * @deprecated * @param string $path * @param mixed $value * @return void @@ -34,6 +37,8 @@ interface ConfigInterface /** * Retrieve config flag * + * Path should looks like keys imploded by "/". For example scopes/stores/admin + * * @param string $path * @return bool * @api diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php index 1427cec7604e88935f53d6c108d77bb58357bdfa..11aa6bf86257cad79ea7698e6c9fdf893ba7082b 100644 --- a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php +++ b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php @@ -3,14 +3,13 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ +namespace Magento\Backend\Block\Widget\Grid\Column\Renderer; + +use Magento\Framework\DataObject; /** * Backend grid item renderer - * - * @author Magento Core Team <core@magentocommerce.com> */ -namespace Magento\Backend\Block\Widget\Grid\Column\Renderer; - class Text extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer { /** @@ -21,30 +20,53 @@ class Text extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRe protected $_variablePattern = '/\\$([a-z0-9_]+)/i'; /** - * Renders grid column + * Get value for the cel * - * @param \Magento\Framework\DataObject $row - * @return mixed + * @param DataObject $row + * @return string */ - public function _getValue(\Magento\Framework\DataObject $row) + public function _getValue(DataObject $row) { - $format = $this->getColumn()->getFormat() ? $this->getColumn()->getFormat() : null; - $defaultValue = $this->getColumn()->getDefault(); - if ($format === null) { - // If no format and it column not filtered specified return data as is. - $data = parent::_getValue($row); - $string = $data === null ? $defaultValue : $data; - return $this->escapeHtml($string); - } elseif (preg_match_all($this->_variablePattern, $format, $matches)) { - // Parsing of format string - $formattedString = $format; - foreach ($matches[0] as $matchIndex => $match) { - $value = $row->getData($matches[1][$matchIndex]); - $formattedString = str_replace($match, $value, $formattedString); + if (null === $this->getColumn()->getFormat()) { + return $this->getSimpleValue($row); + } + return $this->getFormattedValue($row); + } + + /** + * Get simple value + * + * @param DataObject $row + * @return string + */ + private function getSimpleValue(DataObject $row) + { + $data = parent::_getValue($row); + $value = null === $data ? $this->getColumn()->getDefault() : $data; + if (true === $this->getColumn()->getTranslate()) { + $value = __($value); + } + return $this->escapeHtml($value); + } + + /** + * Replace placeholders in the string with values + * + * @param DataObject $row + * @return string + */ + private function getFormattedValue(DataObject $row) + { + $value = $this->getColumn()->getFormat() ?: null; + if (true === $this->getColumn()->getTranslate()) { + $value = __($value); + } + if (preg_match_all($this->_variablePattern, $value, $matches)) { + foreach ($matches[0] as $index => $match) { + $replacement = $row->getData($matches[1][$index]); + $value = str_replace($match, $replacement, $value); } - return $formattedString; - } else { - return $this->escapeHtml($format); } + return $this->escapeHtml($value); } } diff --git a/app/code/Magento/Backend/Model/Session/Quote.php b/app/code/Magento/Backend/Model/Session/Quote.php index 12a4d4d138f5323f420dc56f5ba466e6efda0a46..6ca269488294a7d5036eedd9bacae42266ae8ea0 100644 --- a/app/code/Magento/Backend/Model/Session/Quote.php +++ b/app/code/Magento/Backend/Model/Session/Quote.php @@ -7,8 +7,6 @@ namespace Magento\Backend\Model\Session; use Magento\Customer\Api\CustomerRepositoryInterface; use Magento\Customer\Api\GroupManagementInterface; -use Magento\Framework\App\ObjectManager; -use Magento\Quote\Api\CartManagementInterface; /** * Adminhtml quote session @@ -81,11 +79,6 @@ class Quote extends \Magento\Framework\Session\SessionManager */ protected $quoteFactory; - /** - * @var \Magento\Quote\Api\CartManagementInterface; - */ - private $cartManagement; - /** * @param \Magento\Framework\App\Request\Http $request * @param \Magento\Framework\Session\SidResolverInterface $sidResolver diff --git a/app/code/Magento/Backend/Model/Url.php b/app/code/Magento/Backend/Model/Url.php index c1aa03a457cac21032566c9b0540f7b5972ab563..f09c9c04ee6bb942eb774b60837dbbe598a1426b 100644 --- a/app/code/Magento/Backend/Model/Url.php +++ b/app/code/Magento/Backend/Model/Url.php @@ -5,6 +5,8 @@ */ namespace Magento\Backend\Model; +use Magento\Framework\Url\HostChecker; +use Magento\Framework\App\ObjectManager; /** * Class \Magento\Backend\Model\UrlInterface @@ -77,6 +79,8 @@ class Url extends \Magento\Framework\Url implements \Magento\Backend\Model\UrlIn protected $_scope; /** + * Constructor + * * @param \Magento\Framework\App\Route\ConfigInterface $routeConfig * @param \Magento\Framework\App\RequestInterface $request * @param \Magento\Framework\Url\SecurityInfoInterface $urlSecurityInfo @@ -96,7 +100,7 @@ class Url extends \Magento\Framework\Url implements \Magento\Backend\Model\UrlIn * @param \Magento\Store\Model\StoreFactory $storeFactory * @param \Magento\Framework\Data\Form\FormKey $formKey * @param array $data - * + * @param HostChecker|null $hostChecker * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -118,9 +122,11 @@ class Url extends \Magento\Framework\Url implements \Magento\Backend\Model\UrlIn \Magento\Framework\Encryption\EncryptorInterface $encryptor, \Magento\Store\Model\StoreFactory $storeFactory, \Magento\Framework\Data\Form\FormKey $formKey, - array $data = [] + array $data = [], + HostChecker $hostChecker = null ) { $this->_encryptor = $encryptor; + $hostChecker = $hostChecker ?: ObjectManager::getInstance()->get(HostChecker::class); parent::__construct( $routeConfig, $request, @@ -133,7 +139,8 @@ class Url extends \Magento\Framework\Url implements \Magento\Backend\Model\UrlIn $scopeConfig, $routeParamsPreprocessor, $scopeType, - $data + $data, + $hostChecker ); $this->_backendHelper = $backendHelper; $this->_menuConfig = $menuConfig; diff --git a/app/code/Magento/Backend/Test/Unit/App/ConfigTest.php b/app/code/Magento/Backend/Test/Unit/App/ConfigTest.php index b2ece9e3ce2e5296e6b62176193778f13b221b82..7bff61aede734af0911499f4d581b3addff1799c 100644 --- a/app/code/Magento/Backend/Test/Unit/App/ConfigTest.php +++ b/app/code/Magento/Backend/Test/Unit/App/ConfigTest.php @@ -7,12 +7,18 @@ namespace Magento\Backend\Test\Unit\App; use Magento\Backend\App\Config; +/** + * Test reading by path and reading flag from config + * + * @see \Magento\Backend\App\Config + * @package Magento\Backend\Test\Unit\App + */ class ConfigTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Framework\App\Config\ScopePool|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\Config|\PHPUnit_Framework_MockObject_MockObject */ - protected $sectionPool; + protected $appConfig; /** * @var Config @@ -21,102 +27,64 @@ class ConfigTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->sectionPool = $this->getMock( - \Magento\Framework\App\Config\ScopePool::class, - ['getScope', 'clean'], + $this->appConfig = $this->getMock( + \Magento\Framework\App\Config::class, + ['get'], [], '', false ); - $this->model = new \Magento\Backend\App\Config($this->sectionPool); + $this->model = new \Magento\Backend\App\Config($this->appConfig); } public function testGetValue() { $expectedValue = 'some value'; $path = 'some path'; - $configData = $this->getConfigDataMock('getValue'); - $configData->expects( - $this->once() - )->method( - 'getValue' - )->with( - $this->equalTo($path) - )->will( - $this->returnValue($expectedValue) - ); - $this->sectionPool->expects( + $this->appConfig->expects( $this->once() )->method( - 'getScope' + 'get' )->with( - $this->equalTo('default'), + $this->equalTo('system'), + $this->equalTo('default/' . $path), $this->isNull() )->will( - $this->returnValue($configData) + $this->returnValue($expectedValue) ); $this->assertEquals($expectedValue, $this->model->getValue($path)); } - public function testSetValue() - { - $value = 'some value'; - $path = 'some path'; - $configData = $this->getConfigDataMock('setValue'); - $configData->expects($this->once())->method('setValue')->with($this->equalTo($path), $this->equalTo($value)); - $this->sectionPool->expects( - $this->once() - )->method( - 'getScope' - )->with( - $this->equalTo('default'), - $this->isNull() - )->will( - $this->returnValue($configData) - ); - $this->model->setValue($path, $value); - } - /** + * @param string $configPath * @param mixed $configValue * @param bool $expectedResult * @dataProvider isSetFlagDataProvider */ - public function testIsSetFlag($configValue, $expectedResult) + public function testIsSetFlag($configPath, $configValue, $expectedResult) { - $path = 'some path'; - $configData = $this->getConfigDataMock('getValue'); - $configData->expects( - $this->once() + $this->appConfig->expects( + $this->any() )->method( - 'getValue' + 'get' )->with( - $this->equalTo($path) + $this->equalTo('system'), + $this->equalTo('default/' . $configPath) )->will( $this->returnValue($configValue) ); - $this->sectionPool->expects( - $this->once() - )->method( - 'getScope' - )->with( - $this->equalTo('default'), - $this->isNull() - )->will( - $this->returnValue($configData) - ); - $this->assertEquals($expectedResult, $this->model->isSetFlag($path)); + $this->assertEquals($expectedResult, $this->model->isSetFlag($configPath)); } public function isSetFlagDataProvider() { return [ - [0, false], - [true, true], - ['0', false], - ['', false], - ['some string', true], - [1, true] + ['a', 0, false], + ['b', true, true], + ['c', '0', false], + ['d', '', false], + ['e', 'some string', true], + ['f', 1, true] ]; } diff --git a/app/code/Magento/Backend/Test/Unit/Model/Session/QuoteTest.php b/app/code/Magento/Backend/Test/Unit/Model/Session/QuoteTest.php index 5db3c2e41c04adf9bf5f2105df266167c5a77364..99d7fdfab21dedc37a5bc1b144b36f2acb073fbb 100644 --- a/app/code/Magento/Backend/Test/Unit/Model/Session/QuoteTest.php +++ b/app/code/Magento/Backend/Test/Unit/Model/Session/QuoteTest.php @@ -12,6 +12,11 @@ namespace Magento\Backend\Test\Unit\Model\Session; */ class QuoteTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ @@ -92,11 +97,6 @@ class QuoteTest extends \PHPUnit_Framework_TestCase */ protected $quoteFactoryMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $cartManagementMock; - /** * Set up * @@ -105,6 +105,7 @@ class QuoteTest extends \PHPUnit_Framework_TestCase */ protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->customerRepositoryMock = $this->getMockForAbstractClass( \Magento\Customer\Api\CustomerRepositoryInterface::class, [], @@ -197,13 +198,6 @@ class QuoteTest extends \PHPUnit_Framework_TestCase ); $this->quoteFactoryMock = $this->getMock(\Magento\Quote\Model\QuoteFactory::class, ['create'], [], '', false); - $this->cartManagementMock = $this->getMock( - \Magento\Quote\Api\CartManagementInterface::class, - [], - [], - '', - false - ); $this->quote = $this->getMock( \Magento\Backend\Model\Session\Quote::class, @@ -226,10 +220,6 @@ class QuoteTest extends \PHPUnit_Framework_TestCase 'quoteFactory' => $this->quoteFactoryMock ] ); - - $this->prepareObjectManager([ - [\Magento\Quote\Api\CartManagementInterface::class, $this->cartManagementMock] - ]); } /** @@ -416,19 +406,4 @@ class QuoteTest extends \PHPUnit_Framework_TestCase 'customer ids same' => [66, 66, 'never'], ]; } - - /** - * @param array $map - * @deprecated - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any())->method('get')->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Backend/Test/Unit/Model/UrlTest.php b/app/code/Magento/Backend/Test/Unit/Model/UrlTest.php index 2bc3d86e74d697cd64be58742ab2a5e3204e8b01..4eda145156c6dbf881eadf3d88981ffb9318d32c 100644 --- a/app/code/Magento/Backend/Test/Unit/Model/UrlTest.php +++ b/app/code/Magento/Backend/Test/Unit/Model/UrlTest.php @@ -3,16 +3,13 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - -// @codingStandardsIgnoreFile - -/** - * Test class for \Magento\Backend\Model\Url - */ namespace Magento\Backend\Test\Unit\Model; +use Magento\Framework\Url\HostChecker; + /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @codingStandardsIgnoreFile */ class UrlTest extends \PHPUnit_Framework_TestCase { @@ -21,10 +18,12 @@ class UrlTest extends \PHPUnit_Framework_TestCase */ protected $_model; + /** + * @var string + */ protected $_areaFrontName = 'backendArea'; /** - * Mock menu model * @var \PHPUnit_Framework_MockObject_MockObject */ protected $_menuMock; @@ -62,7 +61,7 @@ class UrlTest extends \PHPUnit_Framework_TestCase /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_paramsResolverMock; + protected $routeParamsResolverFactoryMock; /** * @var \Magento\Framework\Encryption\EncryptorInterface @@ -75,6 +74,7 @@ class UrlTest extends \PHPUnit_Framework_TestCase */ protected function setUp() { + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->_menuMock = $this->getMock( \Magento\Backend\Model\Menu::class, [], @@ -141,25 +141,21 @@ class UrlTest extends \PHPUnit_Framework_TestCase false, false ); - $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->_encryptor = $this->getMock(\Magento\Framework\Encryption\Encryptor::class, null, [], '', false); - $this->_paramsResolverMock = $this->getMock( + $routeParamsResolver = $this->getMock(\Magento\Framework\Url\RouteParamsResolver::class, [], [], '', false); + $this->routeParamsResolverFactoryMock = $this->getMock( \Magento\Framework\Url\RouteParamsResolverFactory::class, [], [], '', false ); - $this->_paramsResolverMock->expects( - $this->any() - )->method( - 'create' - )->will( - $this->returnValue( - $this->getMock(\Magento\Framework\Url\RouteParamsResolver::class, [], [], '', false) - ) - ); - $this->_model = $helper->getObject( + $this->routeParamsResolverFactoryMock->expects($this->any()) + ->method('create') + ->willReturn($routeParamsResolver); + /** @var HostChecker|\PHPUnit_Framework_MockObject_MockObject $hostCheckerMock */ + $hostCheckerMock = $this->getMock(HostChecker::class, [], [], '', false); + $this->_model = $objectManager->getObject( \Magento\Backend\Model\Url::class, [ 'scopeConfig' => $this->_scopeConfigMock, @@ -168,31 +164,10 @@ class UrlTest extends \PHPUnit_Framework_TestCase 'menuConfig' => $this->_menuConfigMock, 'authSession' => $this->_authSessionMock, 'encryptor' => $this->_encryptor, - 'routeParamsResolverFactory' => $this->_paramsResolverMock + 'routeParamsResolverFactory' => $this->routeParamsResolverFactoryMock, + 'hostChecker' => $hostCheckerMock ] ); - $this->_paramsResolverMock->expects( - $this->any() - )->method( - 'create' - )->will( - $this->returnValue( - $this->getMock(\Magento\Framework\Url\RouteParamsResolver::class, [], [], '', false) - ) - ); - $this->_model = $helper->getObject( - \Magento\Backend\Model\Url::class, - [ - 'scopeConfig' => $this->_scopeConfigMock, - 'backendHelper' => $helperMock, - 'formKey' => $this->_formKey, - 'menuConfig' => $this->_menuConfigMock, - 'authSession' => $this->_authSessionMock, - 'encryptor' => $this->_encryptor, - 'routeParamsResolverFactory' => $this->_paramsResolverMock - ] - ); - $this->_requestMock = $this->getMock(\Magento\Framework\App\Request\Http::class, [], [], '', false); $this->_model->setRequest($this->_requestMock); } @@ -262,7 +237,7 @@ class UrlTest extends \PHPUnit_Framework_TestCase [ 'backendHelper' => $helperMock, 'authSession' => $this->_authSessionMock, - 'routeParamsResolverFactory' => $this->_paramsResolverMock + 'routeParamsResolverFactory' => $this->routeParamsResolverFactoryMock ] ); $urlModel->getAreaFrontName(); diff --git a/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml b/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml index 3e61fec077c6e3fcfccfb62b5ecad98248e9b41d..decc26f331c8298d16b4a76d4a74d82c5808c651 100644 --- a/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml +++ b/app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml @@ -48,6 +48,7 @@ <argument name="width" xsi:type="string">180</argument> <argument name="align" xsi:type="string">left</argument> <argument name="sortable" xsi:type="string">0</argument> + <argument name="translate" xsi:type="boolean">true</argument> </arguments> </block> <block class="Magento\Backend\Block\Widget\Grid\Column" as="description"> @@ -57,6 +58,7 @@ <argument name="type" xsi:type="string">text</argument> <argument name="align" xsi:type="string">left</argument> <argument name="sortable" xsi:type="string">0</argument> + <argument name="translate" xsi:type="boolean">true</argument> </arguments> </block> <block class="Magento\Backend\Block\Widget\Grid\Column" as="tags"> diff --git a/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js b/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js index ea832acb537e0051e34f976c050c9b8bd7d289b7..14729714b4e608f8c422da8c220b9ea1ed115ffb 100644 --- a/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js +++ b/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js @@ -28,7 +28,7 @@ define([ self.$selector = $('#' + self.selector); self.$container = $('#' + self.container); self.$selector.on( - 'setVaultNotActive', + 'setVaultNotActive.' + self.getCode(), function () { self.$selector.off('submitOrder.' + self.getCode()); } diff --git a/app/code/Magento/Bundle/Model/ResourceModel/Indexer/Price.php b/app/code/Magento/Bundle/Model/ResourceModel/Indexer/Price.php index 7789f79d907f85d2402a82899af1de3f63db29de..4059f06bccded2f5dbaec98de627a0dc90407eb9 100644 --- a/app/code/Magento/Bundle/Model/ResourceModel/Indexer/Price.php +++ b/app/code/Magento/Bundle/Model/ResourceModel/Indexer/Price.php @@ -491,7 +491,7 @@ class Price extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\D null )->join( ['e' => $this->getTable('catalog_product_entity')], - "i.entity_id=e.$linkField", + "i.entity_id=e.entity_id", [] )->where( 'e.type_id=?', @@ -502,7 +502,7 @@ class Price extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\D $select = $connection->select()->from( ['tp' => $this->getTable('catalog_product_entity_tier_price')], - [$linkField] + ['e.entity_id'] )->join( ['e' => $this->getTable('catalog_product_entity')], "tp.{$linkField} = e.{$linkField}", @@ -523,11 +523,11 @@ class Price extends \Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\D )->columns( new \Zend_Db_Expr('MIN(tp.value)') )->group( - ["tp.{$linkField}", 'cg.customer_group_id', 'cw.website_id'] + ['e.entity_id', 'cg.customer_group_id', 'cw.website_id'] ); if (!empty($entityIds)) { - $select->where("tp.{$linkField} IN(?)", $entityIds); + $select->where('e.entity_id IN(?)', $entityIds); } $query = $select->insertFromSelect($this->_getTierPriceIndexTable()); diff --git a/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php b/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php index 2d0f1264b6b8a6fc6ad041b81812c942f739468c..6a99c02af9da63f9126b57c1349eb17d8df360be 100644 --- a/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php +++ b/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php @@ -9,7 +9,6 @@ namespace Magento\BundleImportExport\Model\Import\Product\Type; use \Magento\Bundle\Model\Product\Price as BundlePrice; -use \Magento\BundleImportExport\Model\Export\RowCustomizer; use \Magento\Catalog\Model\Product\Type\AbstractType; /** @@ -55,20 +54,6 @@ class Bundle extends \Magento\CatalogImportExport\Model\Import\Product\Type\Abst */ const SELECTION_PRICE_TYPE_PERCENT = 1; - /** - * Instance of database adapter. - * - * @var \Magento\Framework\DB\Adapter\AdapterInterface - */ - protected $connection; - - /** - * Instance of application resource. - * - * @var \Magento\Framework\App\ResourceConnection - */ - protected $_resource; - /** * Array of cached options. * @@ -144,23 +129,6 @@ class Bundle extends \Magento\CatalogImportExport\Model\Import\Product\Type\Abst 'multiselect' => 'multi', ]; - /** - * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac - * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac - * @param \Magento\Framework\App\ResourceConnection $resource - * @param array $params - */ - public function __construct( - \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac, - \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac, - \Magento\Framework\App\ResourceConnection $resource, - array $params - ) { - parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params); - $this->_resource = $resource; - $this->connection = $resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION); - } - /** * Parse selections. * diff --git a/app/code/Magento/BundleImportExport/composer.json b/app/code/Magento/BundleImportExport/composer.json index 2f5e3afdbff86ded9c88161ebea832c29b37f229..ad849b6f31182ab49fb3acaa64fd7ae1c92e40c5 100644 --- a/app/code/Magento/BundleImportExport/composer.json +++ b/app/code/Magento/BundleImportExport/composer.json @@ -7,7 +7,6 @@ "magento/module-import-export": "100.2.*", "magento/module-catalog-import-export": "100.2.*", "magento/module-bundle": "100.2.*", - "magento/module-eav": "100.2.*", "magento/framework": "100.2.*" }, "type": "magento2-module", diff --git a/app/code/Magento/Catalog/Model/Attribute/Config/Data.php b/app/code/Magento/Catalog/Model/Attribute/Config/Data.php index 032970a7461b60f8c3c2f900024c587fb1d22f63..1fac4e58c75c97fcc404cd0ca345e3ed1085f501 100644 --- a/app/code/Magento/Catalog/Model/Attribute/Config/Data.php +++ b/app/code/Magento/Catalog/Model/Attribute/Config/Data.php @@ -1,22 +1,31 @@ <?php /** - * Catalog attributes configuration data container. Provides catalog attributes configuration data. - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Catalog\Model\Attribute\Config; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides catalog attributes configuration + */ class Data extends \Magento\Framework\Config\Data { /** + * Constructor + * * @param \Magento\Catalog\Model\Attribute\Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Catalog\Model\Attribute\Config\Reader $reader, - \Magento\Framework\Config\CacheInterface $cache + \Magento\Framework\Config\CacheInterface $cache, + $cacheId = 'catalog_attributes', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, 'catalog_attributes'); + parent::__construct($reader, $cache, $cacheId, $serializer); } } diff --git a/app/code/Magento/Catalog/Model/Config.php b/app/code/Magento/Catalog/Model/Config.php index dec29a925cc4d491ddbaab53f249ce354c7df56c..70d11f2e282b4a4268bab2c56547668badf1735a 100644 --- a/app/code/Magento/Catalog/Model/Config.php +++ b/app/code/Magento/Catalog/Model/Config.php @@ -7,6 +7,7 @@ // @codingStandardsIgnoreFile namespace Magento\Catalog\Model; +use Magento\Framework\Serialize\SerializerInterface; /** * @SuppressWarnings(PHPMD.LongVariable) @@ -132,6 +133,7 @@ class Config extends \Magento\Eav\Model\Config * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $setCollectionFactory * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Eav\Model\Config $eavConfig + * @param SerializerInterface $serializer * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -147,7 +149,8 @@ class Config extends \Magento\Eav\Model\Config \Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory $groupCollectionFactory, \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $setCollectionFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, - \Magento\Eav\Model\Config $eavConfig + \Magento\Eav\Model\Config $eavConfig, + SerializerInterface $serializer = null ) { $this->_scopeConfig = $scopeConfig; $this->_configFactory = $configFactory; @@ -157,7 +160,14 @@ class Config extends \Magento\Eav\Model\Config $this->_storeManager = $storeManager; $this->_eavConfig = $eavConfig; - parent::__construct($cache, $entityTypeFactory, $entityTypeCollectionFactory, $cacheState, $universalFactory); + parent::__construct( + $cache, + $entityTypeFactory, + $entityTypeCollectionFactory, + $cacheState, + $universalFactory, + $serializer + ); } /** diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Countryofmanufacture.php b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Countryofmanufacture.php index 7b45d162b5e98bf06251a8a6e55794b8626b25ef..8bcf01ba3db3867bb0babe3c5119097f1c860d5d 100644 --- a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Countryofmanufacture.php +++ b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Countryofmanufacture.php @@ -35,6 +35,11 @@ class Countryofmanufacture extends AbstractSource implements OptionSourceInterfa */ protected $_countryFactory; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * Construct * @@ -61,15 +66,30 @@ class Countryofmanufacture extends AbstractSource implements OptionSourceInterfa { $cacheKey = 'COUNTRYOFMANUFACTURE_SELECT_STORE_' . $this->_storeManager->getStore()->getCode(); if ($cache = $this->_configCacheType->load($cacheKey)) { - $options = unserialize($cache); + $options = $this->getSerializer()->unserialize($cache); } else { /** @var \Magento\Directory\Model\Country $country */ $country = $this->_countryFactory->create(); /** @var \Magento\Directory\Model\ResourceModel\Country\Collection $collection */ $collection = $country->getResourceCollection(); $options = $collection->load()->toOptionArray(); - $this->_configCacheType->save(serialize($options), $cacheKey); + $this->_configCacheType->save($this->getSerializer()->serialize($options), $cacheKey); } return $options; } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Serialize\SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/app/code/Magento/Catalog/Model/ProductOptions/Config.php b/app/code/Magento/Catalog/Model/ProductOptions/Config.php index bd55304e03beface2791526e00d2731ca6285ce9..fa828832bf4a716eddf1eeabdea9befcf94b6ab3 100644 --- a/app/code/Magento/Catalog/Model/ProductOptions/Config.php +++ b/app/code/Magento/Catalog/Model/ProductOptions/Config.php @@ -5,20 +5,29 @@ */ namespace Magento\Catalog\Model\ProductOptions; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides product options configuration + */ class Config extends \Magento\Framework\Config\Data implements \Magento\Catalog\Model\ProductOptions\ConfigInterface { /** + * Constructor + * * @param \Magento\Catalog\Model\ProductOptions\Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Catalog\Model\ProductOptions\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'product_options_config' + $cacheId = 'product_options_config', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } /** diff --git a/app/code/Magento/Catalog/Model/ProductTypes/Config.php b/app/code/Magento/Catalog/Model/ProductTypes/Config.php index a80692cfaf945ced5b51fc9118b4a82b597dd9e3..f691e08a34b576e8416e3b07e60cd0d0243274da 100644 --- a/app/code/Magento/Catalog/Model/ProductTypes/Config.php +++ b/app/code/Magento/Catalog/Model/ProductTypes/Config.php @@ -5,19 +5,28 @@ */ namespace Magento\Catalog\Model\ProductTypes; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides product types configuration + */ class Config extends \Magento\Framework\Config\Data implements \Magento\Catalog\Model\ProductTypes\ConfigInterface { /** - * @param \Magento\Catalog\Model\ProductTypes\Config\Reader $reader + * Constructor + * + * @param Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Catalog\Model\ProductTypes\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'product_types_config' + $cacheId = 'product_types_config', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } /** diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php index c24460981afbf8d6c6cccb79255031d8320b726f..1cf18fc998ef973c0e3735d72cf347430710beda 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php @@ -17,6 +17,7 @@ use Magento\Framework\App\ObjectManager; use Magento\Framework\EntityManager\MetadataPool; use Magento\Store\Model\Store; use Magento\Catalog\Model\Product\Gallery\ReadHandler as GalleryReadHandler; +use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; /** * Product collection @@ -261,6 +262,8 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac private $metadataPool; /** + * Collection constructor + * * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy @@ -280,7 +283,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac * @param \Magento\Customer\Model\Session $customerSession * @param \Magento\Framework\Stdlib\DateTime $dateTime * @param GroupManagementInterface $groupManagement - * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection + * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection + * @param ProductLimitationFactory|null $productLimitationFactory + * @param MetadataPool|null $metadataPool * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -304,7 +309,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac \Magento\Customer\Model\Session $customerSession, \Magento\Framework\Stdlib\DateTime $dateTime, GroupManagementInterface $groupManagement, - \Magento\Framework\DB\Adapter\AdapterInterface $connection = null + \Magento\Framework\DB\Adapter\AdapterInterface $connection = null, + ProductLimitationFactory $productLimitationFactory = null, + MetadataPool $metadataPool = null ) { $this->moduleManager = $moduleManager; $this->_catalogProductFlatState = $catalogProductFlatState; @@ -316,7 +323,11 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac $this->_resourceHelper = $resourceHelper; $this->dateTime = $dateTime; $this->_groupManagement = $groupManagement; - $this->_productLimitationFilters = $this->createLimitationFilters(); + $productLimitationFactory = $productLimitationFactory ?: ObjectManager::getInstance()->get( + \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory::class + ); + $this->_productLimitationFilters = $productLimitationFactory->create(); + $this->metadataPool = $metadataPool ?: ObjectManager::getInstance()->get(MetadataPool::class); parent::__construct( $entityFactory, $logger, @@ -2181,7 +2192,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac ); $mediaGalleries = []; - $linkField = $this->getMetadataPool()->getMetadata(ProductInterface::class)->getLinkField(); + $linkField = $this->getProductEntityMetadata()->getLinkField(); $items = $this->getItems(); $select->where('entity.' . $linkField . ' IN (?)', array_map(function ($item) { @@ -2202,15 +2213,13 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac } /** - * Get MetadataPool instance - * @return MetadataPool + * Get product entity metadata + * + * @return \Magento\Framework\EntityManager\EntityMetadataInterface */ - private function getMetadataPool() + public function getProductEntityMetadata() { - if (!$this->metadataPool) { - $this->metadataPool = ObjectManager::getInstance()->get(MetadataPool::class); - } - return $this->metadataPool; + return $this->metadataPool->getMetadata(ProductInterface::class); } /** @@ -2334,13 +2343,4 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Collection\Abstrac return $this->_pricesCount; } - - /** - * @return Collection\ProductLimitation - */ - private function createLimitationFilters() - { - return \Magento\Framework\App\ObjectManager::getInstance() - ->create(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class); - } } diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php index 239f94e1286b834ab218b1e71530342fd5810a73..116f454cd5e750a43a93a73139521b5aa15a50bc 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Link/Product/Collection.php @@ -5,11 +5,6 @@ */ namespace Magento\Catalog\Model\ResourceModel\Product\Link\Product; -use Magento\Catalog\Api\Data\ProductInterface; -use Magento\Customer\Api\GroupManagementInterface; -use Magento\Framework\App\ObjectManager; -use Magento\Framework\EntityManager\MetadataPool; - /** * Catalog product linked products collection * @@ -53,80 +48,6 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection */ protected $_hasLinkFilter = false; - /** - * @var MetadataPool - */ - private $metadataPool; - - /** - * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory - * @param \Psr\Log\LoggerInterface $logger - * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy - * @param \Magento\Framework\Event\ManagerInterface $eventManager - * @param \Magento\Eav\Model\Config $eavConfig - * @param \Magento\Framework\App\ResourceConnection $resource - * @param \Magento\Eav\Model\EntityFactory $eavEntityFactory - * @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper - * @param \Magento\Framework\Validator\UniversalFactory $universalFactory - * @param \Magento\Store\Model\StoreManagerInterface $storeManager - * @param \Magento\Framework\Module\Manager $moduleManager - * @param \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState - * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig - * @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory - * @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrl - * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate - * @param \Magento\Customer\Model\Session $customerSession - * @param \Magento\Framework\Stdlib\DateTime $dateTime - * @param GroupManagementInterface $groupManagement - * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection - * @SuppressWarnings(PHPMD.ExcessiveParameterList) - */ - public function __construct( - \Magento\Framework\Data\Collection\EntityFactory $entityFactory, - \Psr\Log\LoggerInterface $logger, - \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy, - \Magento\Framework\Event\ManagerInterface $eventManager, - \Magento\Eav\Model\Config $eavConfig, - \Magento\Framework\App\ResourceConnection $resource, - \Magento\Eav\Model\EntityFactory $eavEntityFactory, - \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper, - \Magento\Framework\Validator\UniversalFactory $universalFactory, - \Magento\Store\Model\StoreManagerInterface $storeManager, - \Magento\Framework\Module\Manager $moduleManager, - \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState, - \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, - \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory, - \Magento\Catalog\Model\ResourceModel\Url $catalogUrl, - \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, - \Magento\Customer\Model\Session $customerSession, - \Magento\Framework\Stdlib\DateTime $dateTime, - GroupManagementInterface $groupManagement, - \Magento\Framework\DB\Adapter\AdapterInterface $connection = null - ) { - parent::__construct( - $entityFactory, - $logger, - $fetchStrategy, - $eventManager, - $eavConfig, - $resource, - $eavEntityFactory, - $resourceHelper, - $universalFactory, - $storeManager, - $moduleManager, - $catalogProductFlatState, - $scopeConfig, - $productOptionFactory, - $catalogUrl, - $localeDate, - $customerSession, - $dateTime, - $groupManagement, - $connection - ); - } - /** * Declare link model and initialize type attributes join * @@ -219,7 +140,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection if (!is_array($products)) { $products = [$products]; } - $identifierField = $this->getMetadataPool()->getMetadata(ProductInterface::class)->getIdentifierField(); + $identifierField = $this->getProductEntityMetadata()->getIdentifierField(); $this->getSelect()->where("product_entity_table.$identifierField IN (?)", $products); $this->_hasLinkFilter = true; } @@ -279,7 +200,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection $connection->quoteInto('links.link_type_id = ?', $this->_linkTypeId), ]; $joinType = 'join'; - $linkField = $this->getMetadataPool()->getMetadata(ProductInterface::class)->getLinkField(); + $linkField = $this->getProductEntityMetadata()->getLinkField(); if ($this->getProduct() && $this->getProduct()->getId()) { $linkFieldId = $this->getProduct()->getData( $linkField @@ -422,19 +343,6 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection return $this; } - /** - * Get MetadataPool instance - * @return MetadataPool - * @deprecated - */ - private function getMetadataPool() - { - if (!$this->metadataPool) { - $this->metadataPool = ObjectManager::getInstance()->get(MetadataPool::class); - } - return $this->metadataPool; - } - /** * Join Product To Links * @return void @@ -442,11 +350,15 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection private function joinProductsToLinks() { if ($this->_hasLinkFilter) { - $metaDataPool = $this->getMetadataPool()->getMetadata(ProductInterface::class); + $metaDataPool = $this->getProductEntityMetadata(); $linkField = $metaDataPool->getLinkField(); $entityTable = $metaDataPool->getEntityTable(); $this->getSelect() - ->join(['product_entity_table' => $entityTable], "links.product_id = product_entity_table.$linkField", []); + ->join( + ['product_entity_table' => $entityTable], + "links.product_id = product_entity_table.$linkField", + [] + ); } } } diff --git a/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php b/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php index 2d50ead9d56d956a22e36305967b527c8be3a288..68280d5a1d5975714d2d91fd2b94eab08a82dfc6 100644 --- a/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php +++ b/app/code/Magento/Catalog/Model/ResourceModel/Product/Option/Collection.php @@ -7,6 +7,7 @@ namespace Magento\Catalog\Model\ResourceModel\Product\Option; use Magento\Catalog\Api\Data\ProductInterface; use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface; +use Magento\Framework\EntityManager\MetadataPool; /** * Catalog product options collection @@ -49,6 +50,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource + * @param MetadataPool $metadataPool * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -59,10 +61,13 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab \Magento\Catalog\Model\ResourceModel\Product\Option\Value\CollectionFactory $optionValueCollectionFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\DB\Adapter\AdapterInterface $connection = null, - \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null + \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null, + MetadataPool $metadataPool = null ) { $this->_optionValueCollectionFactory = $optionValueCollectionFactory; $this->_storeManager = $storeManager; + $this->metadataPool = $metadataPool ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\EntityManager\MetadataPool::class); parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource); } @@ -248,7 +253,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab ['cpe' => $this->getTable('catalog_product_entity')], sprintf( 'cpe.%s = main_table.product_id', - $this->getMetadataPool()->getMetadata(ProductInterface::class)->getLinkField() + $this->metadataPool->getMetadata(ProductInterface::class)->getLinkField() ), [] ); @@ -318,18 +323,6 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab return $this->_reset(); } - /** - * @return \Magento\Framework\EntityManager\MetadataPool - */ - private function getMetadataPool() - { - if (null === $this->metadataPool) { - $this->metadataPool = \Magento\Framework\App\ObjectManager::getInstance() - ->get(\Magento\Framework\EntityManager\MetadataPool::class); - } - return $this->metadataPool; - } - /** * @return JoinProcessorInterface */ diff --git a/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php b/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php index c1f37eca1c55c7b81cf4b14a034738c5211b7085..e441d703dcd9c52111541b14db1711706737b01f 100644 --- a/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php +++ b/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Url/Rewrite/Suffix.php @@ -41,9 +41,9 @@ class Suffix extends \Magento\Framework\App\Config\Value protected $resource; /** - * @var \Magento\Framework\App\Config\ScopePool + * @var \Magento\Framework\App\Config */ - private $scopePool; + private $appConfig; /** * @param \Magento\Framework\Model\Context $context @@ -83,17 +83,17 @@ class Suffix extends \Magento\Framework\App\Config\Value /** * Get instance of ScopePool * - * @return \Magento\Framework\App\Config\ScopePool + * @return \Magento\Framework\App\Config * @deprecated */ - private function getScopePool() + private function getAppConfig() { - if ($this->scopePool === null) { - $this->scopePool = \Magento\Framework\App\ObjectManager::getInstance()->get( - \Magento\Framework\App\Config\ScopePool::class + if ($this->appConfig === null) { + $this->appConfig = \Magento\Framework\App\ObjectManager::getInstance()->get( + \Magento\Framework\App\Config::class ); } - return $this->scopePool; + return $this->appConfig; } /** @@ -177,7 +177,7 @@ class Suffix extends \Magento\Framework\App\Config\Value if ($this->getValue() !== null) { $suffix = $this->getValue(); } else { - $this->getScopePool()->clean(); + $this->getAppConfig()->clean(); $suffix = $this->_config->getValue($this->getPath()); } foreach ($entities as $urlRewrite) { diff --git a/app/code/Magento/Catalog/Model/Template/Filter.php b/app/code/Magento/Catalog/Model/Template/Filter.php index cbabe53c3bca175b0a22f5aefba77fc0e1db00f6..3d9695c183fe3d63ba69dfd831971fced7da8980 100644 --- a/app/code/Magento/Catalog/Model/Template/Filter.php +++ b/app/code/Magento/Catalog/Model/Template/Filter.php @@ -14,6 +14,11 @@ */ namespace Magento\Catalog\Model\Template; +/** + * Work with catalog(store, website) urls + * + * @package Magento\Catalog\Model\Template + */ class Filter extends \Magento\Framework\Filter\Template { /** diff --git a/app/code/Magento/Catalog/Plugin/Model/ResourceModel/Config.php b/app/code/Magento/Catalog/Plugin/Model/ResourceModel/Config.php index 699feef76c67e281d237a177a4def197c449e750..69c693f4fd01abcb39577b49cffb4ceaab8bf08f 100644 --- a/app/code/Magento/Catalog/Plugin/Model/ResourceModel/Config.php +++ b/app/code/Magento/Catalog/Plugin/Model/ResourceModel/Config.php @@ -5,6 +5,9 @@ */ namespace Magento\Catalog\Plugin\Model\ResourceModel; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; + class Config { /**#@+ @@ -20,16 +23,24 @@ class Config /** @var bool|null */ protected $isCacheEnabled = null; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\App\CacheInterface $cache * @param \Magento\Framework\App\Cache\StateInterface $cacheState + * @param SerializerInterface $serializer */ public function __construct( \Magento\Framework\App\CacheInterface $cache, - \Magento\Framework\App\Cache\StateInterface $cacheState + \Magento\Framework\App\Cache\StateInterface $cacheState, + SerializerInterface $serializer = null ) { $this->cache = $cache; $this->isCacheEnabled = $cacheState->isEnabled(\Magento\Eav\Model\Cache\Type::TYPE_IDENTIFIER); + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); } /** @@ -43,12 +54,12 @@ class Config ) { $cacheId = self::PRODUCT_LISTING_ATTRIBUTES_CACHE_ID . $config->getEntityTypeId() . '_' . $config->getStoreId(); if ($this->isCacheEnabled && ($attributes = $this->cache->load($cacheId))) { - return unserialize($attributes); + return $this->serializer->unserialize($attributes); } $attributes = $proceed(); if ($this->isCacheEnabled) { $this->cache->save( - serialize($attributes), + $this->serializer->serialize($attributes), $cacheId, [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, @@ -71,12 +82,12 @@ class Config $cacheId = self::PRODUCT_LISTING_SORT_BY_ATTRIBUTES_CACHE_ID . $config->getEntityTypeId() . '_' . $config->getStoreId(); if ($this->isCacheEnabled && ($attributes = $this->cache->load($cacheId))) { - return unserialize($attributes); + return $this->serializer->unserialize($attributes); } $attributes = $proceed(); if ($this->isCacheEnabled) { $this->cache->save( - serialize($attributes), + $this->serializer->serialize($attributes), $cacheId, [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Source/CountryofmanufactureTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Source/CountryofmanufactureTest.php index 2888a0a84f23069b34b1cb7045adad75ca921163..9ae3f94924855cbda533691292af8d110e7e07da 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Source/CountryofmanufactureTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Attribute/Source/CountryofmanufactureTest.php @@ -5,6 +5,8 @@ */ namespace Magento\Catalog\Test\Unit\Model\Product\Attribute\Source; +use Magento\Framework\Serialize\SerializerInterface; + class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase { /** @@ -27,12 +29,34 @@ class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase */ protected $objectManagerHelper; + /** @var \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture */ + private $countryOfManufacture; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + protected function setUp() { $this->storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class); $this->storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false); $this->cacheConfig = $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false); $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->countryOfManufacture = $this->objectManagerHelper->getObject( + \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture::class, + [ + 'storeManager' => $this->storeManagerMock, + 'configCacheType' => $this->cacheConfig, + ] + ); + + $this->serializerMock = $this->getMock(SerializerInterface::class, [], [], '', false); + $this->objectManagerHelper->setBackwardCompatibleProperty( + $this->countryOfManufacture, + 'serializer', + $this->serializerMock + ); } /** @@ -51,15 +75,10 @@ class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase ->method('load') ->with($this->equalTo('COUNTRYOFMANUFACTURE_SELECT_STORE_store_code')) ->will($this->returnValue($cachedDataSrl)); - - $countryOfManufacture = $this->objectManagerHelper->getObject( - \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture::class, - [ - 'storeManager' => $this->storeManagerMock, - 'configCacheType' => $this->cacheConfig, - ] - ); - $this->assertEquals($cachedDataUnsrl, $countryOfManufacture->getAllOptions()); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->willReturn($cachedDataUnsrl); + $this->assertEquals($cachedDataUnsrl, $this->countryOfManufacture->getAllOptions()); } /** @@ -71,7 +90,7 @@ class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase { return [ - ['cachedDataSrl' => 'a:1:{s:3:"key";s:4:"data";}', 'cachedDataUnsrl' => ['key' => 'data']] + ['cachedDataSrl' => json_encode(['key' => 'data']), 'cachedDataUnsrl' => ['key' => 'data']] ]; } } diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductTypes/ConfigTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductTypes/ConfigTest.php index af0c1625f9cb64ea69d807a9e36184288b1b1c39..852eb11c5cfb9f16946781d2ef12c2a6821659a1 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ProductTypes/ConfigTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductTypes/ConfigTest.php @@ -8,22 +8,33 @@ namespace Magento\Catalog\Test\Unit\Model\ProductTypes; class ConfigTest extends \PHPUnit_Framework_TestCase { /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ - protected $readerMock; + private $objectManager; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Catalog\Model\ProductTypes\Config\Reader|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheMock; + private $readerMock; + + /** + * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $cacheMock; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; /** * @var \Magento\Catalog\Model\ProductTypes\Config */ - protected $model; + private $config; protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->readerMock = $this->getMock( \Magento\Catalog\Model\ProductTypes\Config\Reader::class, [], @@ -32,19 +43,35 @@ class ConfigTest extends \PHPUnit_Framework_TestCase false ); $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } /** - * @dataProvider getTypeDataProvider - * * @param array $value * @param mixed $expected + * @dataProvider getTypeDataProvider */ public function testGetType($value, $expected) { - $this->cacheMock->expects($this->any())->method('load')->will($this->returnValue(serialize($value))); - $this->model = new \Magento\Catalog\Model\ProductTypes\Config($this->readerMock, $this->cacheMock, 'cache_id'); - $this->assertEquals($expected, $this->model->getType('global')); + $this->cacheMock->expects($this->any()) + ->method('load') + ->willReturn('serializedData'); + + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with('serializedData') + ->willReturn($value); + + $this->config = $this->objectManager->getObject( + \Magento\Catalog\Model\ProductTypes\Config::class, + [ + 'reader' => $this->readerMock, + 'cache' => $this->cacheMock, + 'cacheId' => 'cache_id', + 'serializer' => $this->serializerMock, + ] + ); + $this->assertEquals($expected, $this->config->getType('global')); } public function getTypeDataProvider() @@ -58,22 +85,43 @@ class ConfigTest extends \PHPUnit_Framework_TestCase public function testGetAll() { $expected = ['Expected Data']; - $this->cacheMock->expects( - $this->once() - )->method( - 'load' - )->will( - $this->returnValue(serialize(['types' => $expected])) + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn(json_encode('"types":["Expected Data"]]')); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->willReturn(['types' => $expected]); + + $this->config = $this->objectManager->getObject( + \Magento\Catalog\Model\ProductTypes\Config::class, + [ + 'reader' => $this->readerMock, + 'cache' => $this->cacheMock, + 'cacheId' => 'cache_id', + 'serializer' => $this->serializerMock, + ] ); - $this->model = new \Magento\Catalog\Model\ProductTypes\Config($this->readerMock, $this->cacheMock, 'cache_id'); - $this->assertEquals($expected, $this->model->getAll()); + $this->assertEquals($expected, $this->config->getAll()); } public function testIsProductSet() { - $this->cacheMock->expects($this->once())->method('load')->will($this->returnValue(serialize([]))); - $this->model = new \Magento\Catalog\Model\ProductTypes\Config($this->readerMock, $this->cacheMock, 'cache_id'); + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn(''); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->willReturn([]); - $this->assertEquals(false, $this->model->isProductSet('typeId')); + $this->config = $this->objectManager->getObject( + \Magento\Catalog\Model\ProductTypes\Config::class, + [ + 'reader' => $this->readerMock, + 'cache' => $this->cacheMock, + 'cacheId' => 'cache_id', + 'serializer' => $this->serializerMock, + ] + ); + $this->assertEquals(false, $this->config->isProductSet('typeId')); } } diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/CollectionTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/CollectionTest.php index b97b7d2f9842355af1195b7b0ce7ed1d4aa7e4e8..f19b2c15c8ab20142ad10b6d3ca23282633062db 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/CollectionTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/CollectionTest.php @@ -3,18 +3,20 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Product; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; /** - * Class CollectionTest - * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class CollectionTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \PHPUnit_Framework_MockObject_MockObject */ @@ -55,6 +57,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase */ protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $entityFactory = $this->getMock(\Magento\Framework\Data\Collection\EntityFactory::class, [], [], '', false); $logger = $this->getMockBuilder(\Psr\Log\LoggerInterface::class) ->disableOriginalConstructor() @@ -145,27 +148,14 @@ class CollectionTest extends \PHPUnit_Framework_TestCase $this->entityMock->expects($this->once())->method('getDefaultAttributes')->willReturn([]); $this->entityMock->expects($this->any())->method('getTable')->willReturnArgument(0); $this->connectionMock->expects($this->atLeastOnce())->method('select')->willReturn($this->selectMock); - $helper = new ObjectManager($this); - $this->prepareObjectManager([ - [ - \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class, - $this->getMock(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class) - ], - [ - \Magento\Catalog\Model\ResourceModel\Product\Gallery::class, - $this->galleryResourceMock - ], - [ - \Magento\Framework\EntityManager\MetadataPool::class, - $this->metadataPoolMock - ], - [ - \Magento\Catalog\Model\Product\Gallery\ReadHandler::class, - $this->galleryReadHandlerMock - ] - ]); - $this->collection = $helper->getObject( + $productLimitationMock = $this->getMock( + \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class + ); + $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']); + $productLimitationFactoryMock->method('create') + ->willReturn($productLimitationMock); + $this->collection = $this->objectManager->getObject( \Magento\Catalog\Model\ResourceModel\Product\Collection::class, [ 'entityFactory' => $entityFactory, @@ -187,10 +177,22 @@ class CollectionTest extends \PHPUnit_Framework_TestCase 'customerSession' => $customerSession, 'dateTime' => $dateTime, 'groupManagement' => $groupManagement, - 'connection' => $this->connectionMock + 'connection' => $this->connectionMock, + 'productLimitationFactory' => $productLimitationFactoryMock, + 'metadataPool' => $this->metadataPoolMock, ] ); $this->collection->setConnection($this->connectionMock); + $this->objectManager->setBackwardCompatibleProperty( + $this->collection, + 'mediaGalleryResource', + $this->galleryResourceMock + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->collection, + 'productGalleryReadHandler', + $this->galleryReadHandlerMock + ); } public function testAddProductCategoriesFilter() @@ -259,20 +261,4 @@ class CollectionTest extends \PHPUnit_Framework_TestCase $this->assertSame($this->collection, $this->collection->addMediaGalleryData()); } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Link/Product/CollectionTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Link/Product/CollectionTest.php index 3c92cde30012dc1a4fdc4736f1c68c6a7b071d5b..fe244d01eea80760fcab82b28169f3dda492f9b4 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Link/Product/CollectionTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Link/Product/CollectionTest.php @@ -3,10 +3,10 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Product\Link\Product; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; +use \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -17,8 +17,8 @@ class CollectionTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Catalog\Model\ResourceModel\Product\Link\Product\Collection */ protected $collection; - /** @var ObjectManagerHelper */ - protected $objectManagerHelper; + /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ + private $objectManager; /** @var \Magento\Framework\Data\Collection\EntityFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $entityFactoryMock; @@ -76,6 +76,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->entityFactoryMock = $this->getMock( \Magento\Framework\Data\Collection\EntityFactory::class, [], @@ -133,14 +134,11 @@ class CollectionTest extends \PHPUnit_Framework_TestCase $this->timezoneInterfaceMock = $this->getMock(\Magento\Framework\Stdlib\DateTime\TimezoneInterface::class); $this->sessionMock = $this->getMock(\Magento\Customer\Model\Session::class, [], [], '', false); $this->dateTimeMock = $this->getMock(\Magento\Framework\Stdlib\DateTime::class); - $this->objectManagerHelper = new ObjectManagerHelper($this); - $this->prepareObjectManager([ - [\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class, - $this->getMock(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class) - ] - ]); + $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']); + $productLimitationFactoryMock->method('create') + ->willReturn($this->getMock(ProductLimitation::class)); - $this->collection = $this->objectManagerHelper->getObject( + $this->collection = $this->objectManager->getObject( \Magento\Catalog\Model\ResourceModel\Product\Link\Product\Collection::class, [ 'entityFactory' => $this->entityFactoryMock, @@ -160,7 +158,8 @@ class CollectionTest extends \PHPUnit_Framework_TestCase 'catalogUrl' => $this->urlMock, 'localeDate' => $this->timezoneInterfaceMock, 'customerSession' => $this->sessionMock, - 'dateTime' => $this->dateTimeMock + 'dateTime' => $this->dateTimeMock, + 'productLimitationFactory' => $productLimitationFactoryMock, ] ); } @@ -175,20 +174,4 @@ class CollectionTest extends \PHPUnit_Framework_TestCase $this->collection->setProduct($product); $this->assertEquals(33, $this->collection->getStoreId()); } - - /** - * @param $map - */ - public function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Option/CollectionTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Option/CollectionTest.php index decf8e66f6738e19b98f0a95c782ce5b0e9def34..36afda6287fb92fd922957e1edf09e569f93b434 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Option/CollectionTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ResourceModel/Product/Option/CollectionTest.php @@ -3,20 +3,22 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - -// @codingStandardsIgnoreFile - namespace Magento\Catalog\Test\Unit\Model\ResourceModel\Product\Option; use \Magento\Catalog\Model\ResourceModel\Product\Option\Collection; use \Magento\Catalog\Model\ResourceModel\Product\Option\Value; /** - * Class CollectionTest * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @codingStandardsIgnoreFile */ class CollectionTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\Framework\EntityManager\MetadataPool */ @@ -79,6 +81,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->entityFactoryMock = $this->getMock( \Magento\Framework\Data\Collection\EntityFactory::class, ['create'], [], '', false ); @@ -147,11 +150,6 @@ class CollectionTest extends \PHPUnit_Framework_TestCase $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($metadata); $this->selectMock->expects($this->exactly(2))->method('join'); - $this->prepareObjectManager([ - [\Magento\Framework\EntityManager\MetadataPool::class, $this->metadataPoolMock], - [\Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface::class, $this->joinProcessor] - ]); - $this->collection = new Collection( $this->entityFactoryMock, $this->loggerMock, @@ -160,7 +158,13 @@ class CollectionTest extends \PHPUnit_Framework_TestCase $this->optionsFactoryMock, $this->storeManagerMock, null, - $this->resourceMock + $this->resourceMock, + $this->metadataPoolMock + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->collection, + 'joinProcessor', + $this->joinProcessor ); } @@ -168,20 +172,4 @@ class CollectionTest extends \PHPUnit_Framework_TestCase { $this->collection->reset(); } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Catalog/Test/Unit/Plugin/Model/ResourceModel/ConfigTest.php b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/ResourceModel/ConfigTest.php index 01f9964f2d83e80be6d13bde407f47014971b3b8..b6f0dcf52bb1ee7169cdb7667b0db52a91127ad1 100644 --- a/app/code/Magento/Catalog/Test/Unit/Plugin/Model/ResourceModel/ConfigTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Plugin/Model/ResourceModel/ConfigTest.php @@ -6,26 +6,29 @@ namespace Magento\Catalog\Test\Unit\Plugin\Model\ResourceModel; +use Magento\Catalog\Plugin\Model\ResourceModel\Config; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class ConfigTest extends \PHPUnit_Framework_TestCase { - /** @var \Magento\Catalog\Plugin\Model\ResourceModel\Config */ - protected $config; - /** @var \Magento\Framework\App\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cache; + private $cache; /** @var \Magento\Framework\App\Cache\StateInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheState; + private $cacheState; + + /** @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $serializer; /** @var \Magento\Catalog\Model\ResourceModel\Config|\PHPUnit_Framework_MockObject_MockObject */ - protected $subject; + private $subject; protected function setUp() { $this->cache = $this->getMock(\Magento\Framework\App\CacheInterface::class); $this->cacheState = $this->getMock(\Magento\Framework\App\Cache\StateInterface::class); + $this->serializer = $this->getMock(SerializerInterface::class); $this->subject = $this->getMock(\Magento\Catalog\Model\ResourceModel\Config::class, [], [], '', false); } @@ -47,12 +50,17 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $entityTypeId = 'type'; $storeId = 'store'; $attributes = ['attributes']; + $serializedAttributes = '["attributes"]'; $this->subject->expects($this->any())->method('getEntityTypeId')->willReturn($entityTypeId); $this->subject->expects($this->any())->method('getStoreId')->willReturn($storeId); $cacheId = \Magento\Catalog\Plugin\Model\ResourceModel\Config::PRODUCT_LISTING_ATTRIBUTES_CACHE_ID . $entityTypeId . '_' . $storeId; - $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(serialize($attributes)); + $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn($serializedAttributes); + $this->serializer->expects($this->once()) + ->method('unserialize') + ->with($serializedAttributes) + ->willReturn($attributes); $this->assertEquals( $attributes, @@ -68,14 +76,21 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $entityTypeId = 'type'; $storeId = 'store'; $attributes = ['attributes']; + $serializedAttributes = '["attributes"]'; $this->subject->expects($this->any())->method('getEntityTypeId')->willReturn($entityTypeId); $this->subject->expects($this->any())->method('getStoreId')->willReturn($storeId); $cacheId = \Magento\Catalog\Plugin\Model\ResourceModel\Config::PRODUCT_LISTING_ATTRIBUTES_CACHE_ID . $entityTypeId . '_' . $storeId; $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(false); + $this->serializer->expects($this->never()) + ->method('unserialize'); + $this->serializer->expects($this->once()) + ->method('serialize') + ->with($attributes) + ->willReturn($serializedAttributes); $this->cache->expects($this->any())->method('save')->with( - serialize($attributes), + $serializedAttributes, $cacheId, [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, @@ -110,11 +125,16 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $entityTypeId = 'type'; $storeId = 'store'; $attributes = ['attributes']; + $serializedAttributes = '["attributes"]'; $this->subject->expects($this->any())->method('getEntityTypeId')->willReturn($entityTypeId); $this->subject->expects($this->any())->method('getStoreId')->willReturn($storeId); $cacheId = \Magento\Catalog\Plugin\Model\ResourceModel\Config::PRODUCT_LISTING_SORT_BY_ATTRIBUTES_CACHE_ID . $entityTypeId . '_' . $storeId; - $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(serialize($attributes)); + $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn($serializedAttributes); + $this->serializer->expects($this->once()) + ->method('unserialize') + ->with($serializedAttributes) + ->willReturn($attributes); $this->assertEquals( $attributes, @@ -130,13 +150,20 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $entityTypeId = 'type'; $storeId = 'store'; $attributes = ['attributes']; + $serializedAttributes = '["attributes"]'; $this->subject->expects($this->any())->method('getEntityTypeId')->willReturn($entityTypeId); $this->subject->expects($this->any())->method('getStoreId')->willReturn($storeId); $cacheId = \Magento\Catalog\Plugin\Model\ResourceModel\Config::PRODUCT_LISTING_SORT_BY_ATTRIBUTES_CACHE_ID . $entityTypeId . '_' . $storeId; $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(false); + $this->serializer->expects($this->never()) + ->method('unserialize'); + $this->serializer->expects($this->once()) + ->method('serialize') + ->with($attributes) + ->willReturn($serializedAttributes); $this->cache->expects($this->any())->method('save')->with( - serialize($attributes), + $serializedAttributes, $cacheId, [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, @@ -165,7 +192,8 @@ class ConfigTest extends \PHPUnit_Framework_TestCase \Magento\Catalog\Plugin\Model\ResourceModel\Config::class, [ 'cache' => $this->cache, - 'cacheState' => $this->cacheState + 'cacheState' => $this->cacheState, + 'serializer' => $this->serializer, ] ); } diff --git a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php index 0e46b5899851f477abaae8a0591c4e95e872ef3e..0ee761646616ee96f5dfff870593cd9869b221cc 100644 --- a/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php +++ b/app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php @@ -11,6 +11,7 @@ use Magento\Framework\App\ObjectManager; use Magento\Framework\App\CacheInterface; use Magento\Framework\DB\Helper as DbHelper; use Magento\Catalog\Model\Category as CategoryModel; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Framework\UrlInterface; use Magento\Framework\Stdlib\ArrayManager; @@ -62,25 +63,33 @@ class Categories extends AbstractModifier */ private $cacheManager; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param LocatorInterface $locator * @param CategoryCollectionFactory $categoryCollectionFactory * @param DbHelper $dbHelper * @param UrlInterface $urlBuilder * @param ArrayManager $arrayManager + * @param SerializerInterface $serializer */ public function __construct( LocatorInterface $locator, CategoryCollectionFactory $categoryCollectionFactory, DbHelper $dbHelper, UrlInterface $urlBuilder, - ArrayManager $arrayManager + ArrayManager $arrayManager, + SerializerInterface $serializer = null ) { $this->locator = $locator; $this->categoryCollectionFactory = $categoryCollectionFactory; $this->dbHelper = $dbHelper; $this->urlBuilder = $urlBuilder; $this->arrayManager = $arrayManager; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); } /** @@ -286,7 +295,7 @@ class Categories extends AbstractModifier { $categoryTree = $this->getCacheManager()->load(self::CATEGORY_TREE_ID . '_' . $filter); if ($categoryTree) { - return unserialize($categoryTree); + return $this->serializer->unserialize($categoryTree); } $storeId = $this->locator->getStore()->getId(); @@ -340,7 +349,7 @@ class Categories extends AbstractModifier } $this->getCacheManager()->save( - serialize($categoryById[CategoryModel::TREE_ROOT_ID]['optgroup']), + $this->serializer->serialize($categoryById[CategoryModel::TREE_ROOT_ID]['optgroup']), self::CATEGORY_TREE_ID . '_' . $filter, [ \Magento\Catalog\Model\Category::CACHE_TAG, diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php index 0d19b9fcbedc85e4df47ab745759282f4824b060..ac39cea10cbe3b1046d8c93af5613ad6ec518b6f 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php @@ -8,6 +8,7 @@ namespace Magento\CatalogImportExport\Model\Import\Product\Type; use Magento\Framework\App\ResourceConnection; use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface; use Magento\CatalogImportExport\Model\Import\Product; +use Magento\Framework\EntityManager\MetadataPool; /** * Import entity abstract product type model @@ -142,22 +143,27 @@ abstract class AbstractType private $productEntityLinkField; /** + * AbstractType constructor + * * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac - * @param \Magento\Framework\App\ResourceConnection $resource + * @param ResourceConnection $resource * @param array $params + * @param MetadataPool|null $metadataPool * @throws \Magento\Framework\Exception\LocalizedException */ public function __construct( \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac, \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac, \Magento\Framework\App\ResourceConnection $resource, - array $params + array $params, + MetadataPool $metadataPool = null ) { $this->_attrSetColFac = $attrSetColFac; $this->_prodAttrColFac = $prodAttrColFac; $this->_resource = $resource; - $this->_connection = $resource->getConnection(); + $this->connection = $resource->getConnection(); + $this->metadataPool = $metadataPool ?: $this->getMetadataPool(); if ($this->isSuitable()) { if (!isset($params[0]) || !isset($params[1]) @@ -246,8 +252,8 @@ abstract class AbstractType { // temporary storage for attributes' parameters to avoid double querying inside the loop $entityId = $this->_entityModel->getEntityTypeId(); - $entityAttributes = $this->_connection->fetchAll( - $this->_connection->select()->from( + $entityAttributes = $this->connection->fetchAll( + $this->connection->select()->from( ['attr' => $this->_resource->getTableName('eav_entity_attribute')], ['attr.attribute_id'] )->joinLeft( @@ -255,7 +261,7 @@ abstract class AbstractType 'set.attribute_set_id = attr.attribute_set_id', ['set.attribute_set_name'] )->where( - $this->_connection->quoteInto('attr.entity_type_id IN (?)', $entityId) + $this->connection->quoteInto('attr.entity_type_id IN (?)', $entityId) ) ); $absentKeys = []; @@ -563,7 +569,7 @@ abstract class AbstractType protected function getProductEntityLinkField() { if (!$this->productEntityLinkField) { - $this->productEntityLinkField = $this->getMetadataPool() + $this->productEntityLinkField = $this->metadataPool ->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class) ->getLinkField(); } diff --git a/app/code/Magento/CatalogRule/Model/Rule.php b/app/code/Magento/CatalogRule/Model/Rule.php index 0da658be4cc219597faf847785e76c87fb327590..4e8b95607de4b26a0bde1cbde918a93119ebdc4d 100644 --- a/app/code/Magento/CatalogRule/Model/Rule.php +++ b/app/code/Magento/CatalogRule/Model/Rule.php @@ -7,6 +7,8 @@ namespace Magento\CatalogRule\Model; use Magento\Catalog\Model\Product; use Magento\CatalogRule\Api\Data\RuleInterface; +use Magento\Framework\Api\AttributeValueFactory; +use Magento\Framework\Api\ExtensionAttributesFactory; use Magento\Framework\DataObject\IdentityInterface; /** @@ -137,7 +139,8 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I protected $ruleConditionConverter; /** - * Rule constructor. + * Rule constructor + * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Data\FormFactory $formFactory @@ -157,6 +160,8 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection * @param array $relatedCacheTypes * @param array $data + * @param ExtensionAttributesFactory|null $extensionFactory + * @param AttributeValueFactory|null $customAttributeFactory * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -179,7 +184,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $relatedCacheTypes = [], - array $data = [] + array $data = [], + ExtensionAttributesFactory $extensionFactory = null, + AttributeValueFactory $customAttributeFactory = null ) { $this->_productCollectionFactory = $productCollectionFactory; $this->_storeManager = $storeManager; @@ -201,7 +208,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I $localeDate, $resource, $resourceCollection, - $data + $data, + $extensionFactory, + $customAttributeFactory ); } diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php index a624b87ebbe13efa061c7e97a8590e78bd5b70fe..b3f35dbe98e0dcc042ce4272337a6ea740147d70 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php @@ -3,14 +3,9 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\CatalogRule\Test\Unit\Model; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; - /** - * Class RuleTest - * @package Magento\CatalogRule\Test\Unit\Model * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class RuleTest extends \PHPUnit_Framework_TestCase @@ -18,8 +13,8 @@ class RuleTest extends \PHPUnit_Framework_TestCase /** @var \Magento\CatalogRule\Model\Rule */ protected $rule; - /** @var ObjectManagerHelper */ - protected $objectManagerHelper; + /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ + private $objectManager; /** @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $storeManager; @@ -63,6 +58,7 @@ class RuleTest extends \PHPUnit_Framework_TestCase */ protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->storeManager = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class); $this->storeModel = $this->getMock(\Magento\Store\Model\Store::class, ['__wakeup', 'getId'], [], '', false); $this->combineFactory = $this->getMock( @@ -128,20 +124,22 @@ class RuleTest extends \PHPUnit_Framework_TestCase false ); - $this->objectManagerHelper = new ObjectManagerHelper($this); - - $this->prepareObjectManager([ - [ - \Magento\Framework\Api\ExtensionAttributesFactory::class, - $this->getMock(\Magento\Framework\Api\ExtensionAttributesFactory::class, [], [], '', false) - ], - [ - \Magento\Framework\Api\AttributeValueFactory::class, - $this->getMock(\Magento\Framework\Api\AttributeValueFactory::class, [], [], '', false) - ], - ]); + $extensionFactoryMock = $this->getMock( + \Magento\Framework\Api\ExtensionAttributesFactory::class, + [], + [], + '', + false + ); + $attributeValueFactoryMock = $this->getMock( + \Magento\Framework\Api\AttributeValueFactory::class, + [], + [], + '', + false + ); - $this->rule = $this->objectManagerHelper->getObject( + $this->rule = $this->objectManager->getObject( \Magento\CatalogRule\Model\Rule::class, [ 'storeManager' => $this->storeManager, @@ -149,6 +147,8 @@ class RuleTest extends \PHPUnit_Framework_TestCase 'ruleProductProcessor' => $this->_ruleProductProcessor, 'productCollectionFactory' => $this->_productCollectionFactory, 'resourceIterator' => $this->_resourceIterator, + 'extensionFactory' => $extensionFactoryMock, + 'customAttributeFactory' => $attributeValueFactoryMock, ] ); } @@ -375,20 +375,4 @@ class RuleTest extends \PHPUnit_Framework_TestCase $expectedResult = 'form_namerule_conditions_fieldset_100'; $this->assertEquals($expectedResult, $this->rule->getConditionsFieldSetId($formName)); } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php b/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php index a8ada4d409f61d908639f2a628dc766678f182cf..f63e06efc18d5dc4d59d991d0d94b7d915416dde 100644 --- a/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php +++ b/app/code/Magento/CatalogSearch/Model/ResourceModel/Advanced/Collection.php @@ -9,10 +9,12 @@ use Magento\Catalog\Model\Product; use Magento\Framework\Api\FilterBuilder; use Magento\Framework\Api\Search\SearchCriteriaBuilder; use Magento\Framework\Api\Search\SearchResultFactory; +use Magento\Framework\EntityManager\MetadataPool; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Search\Adapter\Mysql\TemporaryStorage; use Magento\Framework\Search\Request\EmptyRequestDataException; use Magento\Framework\Search\Request\NonExistingRequestNameException; +use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; /** * Collection Advanced @@ -54,7 +56,8 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection private $filterBuilder; /** - * Collection constructor. + * Collection constructor + * * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy @@ -77,8 +80,11 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection * @param \Magento\CatalogSearch\Model\Advanced\Request\Builder $requestBuilder * @param \Magento\Search\Model\SearchEngine $searchEngine * @param \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory - * @param \Zend_Db_Adapter_Abstract $connection - * @param SearchResultFactory $searchResultFactory + * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection + * @param SearchResultFactory|null $searchResultFactory + * @param ProductLimitationFactory|null $productLimitationFactory + * @param MetadataPool|null $metadataPool + * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -104,8 +110,10 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection \Magento\CatalogSearch\Model\Advanced\Request\Builder $requestBuilder, \Magento\Search\Model\SearchEngine $searchEngine, \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory, - $connection = null, - SearchResultFactory $searchResultFactory = null + \Magento\Framework\DB\Adapter\AdapterInterface $connection = null, + SearchResultFactory $searchResultFactory = null, + ProductLimitationFactory $productLimitationFactory = null, + MetadataPool $metadataPool = null ) { $this->requestBuilder = $requestBuilder; $this->searchEngine = $searchEngine; @@ -134,7 +142,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection $customerSession, $dateTime, $groupManagement, - $connection + $connection, + $productLimitationFactory, + $metadataPool ); } diff --git a/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php b/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php index 8a9e2b1917407d42089c1a1b5958eee0d51d8a25..bc7568a471160dbb9376e9a4482a5b0ef43ca28e 100644 --- a/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php +++ b/app/code/Magento/CatalogSearch/Model/ResourceModel/Fulltext/Collection.php @@ -7,6 +7,7 @@ namespace Magento\CatalogSearch\Model\ResourceModel\Fulltext; use Magento\CatalogSearch\Model\Search\RequestGenerator; use Magento\Framework\DB\Select; +use Magento\Framework\EntityManager\MetadataPool; use Magento\Framework\Exception\StateException; use Magento\Framework\Search\Adapter\Mysql\TemporaryStorage; use Magento\Framework\Search\Response\QueryResponse; @@ -15,6 +16,7 @@ use Magento\Framework\Search\Request\NonExistingRequestNameException; use Magento\Framework\Api\Search\SearchResultFactory; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\App\ObjectManager; +use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; /** * Fulltext Collection @@ -94,6 +96,8 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection private $filterBuilder; /** + * Collection constructor + * * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy @@ -117,9 +121,12 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection * @param \Magento\Framework\Search\Request\Builder $requestBuilder * @param \Magento\Search\Model\SearchEngine $searchEngine * @param \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory - * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection + * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection * @param string $searchRequestName - * @param SearchResultFactory $searchResultFactory + * @param SearchResultFactory|null $searchResultFactory + * @param ProductLimitationFactory|null $productLimitationFactory + * @param MetadataPool|null $metadataPool + * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -148,7 +155,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory, \Magento\Framework\DB\Adapter\AdapterInterface $connection = null, $searchRequestName = 'catalog_view_container', - SearchResultFactory $searchResultFactory = null + SearchResultFactory $searchResultFactory = null, + ProductLimitationFactory $productLimitationFactory = null, + MetadataPool $metadataPool = null ) { $this->queryFactory = $catalogSearchData; if ($searchResultFactory === null) { @@ -175,7 +184,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection $customerSession, $dateTime, $groupManagement, - $connection + $connection, + $productLimitationFactory, + $metadataPool ); $this->requestBuilder = $requestBuilder; $this->searchEngine = $searchEngine; diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Advanced/CollectionTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Advanced/CollectionTest.php index 96580c6764e9387e522a8c6d3a92d43e45869594..4b04e7d66ab569ab3d2e6219cef4e2b69268d8e0 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Advanced/CollectionTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Advanced/CollectionTest.php @@ -7,7 +7,7 @@ namespace Magento\CatalogSearch\Test\Unit\Model\ResourceModel\Advanced; use Magento\Catalog\Model\Product; use Magento\CatalogSearch\Test\Unit\Model\ResourceModel\BaseCollectionTest; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; /** * Tests Magento\CatalogSearch\Model\ResourceModel\Advanced\Collection @@ -16,6 +16,11 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHe */ class CollectionTest extends BaseCollectionTest { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\CatalogSearch\Model\ResourceModel\Advanced\Collection */ @@ -51,8 +56,7 @@ class CollectionTest extends BaseCollectionTest */ protected function setUp() { - $helper = new ObjectManagerHelper($this); - + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->eavConfig = $this->getMock(\Magento\Eav\Model\Config::class, [], [], '', false); $storeManager = $this->getStoreManager(); $universalFactory = $this->getUniversalFactory(); @@ -67,13 +71,14 @@ class CollectionTest extends BaseCollectionTest ); $this->search = $this->getMock(\Magento\Search\Api\SearchInterface::class, [], [], '', false); - $this->prepareObjectManager([ - [\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class, - $this->getMock(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class) - ], - ]); + $productLimitationMock = $this->getMock( + \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class + ); + $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']); + $productLimitationFactoryMock->method('create') + ->willReturn($productLimitationMock); - $this->advancedCollection = $helper->getObject( + $this->advancedCollection = $this->objectManager->getObject( \Magento\CatalogSearch\Model\ResourceModel\Advanced\Collection::class, [ 'eavConfig' => $this->eavConfig, @@ -83,6 +88,7 @@ class CollectionTest extends BaseCollectionTest 'filterBuilder' => $this->filterBuilder, 'temporaryStorageFactory' => $this->temporaryStorageFactory, 'search' => $this->search, + 'productLimitationFactory' => $productLimitationFactoryMock, ] ); } @@ -150,20 +156,4 @@ class CollectionTest extends BaseCollectionTest ->getMock(); return $criteriaBuilder; } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Fulltext/CollectionTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Fulltext/CollectionTest.php index 84430c56476c05463043670d024b79b3482affcb..5e56a253563592a55b80b00d26432028d9f4c5fa 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Fulltext/CollectionTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/ResourceModel/Fulltext/CollectionTest.php @@ -8,12 +8,18 @@ namespace Magento\CatalogSearch\Test\Unit\Model\ResourceModel\Fulltext; use Magento\CatalogSearch\Test\Unit\Model\ResourceModel\BaseCollectionTest; use Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory; use PHPUnit_Framework_MockObject_MockObject as MockObject; +use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class CollectionTest extends BaseCollectionTest { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\Framework\Search\Adapter\Mysql\TemporaryStorage|\PHPUnit_Framework_MockObject_MockObject */ @@ -64,22 +70,19 @@ class CollectionTest extends BaseCollectionTest */ protected function setUp() { - $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->storeManager = $this->getStoreManager(); $this->universalFactory = $this->getUniversalFactory(); $this->scopeConfig = $this->getScopeConfig(); $this->criteriaBuilder = $this->getCriteriaBuilder(); $this->filterBuilder = $this->getFilterBuilder(); - $this->prepareObjectManager( - [ - [ - \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class, - $this->getMock(\Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class) - ], - ] + $productLimitationMock = $this->getMock( + \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class ); + $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']); + $productLimitationFactoryMock->method('create') + ->willReturn($productLimitationMock); $this->temporaryStorage = $this->getMockBuilder(\Magento\Framework\Search\Adapter\Mysql\TemporaryStorage::class) ->disableOriginalConstructor() @@ -92,13 +95,14 @@ class CollectionTest extends BaseCollectionTest ->method('create') ->willReturn($this->temporaryStorage); - $this->model = $helper->getObject( + $this->model = $this->objectManager->getObject( \Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection::class, [ 'storeManager' => $this->storeManager, 'universalFactory' => $this->universalFactory, 'scopeConfig' => $this->scopeConfig, - 'temporaryStorageFactory' => $temporaryStorageFactory + 'temporaryStorageFactory' => $temporaryStorageFactory, + 'productLimitationFactory' => $productLimitationFactoryMock ] ); @@ -110,6 +114,13 @@ class CollectionTest extends BaseCollectionTest $this->model->setFilterBuilder($this->filterBuilder); } + protected function tearDown() + { + $reflectionProperty = new \ReflectionProperty(\Magento\Framework\App\ObjectManager::class, '_instance'); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue(null); + } + /** * @expectedException \Exception * @expectedExceptionCode 333 @@ -208,22 +219,6 @@ class CollectionTest extends BaseCollectionTest return $filterBuilder; } - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } - protected function createFilter() { $filter = $this->getMockBuilder(\Magento\Framework\Api\Filter::class) diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php index ea28b20f3f8f6d58211377bd9b16034d8f04a23c..01ef3e4ff8be217883ae1109e1d778b03dc316e2 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php @@ -5,6 +5,7 @@ */ namespace Magento\CatalogUrlRewrite\Model\Category\Plugin\Store; +use Magento\Catalog\Model\Category; use Magento\Catalog\Model\CategoryFactory; use Magento\Catalog\Model\ProductFactory; use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator; @@ -13,6 +14,13 @@ use Magento\Framework\Model\AbstractModel; use Magento\UrlRewrite\Model\UrlPersistInterface; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; +/** + * Plugin which is listening store resource model and on save or on delete replace catalog url rewrites + * + * @see \Magento\Store\Model\ResourceModel\Store + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @package Magento\CatalogUrlRewrite\Model\Category\Plugin\Store + */ class View { /** @var UrlPersistInterface */ @@ -30,6 +38,11 @@ class View /** @var ProductUrlRewriteGenerator */ protected $productUrlRewriteGenerator; + /** + * @var AbstractModel + */ + private $origStore; + /** * @param UrlPersistInterface $urlPersist * @param CategoryFactory $categoryFactory @@ -52,34 +65,48 @@ class View } /** - * Perform updating url for categories and products assigned to the store view - * - * @param \Magento\Store\Model\ResourceModel\Store $subject - * @param \Magento\Store\Model\ResourceModel\Store $result + * @param \Magento\Store\Model\ResourceModel\Store $object * @param AbstractModel $store + * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function beforeSave( + \Magento\Store\Model\ResourceModel\Store $object, + AbstractModel $store + ) { + $this->origStore = $store; + } + + /** + * Regenerate urls on store after save + * + * @param \Magento\Store\Model\ResourceModel\Store $object + * @param \Magento\Store\Model\ResourceModel\Store $store * @return \Magento\Store\Model\ResourceModel\Store * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function afterSave( - \Magento\Store\Model\ResourceModel\Store $subject, - \Magento\Store\Model\ResourceModel\Store $result, - AbstractModel $store + \Magento\Store\Model\ResourceModel\Store $object, + \Magento\Store\Model\ResourceModel\Store $store ) { - if ($store->isObjectNew() || $store->dataHasChangedFor('group_id')) { - if (!$store->isObjectNew()) { - $this->urlPersist->deleteByData([UrlRewrite::STORE_ID => $store->getId()]); + if ($this->origStore->isObjectNew() || $this->origStore->dataHasChangedFor('group_id')) { + if (!$this->origStore->isObjectNew()) { + $this->urlPersist->deleteByData([UrlRewrite::STORE_ID => $this->origStore->getId()]); } $this->urlPersist->replace( - $this->generateCategoryUrls($store->getRootCategoryId(), $store->getId()) + $this->generateCategoryUrls($this->origStore->getRootCategoryId(), $this->origStore->getId()) ); $this->urlPersist->replace( - $this->generateProductUrls($store->getWebsiteId(), $store->getOrigData('website_id'), $store->getId()) + $this->generateProductUrls( + $this->origStore->getWebsiteId(), + $this->origStore->getOrigData('website_id'), + $this->origStore->getId() + ) ); } - - return $result; + return $store; } /** @@ -101,7 +128,6 @@ class View ->addCategoryIds() ->addAttributeToSelect(['name', 'url_path', 'url_key', 'visibility']) ->addWebsiteFilter($websiteIds); - foreach ($collection as $product) { $product->setStoreId($storeId); /** @var \Magento\Catalog\Model\Product $product */ @@ -110,7 +136,6 @@ class View $this->productUrlRewriteGenerator->generate($product) ); } - return $urls; } @@ -131,7 +156,6 @@ class View $this->categoryUrlRewriteGenerator->generate($category) ); } - return $urls; } diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php index d30c2dde6e033fd3f3d10300ed59aa7a6c249916..ac2e42ebea7834a8b35cff1ee26dd2a936479ce3 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php @@ -137,6 +137,17 @@ class ViewTest extends \PHPUnit_Framework_TestCase public function testAfterSave() { + $origStoreMock = $this->getMockBuilder(\Magento\Store\Model\Store::class) + ->disableOriginalConstructor() + ->getMock(); + $reflectionStore = new \ReflectionClass($this->plugin); + $origStore = $reflectionStore->getProperty('origStore'); + $origStore->setAccessible(true); + $origStore->setValue($this->plugin, $origStoreMock); + $origStoreMock->expects($this->atLeastOnce()) + ->method('isObjectNew') + ->willReturn(true); + $this->abstractModelMock->expects($this->any()) ->method('isObjectNew') ->willReturn(true); diff --git a/app/code/Magento/CatalogWidget/Block/Product/Widget/Conditions.php b/app/code/Magento/CatalogWidget/Block/Product/Widget/Conditions.php index d57db33131b9d3cbe16f60119b9e97b82d72cdad..9a407b118461c19e0db02b92ad2b16a8eb8f5816 100644 --- a/app/code/Magento/CatalogWidget/Block/Product/Widget/Conditions.php +++ b/app/code/Magento/CatalogWidget/Block/Product/Widget/Conditions.php @@ -85,7 +85,7 @@ class Conditions extends Template implements RendererInterface $widget = $this->registry->registry('current_widget_instance'); if ($widget) { $widgetParameters = $widget->getWidgetParameters(); - } elseif($widgetOptions = $this->getLayout()->getBlock('wysiwyg_widget.options')) { + } elseif ($widgetOptions = $this->getLayout()->getBlock('wysiwyg_widget.options')) { $widgetParameters = $widgetOptions->getWidgetValues(); } @@ -100,6 +100,7 @@ class Conditions extends Template implements RendererInterface public function render(AbstractElement $element) { $this->element = $element; + $this->rule->getConditions()->setJsFormObject($this->getHtmlId()); return $this->toHtml(); } diff --git a/app/code/Magento/CatalogWidget/Model/Rule.php b/app/code/Magento/CatalogWidget/Model/Rule.php index 8258d3f1a8b4ff603650d99cc0dc7d38940cbd15..06bc8cba74dd6a86a84a959464f93bbc52ecbd45 100644 --- a/app/code/Magento/CatalogWidget/Model/Rule.php +++ b/app/code/Magento/CatalogWidget/Model/Rule.php @@ -5,6 +5,8 @@ */ namespace Magento\CatalogWidget\Model; +use Magento\Framework\Api\AttributeValueFactory; +use Magento\Framework\Api\ExtensionAttributesFactory; /** * Class Rule @@ -17,6 +19,8 @@ class Rule extends \Magento\Rule\Model\AbstractModel protected $conditionsFactory; /** + * Rule constructor + * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Data\FormFactory $formFactory @@ -25,6 +29,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection * @param array $data + * @param ExtensionAttributesFactory|null $extensionFactory + * @param AttributeValueFactory|null $customAttributeFactory + * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -35,7 +42,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel \Magento\CatalogWidget\Model\Rule\Condition\CombineFactory $conditionsFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, - array $data = [] + array $data = [], + ExtensionAttributesFactory $extensionFactory = null, + AttributeValueFactory $customAttributeFactory = null ) { $this->conditionsFactory = $conditionsFactory; parent::__construct( @@ -45,7 +54,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel $localeDate, $resource, $resourceCollection, - $data + $data, + $extensionFactory, + $customAttributeFactory ); } diff --git a/app/code/Magento/CatalogWidget/Test/Unit/Block/Product/Widget/ConditionsTest.php b/app/code/Magento/CatalogWidget/Test/Unit/Block/Product/Widget/ConditionsTest.php index 8d87c0ebf0d21768bbe05f5903aded09011e1663..b825e92bab1c2ef2eea4d2c08cd8da1ac1e9e192 100644 --- a/app/code/Magento/CatalogWidget/Test/Unit/Block/Product/Widget/ConditionsTest.php +++ b/app/code/Magento/CatalogWidget/Test/Unit/Block/Product/Widget/ConditionsTest.php @@ -15,6 +15,7 @@ use Magento\Framework\View\Element\BlockInterface; /** * Test class for \Magento\CatalogWidget\Block\Product\Widget\Conditions + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class ConditionsTest extends \PHPUnit_Framework_TestCase { @@ -175,4 +176,116 @@ class ConditionsTest extends \PHPUnit_Framework_TestCase ] ); } + + /** + * @return void + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function testRender() + { + $data = ['area' => 'backend']; + $abstractElementMock = $this->getMock( + \Magento\Framework\Data\Form\Element\AbstractElement::class, + ['getContainer'], + [], + '', + false + ); + $eventManagerMock = $this->getMock( + \Magento\Framework\Event\ManagerInterface::class, + [], + [], + '', + false + ); + $scopeConfigMock = $this->getMock( + \Magento\Framework\App\Config\ScopeConfigInterface::class, + [], + [], + '', + false + ); + $fieldsetMock = $this->getMock( + \Magento\Framework\Data\Form\Element\Fieldset::class, + [], + [], + '', + false + ); + $combineMock = $this->getMock( + \Magento\Rule\Model\Condition\Combine::class, + [], + [], + '', + false + ); + $resolverMock = $this->getMock( + \Magento\Framework\View\Element\Template\File\Resolver::class, + [], + [], + '', + false + ); + $filesystemMock = $this->getMock( + \Magento\Framework\Filesystem::class, + ['getDirectoryRead'], + [], + '', + false + ); + $validatorMock = $this->getMock( + \Magento\Framework\View\Element\Template\File\Validator::class, + [], + [], + '', + false + ); + $templateEnginePoolMock = $this->getMock( + \Magento\Framework\View\TemplateEnginePool::class, + [], + [], + '', + false + ); + $templateEngineMock = $this->getMock( + \Magento\Framework\View\TemplateEngineInterface::class, + [], + [], + '', + false + ); + $directoryReadMock = $this->getMock( + \Magento\Framework\Filesystem\Directory\ReadInterface::class, + [], + [], + '', + false + ); + + $this->ruleMock->expects($this->once())->method('getConditions')->willReturn($combineMock); + $combineMock->expects($this->once())->method('setJsFormObject')->willReturnSelf(); + $abstractElementMock->expects($this->any())->method('getContainer')->willReturn($fieldsetMock); + $filesystemMock->expects($this->once())->method('getDirectoryRead')->willReturn($directoryReadMock); + $validatorMock->expects($this->once())->method('isValid')->willReturn(true); + $this->contextMock->expects($this->once())->method('getEnginePool')->willReturn($templateEnginePoolMock); + $templateEnginePoolMock->expects($this->once())->method('get')->willReturn($templateEngineMock); + $templateEngineMock->expects($this->once())->method('render')->willReturn('html'); + + $this->widgetConditions = $this->objectManagerHelper->getObject( + Conditions::class, + [ + 'context' => $this->contextMock, + 'registry' => $this->registryMock, + 'rule' => $this->ruleMock, + '_eventManager' => $eventManagerMock, + '_filesystem' => $filesystemMock, + '_scopeConfig' => $scopeConfigMock, + 'validator' => $validatorMock, + 'resolver' => $resolverMock, + 'data' => $data + ] + ); + + $this->assertEquals($this->widgetConditions->render($abstractElementMock), 'html'); + } } diff --git a/app/code/Magento/CatalogWidget/Test/Unit/Model/RuleTest.php b/app/code/Magento/CatalogWidget/Test/Unit/Model/RuleTest.php index afcc540a375458a6fc0be2f0740b7e4d0ff58c23..a6468cc77a47f093a7f95f1694f10f4812ce0e1c 100644 --- a/app/code/Magento/CatalogWidget/Test/Unit/Model/RuleTest.php +++ b/app/code/Magento/CatalogWidget/Test/Unit/Model/RuleTest.php @@ -3,13 +3,15 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\CatalogWidget\Test\Unit\Model; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; - class RuleTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\CatalogWidget\Model\Rule */ @@ -22,25 +24,13 @@ class RuleTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->combineFactory = $this->getMockBuilder(\Magento\CatalogWidget\Model\Rule\Condition\CombineFactory::class) ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); - $objectManagerHelper = new ObjectManagerHelper($this); - - $this->prepareObjectManager([ - [ - \Magento\Framework\Api\ExtensionAttributesFactory::class, - $this->getMock(\Magento\Framework\Api\ExtensionAttributesFactory::class, [], [], '', false) - ], - [ - \Magento\Framework\Api\AttributeValueFactory::class, - $this->getMock(\Magento\Framework\Api\AttributeValueFactory::class, [], [], '', false) - ], - ]); - - $this->rule = $objectManagerHelper->getObject( + $this->rule = $this->objectManager->getObject( \Magento\CatalogWidget\Model\Rule::class, [ 'conditionsFactory' => $this->combineFactory @@ -62,20 +52,4 @@ class RuleTest extends \PHPUnit_Framework_TestCase { $this->assertNull($this->rule->getActionsInstance()); } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Checkout/Test/Unit/Model/ShippingInformationManagementTest.php b/app/code/Magento/Checkout/Test/Unit/Model/ShippingInformationManagementTest.php index 04d347ec237a9435964a5f4fcce784708c4365a4..402a0c8228356a7ae8a148d7626e06bb5dc15a27 100644 --- a/app/code/Magento/Checkout/Test/Unit/Model/ShippingInformationManagementTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Model/ShippingInformationManagementTest.php @@ -11,6 +11,11 @@ namespace Magento\Checkout\Test\Unit\Model; */ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \PHPUnit_Framework_MockObject_MockObject */ @@ -31,26 +36,6 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase */ protected $quoteRepositoryMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $addressValidatorMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $loggerMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $addressRepositoryMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $scopeConfigMock; - /** * @var \PHPUnit_Framework_MockObject_MockObject */ @@ -61,11 +46,6 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase */ protected $quoteMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $totalsCollectorMock; - /** * @var \Magento\Checkout\Model\ShippingInformationManagement */ @@ -103,6 +83,7 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->paymentMethodManagementMock = $this->getMock(\Magento\Quote\Api\PaymentMethodManagementInterface::class); $this->paymentDetailsFactoryMock = $this->getMock( \Magento\Checkout\Model\PaymentDetailsFactory::class, @@ -113,18 +94,6 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase ); $this->cartTotalsRepositoryMock = $this->getMock(\Magento\Quote\Api\CartTotalRepositoryInterface::class); $this->quoteRepositoryMock = $this->getMock(\Magento\Quote\Api\CartRepositoryInterface::class); - $this->addressValidatorMock = $this->getMock( - \Magento\Quote\Model\QuoteAddressValidator::class, - [], - [], - '', - false - ); - $this->loggerMock = $this->getMock(\Psr\Log\LoggerInterface::class); - $this->addressRepositoryMock = $this->getMock(\Magento\Customer\Api\AddressRepositoryInterface::class); - $this->scopeConfigMock = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class); - $this->totalsCollectorMock = - $this->getMock(\Magento\Quote\Model\Quote\TotalsCollector::class, [], [], '', false); $this->shippingAddressMock = $this->getMock( \Magento\Quote\Model\Quote\Address::class, [ @@ -175,22 +144,29 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase $this->shippingFactoryMock = $this->getMock(\Magento\Quote\Model\ShippingFactory::class, ['create'], [], '', false); - $this->prepareObjectManager([ - [\Magento\Quote\Model\ShippingAssignmentFactory::class, $this->shippingAssignmentFactoryMock], - [\Magento\Quote\Api\Data\CartExtensionFactory::class, $this->cartExtensionFactoryMock], - [\Magento\Quote\Model\ShippingFactory::class, $this->shippingFactoryMock], - ]); - - $this->model = new \Magento\Checkout\Model\ShippingInformationManagement( - $this->paymentMethodManagementMock, - $this->paymentDetailsFactoryMock, - $this->cartTotalsRepositoryMock, - $this->quoteRepositoryMock, - $this->addressValidatorMock, - $this->loggerMock, - $this->addressRepositoryMock, - $this->scopeConfigMock, - $this->totalsCollectorMock + $this->model = $this->objectManager->getObject( + \Magento\Checkout\Model\ShippingInformationManagement::class, + [ + 'paymentMethodManagement' => $this->paymentMethodManagementMock, + 'paymentDetailsFactory' => $this->paymentDetailsFactoryMock, + 'cartTotalsRepository' => $this->cartTotalsRepositoryMock, + 'quoteRepository' => $this->quoteRepositoryMock, + ] + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->model, + 'shippingAssignmentFactory', + $this->shippingAssignmentFactoryMock + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->model, + 'cartExtensionFactory', + $this->cartExtensionFactoryMock + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->model, + 'shippingFactory', + $this->shippingFactoryMock ); } @@ -457,20 +433,4 @@ class ShippingInformationManagementTest extends \PHPUnit_Framework_TestCase $this->model->saveAddressInformation($cartId, $addressInformationMock) ); } - - /** - * @param array $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php b/app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php index cb0b184051b0f94cb1ffa625de0bfe8d8fcce660..90760f3b43247f18935d9fdeecea4a080ee38fff 100644 --- a/app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php +++ b/app/code/Magento/Cms/Test/Unit/Model/Template/FilterTest.php @@ -6,6 +6,8 @@ namespace Magento\Cms\Test\Unit\Model\Template; /** + * Work with catalog(store, website) urls + * * @covers \Magento\Cms\Model\Template\Filter */ class FilterTest extends \PHPUnit_Framework_TestCase diff --git a/app/code/Magento/Config/App/Config/Source/ModularConfigSource.php b/app/code/Magento/Config/App/Config/Source/ModularConfigSource.php new file mode 100644 index 0000000000000000000000000000000000000000..b86c9144fac40416f4e4b13aa91a4638cabf7cb2 --- /dev/null +++ b/app/code/Magento/Config/App/Config/Source/ModularConfigSource.php @@ -0,0 +1,44 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Config\App\Config\Source; + +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\DataObject; +use Magento\Framework\App\Config\Initial\Reader; + +/** + * Class for retrieving initial configuration from modules + */ +class ModularConfigSource implements ConfigSourceInterface +{ + /** + * @var Reader + */ + private $reader; + + /** + * @param Reader $reader + */ + public function __construct(Reader $reader) + { + $this->reader = $reader; + } + + /** + * Get initial data + * + * @param string $path Format is scope type and scope code separated by slash: e.g. "type/code" + * @return array + */ + public function get($path = '') + { + $data = new DataObject($this->reader->read()); + if ($path !== '') { + $path = '/' . $path; + } + return $data->getData('data' . $path) ?: []; + } +} diff --git a/app/code/Magento/Config/App/Config/Source/RuntimeConfigSource.php b/app/code/Magento/Config/App/Config/Source/RuntimeConfigSource.php new file mode 100644 index 0000000000000000000000000000000000000000..7cd3a8ef76d4e06f1168e01de49c2645c931dc58 --- /dev/null +++ b/app/code/Magento/Config/App/Config/Source/RuntimeConfigSource.php @@ -0,0 +1,98 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Config\App\Config\Source; + +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\App\Config\ScopeCodeResolver; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\DataObject; +use Magento\Config\Model\ResourceModel\Config\Data\CollectionFactory; +use Magento\Framework\App\Config\Scope\Converter; + +/** + * Class for retrieving runtime configuration from database. + */ +class RuntimeConfigSource implements ConfigSourceInterface +{ + /** + * @var CollectionFactory + */ + private $collectionFactory; + + /** + * @var Converter + */ + private $converter; + + /** + * @var ScopeCodeResolver + */ + private $scopeCodeResolver; + + /** + * @param CollectionFactory $collectionFactory + * @param ScopeCodeResolver $scopeCodeResolver + * @param Converter $converter + */ + public function __construct( + CollectionFactory $collectionFactory, + ScopeCodeResolver $scopeCodeResolver, + Converter $converter + ) { + $this->collectionFactory = $collectionFactory; + $this->converter = $converter; + $this->scopeCodeResolver = $scopeCodeResolver; + } + + /** + * Get initial data. + * + * @param string $path Format is scope type and scope code separated by slash: e.g. "type/code" + * @return array + */ + public function get($path = '') + { + $data = new DataObject($this->loadConfig()); + return $data->getData($path) ?: []; + } + + /** + * Load config from database. + * + * Load collection from db and presents it in array with path keys, like: + * * scope/key/key * + * + * @return array + */ + private function loadConfig() + { + try { + $collection = $this->collectionFactory->create(); + } catch (\DomainException $e) { + $collection = []; + } + $config = []; + foreach ($collection as $item) { + if ($item->getScope() === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) { + $config[$item->getScope()][$item->getPath()] = $item->getValue(); + } else { + $code = $this->scopeCodeResolver->resolve($item->getScope(), $item->getScopeId()); + $config[$item->getScope()][$code][$item->getPath()] = $item->getValue(); + } + } + + foreach ($config as $scope => &$item) { + if ($scope === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) { + $item = $this->converter->convert($item); + } else { + foreach ($item as &$scopeItems) { + $scopeItems = $this->converter->convert($scopeItems); + } + } + } + return $config; + } +} diff --git a/app/code/Magento/Config/App/Config/Type/System.php b/app/code/Magento/Config/App/Config/Type/System.php new file mode 100644 index 0000000000000000000000000000000000000000..4a3c6da8379153a240e4869592fcef31788df608 --- /dev/null +++ b/app/code/Magento/Config/App/Config/Type/System.php @@ -0,0 +1,127 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Config\App\Config\Type; + +use Magento\Framework\App\Config\ConfigTypeInterface; +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\App\Config\Spi\PostProcessorInterface; +use Magento\Framework\Cache\FrontendInterface; +use Magento\Framework\DataObject; +use Magento\Framework\Serialize\Serializer\Serialize; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Store\Model\Config\Processor\Fallback; + +/** + * Class process source, cache them and retrieve value by path + * + * @package Magento\Config\App\Config\Type + */ +class System implements ConfigTypeInterface +{ + const CACHE_TAG = 'config_scopes'; + + const CONFIG_TYPE = 'system'; + + /** + * @var ConfigSourceInterface + */ + private $source; + + /** + * @var DataObject[] + */ + private $data; + + /** + * @var PostProcessorInterface + */ + private $postProcessor; + + /** + * @var FrontendInterface + */ + private $cache; + + /** + * @var int + */ + private $cachingNestedLevel; + + /** + * @var Fallback + */ + private $fallback; + + /** + * @var Serialize + */ + private $serializer; + + /** + * System constructor. + * @param ConfigSourceInterface $source + * @param PostProcessorInterface $postProcessor + * @param Fallback $fallback + * @param FrontendInterface $cache + * @param int $cachingNestedLevel + * @param Serialize $serializer + */ + public function __construct( + ConfigSourceInterface $source, + PostProcessorInterface $postProcessor, + Fallback $fallback, + FrontendInterface $cache, + Serialize $serializer, + $cachingNestedLevel = 1 + ) { + $this->source = $source; + $this->postProcessor = $postProcessor; + $this->cache = $cache; + $this->cachingNestedLevel = $cachingNestedLevel; + $this->fallback = $fallback; + $this->serializer = $serializer; + } + + /** + * @inheritdoc + */ + public function get($path = '') + { + if ($path === null) { + $path = ''; + } + if (!$this->data) { + $data = $this->cache->load(self::CONFIG_TYPE); + if (!$data) { + $data = $this->fallback->process($this->source->get()); + $this->data = new DataObject($data); + //Placeholder processing need system config - so we need to save intermediate result + $data = $this->postProcessor->process($data); + $this->data = new DataObject($data); + $this->cache->save( + $this->serializer->serialize($this->data->getData()), + self::CONFIG_TYPE, + [self::CACHE_TAG] + ); + } else { + $this->data = new DataObject($this->serializer->unserialize($data)); + } + } + + return $this->data->getData($path); + } + + /** + * Clean cache and global variables cache + * + * @return void + */ + public function clean() + { + $this->data = null; + $this->cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, [self::CACHE_TAG]); + } +} diff --git a/app/code/Magento/Config/Block/System/Config/Form.php b/app/code/Magento/Config/Block/System/Config/Form.php index 9ac2016d8897a667a1c19a3d9995c633ae96371a..d1a0da2a700a3f628c83ac2d61029bc915cd3ba6 100644 --- a/app/code/Magento/Config/Block/System/Config/Form.php +++ b/app/code/Magento/Config/Block/System/Config/Form.php @@ -5,6 +5,11 @@ */ namespace Magento\Config\Block\System\Config; +use Magento\Config\App\Config\Type\System; +use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker; +use Magento\Framework\App\DeploymentConfig; +use Magento\Framework\App\ObjectManager; + /** * System config form block * @@ -96,6 +101,16 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic */ protected $_fieldFactory; + /** + * @var SettingChecker + */ + private $settingChecker; + + /** + * @var DeploymentConfig + */ + private $appConfig; + /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Framework\Registry $registry @@ -129,6 +144,18 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic ]; } + /** + * @deprecated + * @return SettingChecker + */ + private function getSettingChecker() + { + if ($this->settingChecker === null) { + $this->settingChecker = ObjectManager::getInstance()->get(SettingChecker::class); + } + return $this->settingChecker; + } + /** * Initialize objects required to render config form * @@ -305,25 +332,27 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic $labelPrefix = '' ) { $inherit = true; - $data = null; - if (array_key_exists($path, $this->_configData)) { - $data = $this->_configData[$path]; - $inherit = false; - - if ($field->hasBackendModel()) { - $backendModel = $field->getBackendModel(); - $backendModel->setPath($path) - ->setValue($data) - ->setWebsite($this->getWebsiteCode()) - ->setStore($this->getStoreCode()) - ->afterLoad(); - $data = $backendModel->getValue(); + $data = $this->getAppConfigDataValue($path); + if ($data === null) { + if (array_key_exists($path, $this->_configData)) { + $data = $this->_configData[$path]; + $inherit = false; + + if ($field->hasBackendModel()) { + $backendModel = $field->getBackendModel(); + $backendModel->setPath($path) + ->setValue($data) + ->setWebsite($this->getWebsiteCode()) + ->setStore($this->getStoreCode()) + ->afterLoad(); + $data = $backendModel->getValue(); + } + + } elseif ($field->getConfigPath() !== null) { + $data = $this->getConfigValue($field->getConfigPath()); + } else { + $data = $this->getConfigValue($path); } - - } elseif ($field->getConfigPath() !== null) { - $data = $this->getConfigValue($field->getConfigPath()); - } else { - $data = $this->getConfigValue($path); } $fieldRendererClass = $field->getFrontendModel(); if ($fieldRendererClass) { @@ -344,6 +373,9 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic $sharedClass = $this->_getSharedCssClass($field); $requiresClass = $this->_getRequiresCssClass($field, $fieldPrefix); + $isReadOnly = $this->getSettingChecker()->isReadOnly($path, $this->getScope(), $this->getScopeCode()); + $canUseDefault = $this->canUseDefaultValue($field->showInDefault()); + $canUseWebsite = $this->canUseWebsiteValue($field->showInWebsite()); $formField = $fieldset->addField( $elementId, $field->getType(), @@ -360,9 +392,11 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'scope' => $this->getScope(), 'scope_id' => $this->getScopeId(), 'scope_label' => $this->getScopeLabel($field), - 'can_use_default_value' => $this->canUseDefaultValue($field->showInDefault()), - 'can_use_website_value' => $this->canUseWebsiteValue($field->showInWebsite()), - 'can_restore_to_default' => $this->isCanRestoreToDefault($field->canRestore()) + 'can_use_default_value' => $canUseDefault, + 'can_use_website_value' => $canUseWebsite, + 'can_restore_to_default' => $this->isCanRestoreToDefault($field->canRestore()), + 'disabled' => $isReadOnly, + 'is_disable_inheritance' => $isReadOnly ] ); $field->populateInput($formField); @@ -689,4 +723,39 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic } return $requiresClass; } + + /** + * Retrieve Deployment Configuration object. + * + * @deprecated + * @return DeploymentConfig + */ + private function getAppConfig() + { + if ($this->appConfig === null) { + $this->appConfig = ObjectManager::getInstance()->get(DeploymentConfig::class); + } + return $this->appConfig; + } + + /** + * Retrieve deployment config data value by path + * + * @param string $path + * @return null|string + */ + private function getAppConfigDataValue($path) + { + $appConfig = $this->getAppConfig()->get(System::CONFIG_TYPE); + $scope = $this->getScope(); + $scopeId = $this->getScopeId(); + if ($scope === 'default') { + $data = isset($appConfig[$scope][$path]) ? $appConfig[$scope][$path] : null; + } else { + $data = isset($appConfig[$scope][$scopeId][$path]) + ? $appConfig[$scope][$scopeId][$path] + : null; + } + return $data; + } } diff --git a/app/code/Magento/Config/Block/System/Config/Form/Field.php b/app/code/Magento/Config/Block/System/Config/Form/Field.php index 0af9706b9372863887defb27b100a1631786f637..fe0d17e87bd5e1c05cec4047e9a200918d19b45a 100644 --- a/app/code/Magento/Config/Block/System/Config/Form/Field.php +++ b/app/code/Magento/Config/Block/System/Config/Form/Field.php @@ -15,6 +15,8 @@ namespace Magento\Config\Block\System\Config\Form; /** + * Render field html element in Stores Configuration + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.NumberOfChildren) */ @@ -97,6 +99,7 @@ class Field extends \Magento\Backend\Block\Template implements \Magento\Framewor $htmlId = $element->getHtmlId(); $namePrefix = preg_replace('#\[value\](\[\])?$#', '', $element->getName()); $checkedHtml = $element->getInherit() == 1 ? 'checked="checked"' : ''; + $disabled = $element->getIsDisableInheritance() == true ? ' disabled="disabled"' : ''; $html = '<td class="use-default">'; $html .= '<input id="' . @@ -105,7 +108,7 @@ class Field extends \Magento\Backend\Block\Template implements \Magento\Framewor $namePrefix . '[inherit]" type="checkbox" value="1"' . ' class="checkbox config-inherit" ' . - $checkedHtml . + $checkedHtml . $disabled . ' onclick="toggleValueElements(this, Element.previous(this.parentNode))" /> '; $html .= '<label for="' . $htmlId . '_inherit" class="inherit">' . $this->_getInheritCheckboxLabel( $element diff --git a/app/code/Magento/Config/Model/Config/Backend/Store.php b/app/code/Magento/Config/Model/Config/Backend/Store.php index d33f5e5143daa665918a200ef9500c18eb8cd5d8..02f4ab96b5e5e1ae92851a0c7f3f48d0fcde246b 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Store.php +++ b/app/code/Magento/Config/Model/Config/Backend/Store.php @@ -45,11 +45,6 @@ class Store extends \Magento\Framework\App\Config\Value */ public function afterSave() { - $this->_mutableConfig->setValue( - \Magento\Store\Model\Store::XML_PATH_STORE_IN_URL, - $this->getValue(), - \Magento\Store\Model\ScopeInterface::SCOPE_STORE - ); $this->_cacheManager->clean(); return parent::afterSave(); } diff --git a/app/code/Magento/Config/Model/Config/Loader.php b/app/code/Magento/Config/Model/Config/Loader.php index 7ce3254a475746f3de1e4635dab55fed9eaedde4..4b10ffd6ea9d839cb013902356cb9e9134d2dde3 100644 --- a/app/code/Magento/Config/Model/Config/Loader.php +++ b/app/code/Magento/Config/Model/Config/Loader.php @@ -9,6 +9,11 @@ */ namespace Magento\Config\Model\Config; +/** + * Class which can read config by paths + * + * @package Magento\Config\Model\Config + */ class Loader { /** diff --git a/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php b/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php new file mode 100644 index 0000000000000000000000000000000000000000..48b82086ad8b10d3b0241d2502b6199ab2584ab1 --- /dev/null +++ b/app/code/Magento/Config/Model/Config/Reader/Source/Deployed/SettingChecker.php @@ -0,0 +1,72 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Config\Model\Config\Reader\Source\Deployed; + +use Magento\Config\Model\Config\Reader; +use Magento\Framework\App\Config\ScopeCodeResolver; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\App\DeploymentConfig; +use Magento\Framework\App\ObjectManager; + +/** + * Class for checking settings that defined in config file + */ +class SettingChecker +{ + /** + * @var DeploymentConfig + */ + private $config; + + /** + * @var ScopeCodeResolver + */ + private $scopeCodeResolver; + + /** + * @param DeploymentConfig $config + * @param ScopeCodeResolver $scopeCodeResolver + */ + public function __construct( + DeploymentConfig $config, + ScopeCodeResolver $scopeCodeResolver + ) { + $this->config = $config; + $this->scopeCodeResolver = $scopeCodeResolver; + } + + /** + * Resolve path by scope and scope code + * + * @param string $scope + * @param string $scopeCode + * @return string + */ + private function resolvePath($scope, $scopeCode) + { + $scopePath = 'system/' . $scope; + + if ($scope != ScopeConfigInterface::SCOPE_TYPE_DEFAULT) { + $scopePath .= '/' . $this->scopeCodeResolver->resolve($scope, $scopeCode); + } + + return $scopePath; + } + + /** + * Check that setting defined in deployed configuration + * + * @param string $path + * @param string $scope + * @param string $scopeCode + * @return boolean + */ + public function isReadOnly($path, $scope, $scopeCode) + { + $config = $this->config->get($this->resolvePath($scope, $scopeCode) . "/" . $path); + return $config !== null; + } +} diff --git a/app/code/Magento/Config/Model/Config/Structure/Data.php b/app/code/Magento/Config/Model/Config/Structure/Data.php index 414addf5b6f06ba4518897f0f7c6440156863bb7..6c926e7c1da1a79e8043944117b6230e5bf5517d 100644 --- a/app/code/Magento/Config/Model/Config/Structure/Data.php +++ b/app/code/Magento/Config/Model/Config/Structure/Data.php @@ -5,21 +5,30 @@ */ namespace Magento\Config\Model\Config\Structure; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides configuration + */ class Data extends \Magento\Framework\Config\Data\Scoped { /** + * Constructor + * * @param Reader $reader * @param \Magento\Framework\Config\ScopeInterface $configScope * @param \Magento\Framework\Config\CacheInterface $cache * @param string $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( Reader $reader, \Magento\Framework\Config\ScopeInterface $configScope, \Magento\Framework\Config\CacheInterface $cache, - $cacheId + $cacheId, + SerializerInterface $serializer = null ) { - parent::__construct($reader, $configScope, $cache, $cacheId); + parent::__construct($reader, $configScope, $cache, $cacheId, $serializer); } /** diff --git a/app/code/Magento/Config/Test/Unit/App/Config/Source/ModularConfigSourceTest.php b/app/code/Magento/Config/Test/Unit/App/Config/Source/ModularConfigSourceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..204bafcd0261c2bb283a978fab372c6afbf0d7b8 --- /dev/null +++ b/app/code/Magento/Config/Test/Unit/App/Config/Source/ModularConfigSourceTest.php @@ -0,0 +1,43 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Config\Test\Unit\App\Config\Source; + +use Magento\Config\App\Config\Source\ModularConfigSource; +use Magento\Framework\App\Config\Initial\Reader; + +/** + * Test config source that is retrieved from config.xml + * + * @package Magento\Config\Test\Unit\App\Config\Source + */ +class ModularConfigSourceTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Reader|\PHPUnit_Framework_MockObject_MockObject + */ + private $reader; + + /** + * @var ModularConfigSource + */ + private $source; + + public function setUp() + { + $this->reader = $this->getMockBuilder(Reader::class) + ->disableOriginalConstructor() + ->getMock(); + $this->source = new ModularConfigSource($this->reader); + } + + public function testGet() + { + $this->reader->expects($this->once()) + ->method('read') + ->willReturn(['data' => ['path' => 'value']]); + $this->assertEquals('value', $this->source->get('path')); + } +} diff --git a/app/code/Magento/Config/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php b/app/code/Magento/Config/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a750bdb32744f23bf6172d1c1034998cb7f66759 --- /dev/null +++ b/app/code/Magento/Config/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php @@ -0,0 +1,136 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Config\Test\Unit\App\Config\Source; + +use Magento\Config\App\Config\Source\RuntimeConfigSource; +use Magento\Config\Model\ResourceModel\Config\Data\CollectionFactory; +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Framework\App\Config\ScopeCodeResolver; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\App\Config\Value; + +/** + * Test Class for retrieving runtime configuration from database. + * @package Magento\Config\Test\Unit\App\Config\Source + */ +class RuntimeConfigSourceTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $collectionFactory; + + /** + * @var ScopeCodeResolver|\PHPUnit_Framework_MockObject_MockObject + */ + private $scopeCodeResolver; + + /** + * @var Converter|\PHPUnit_Framework_MockObject_MockObject + */ + private $converter; + + /** + * @var Value|\PHPUnit_Framework_MockObject_MockObject + */ + private $configItem; + + /** + * @var Value|\PHPUnit_Framework_MockObject_MockObject + */ + private $configItemTwo; + + /** + * @var RuntimeConfigSource + */ + private $configSource; + + public function setUp() + { + $this->collectionFactory = $this->getMockBuilder(CollectionFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class) + ->disableOriginalConstructor() + ->getMock(); + $this->converter = $this->getMockBuilder(Converter::class) + ->disableOriginalConstructor() + ->getMock(); + $this->configItem = $this->getMockBuilder(Value::class) + ->disableOriginalConstructor() + ->setMethods(['getScope', 'getPath', 'getValue']) + ->getMock(); + $this->configItemTwo = $this->getMockBuilder(Value::class) + ->disableOriginalConstructor() + ->setMethods(['getScope', 'getPath', 'getValue', 'getScopeId']) + ->getMock(); + $this->configSource = new RuntimeConfigSource( + $this->collectionFactory, + $this->scopeCodeResolver, + $this->converter + ); + } + + public function testGet() + { + $scope = 'websites'; + $scopeCode = 'myWebsites'; + $this->collectionFactory->expects($this->once()) + ->method('create') + ->willReturn([$this->configItem, $this->configItemTwo]); + $this->configItem->expects($this->exactly(2)) + ->method('getScope') + ->willReturn(ScopeConfigInterface::SCOPE_TYPE_DEFAULT); + $this->configItem->expects($this->once()) + ->method('getPath') + ->willReturn('dev/test/setting'); + $this->configItem->expects($this->once()) + ->method('getValue') + ->willReturn(true); + + $this->configItemTwo->expects($this->exactly(3)) + ->method('getScope') + ->willReturn($scope); + $this->configItemTwo->expects($this->once()) + ->method('getScopeId') + ->willReturn($scopeCode); + $this->configItemTwo->expects($this->once()) + ->method('getPath') + ->willReturn('dev/test/setting2'); + $this->configItemTwo->expects($this->once()) + ->method('getValue') + ->willReturn(false); + $this->scopeCodeResolver->expects($this->once()) + ->method('resolve') + ->with($scope, $scopeCode) + ->willReturnArgument(1); + $this->converter->expects($this->exactly(2)) + ->method('convert') + ->withConsecutive( + [['dev/test/setting' => true]], + [['dev/test/setting2' => false]] + ) + ->willReturnOnConsecutiveCalls( + ['dev/test/setting' => true], + ['dev/test/setting2' => false] + ); + + $this->assertEquals( + [ + 'default' => [ + 'dev/test/setting' => true + ], + 'websites' => [ + 'myWebsites' => [ + 'dev/test/setting2' => false + ] + ] + ], + $this->configSource->get() + ); + } +} diff --git a/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php b/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php new file mode 100644 index 0000000000000000000000000000000000000000..be541228bf6d88a5ad7e459ba77a34e896c863a1 --- /dev/null +++ b/app/code/Magento/Config/Test/Unit/App/Config/Type/SystemTest.php @@ -0,0 +1,141 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Config\Test\Unit\App\Config\Type; + +use Magento\Config\App\Config\Type\System; +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\App\Config\Spi\PostProcessorInterface; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Cache\FrontendInterface; +use Magento\Framework\Serialize\Serializer\Serialize; +use Magento\Store\Model\Config\Processor\Fallback; + +/** + * Test how Class process source, cache them and retrieve value by path + * @package Magento\Config\Test\Unit\App\Config\Type + */ +class SystemTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $source; + + /** + * @var PostProcessorInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $postProcessor; + + /** + * @var Fallback|\PHPUnit_Framework_MockObject_MockObject + */ + private $fallback; + + /** + * @var FrontendInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $cache; + + /** + * @var System + */ + private $configType; + + /** + * @var Serialize|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializer; + + public function setUp() + { + $this->source = $this->getMockBuilder(ConfigSourceInterface::class) + ->getMockForAbstractClass(); + $this->postProcessor = $this->getMockBuilder(PostProcessorInterface::class) + ->getMockForAbstractClass(); + $this->fallback = $this->getMockBuilder(Fallback::class) + ->disableOriginalConstructor() + ->getMock(); + $this->cache = $this->getMockBuilder(FrontendInterface::class) + ->getMockForAbstractClass(); + $this->serializer = $this->getMockBuilder(Serialize::class) + ->disableOriginalConstructor() + ->getMock(); + $this->configType = new System( + $this->source, + $this->postProcessor, + $this->fallback, + $this->cache, + $this->serializer + ); + } + + /** + * @param bool $isCached + * @dataProvider getDataProvider + */ + public function testGet($isCached) + { + $path = 'default/dev/unsecure/url'; + $url = 'http://magento.test/'; + $data = [ + 'default' => [ + 'dev' => [ + 'unsecure' => [ + 'url' => $url + ] + ] + ] + ]; + + $this->cache->expects($this->once()) + ->method('load') + ->with(System::CONFIG_TYPE) + ->willReturn($isCached ? $data : null); + + if ($isCached) { + $this->serializer->expects($this->once()) + ->method('unserialize') + ->willReturn($data); + } + + if (!$isCached) { + $this->serializer->expects($this->once()) + ->method('serialize') + ->willReturn(serialize($data)); + $this->source->expects($this->once()) + ->method('get') + ->willReturn($data); + $this->fallback->expects($this->once()) + ->method('process') + ->with($data) + ->willReturnArgument(0); + $this->postProcessor->expects($this->once()) + ->method('process') + ->with($data) + ->willReturnArgument(0); + $this->cache->expects($this->once()) + ->method('save') + ->with( + serialize($data), + System::CONFIG_TYPE, + [System::CACHE_TAG] + ); + } + + $this->assertEquals($url, $this->configType->get($path)); + } + + /** + * @return array + */ + public function getDataProvider() + { + return [ + [true], + [false] + ]; + } +} diff --git a/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/FieldTest.php b/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/FieldTest.php index ccd5beb12cdf74197dfd9c63bdd8839e80d8f02c..f0643fc3b1c73c46c0a2c899b8769ea8142adfb4 100644 --- a/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/FieldTest.php +++ b/app/code/Magento/Config/Test/Unit/Block/System/Config/Form/FieldTest.php @@ -5,6 +5,11 @@ */ namespace Magento\Config\Test\Unit\Block\System\Config\Form; +/** + * Test how class render field html element in Stores Configuration + * + * @package Magento\Config\Test\Unit\Block\System\Config\Form + */ class FieldTest extends \PHPUnit_Framework_TestCase { /** @@ -69,6 +74,7 @@ class FieldTest extends \PHPUnit_Framework_TestCase 'getScope', 'getScopeLabel', 'getInherit', + 'getIsDisableInheritance', 'getCanUseWebsiteValue', 'getCanUseDefaultValue', 'setDisabled', @@ -185,6 +191,7 @@ class FieldTest extends \PHPUnit_Framework_TestCase $this->_elementMock->expects($this->any())->method('getCanUseWebsiteValue')->will($this->returnValue(true)); $this->_elementMock->expects($this->any())->method('getCanUseDefaultValue')->will($this->returnValue(true)); $this->_elementMock->expects($this->once())->method('setDisabled')->with(true); + $this->_elementMock->expects($this->once())->method('getIsDisableInheritance')->willReturn(true); $expected = '<td class="use-default">'; $expected .= '<input id="' . @@ -192,7 +199,7 @@ class FieldTest extends \PHPUnit_Framework_TestCase '_inherit" name="' . $this->_testData['name'] . '[inherit]" type="checkbox" value="1"' . - ' class="checkbox config-inherit" checked="checked"' . + ' class="checkbox config-inherit" checked="checked"' . ' disabled="disabled"' . ' onclick="toggleValueElements(this, Element.previous(this.parentNode))" /> '; $expected .= '<label for="' . $this->_testData['htmlId'] . '_inherit" class="inherit">Use Website</label>'; diff --git a/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php b/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php index 788c7788cccd19f880c72c43b8c6f47e00c545d6..2c671914f264b04ec34508d919a23c67bf64abad 100644 --- a/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php +++ b/app/code/Magento/Config/Test/Unit/Block/System/Config/FormTest.php @@ -8,6 +8,15 @@ namespace Magento\Config\Test\Unit\Block\System\Config; +use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker; +use Magento\Framework\App\DeploymentConfig; + +/** + * Test System config form block + * + * @package Magento\Config\Test\Unit\Block\System\Config + */ + /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ @@ -178,6 +187,20 @@ class FormTest extends \PHPUnit_Framework_TestCase $this->_objectBuilder = $this->getMockBuilder(\Magento\Config\Block\System\Config\Form::class) ->setConstructorArgs($objectArguments) ->setMethods(['something']); + $deploymentConfigMock = $this->getMockBuilder(DeploymentConfig::class) + ->disableOriginalConstructor() + ->getMock(); + $deploymentConfigMock->expects($this->any()) + ->method('get') + ->willReturn([]); + + $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); + $objectManagerMock->expects($this->any()) + ->method('get') + ->willReturnMap([ + [DeploymentConfig::class, $deploymentConfigMock] + ]); + \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock); $this->object = $helper->getObject(\Magento\Config\Block\System\Config\Form::class, $data); $this->object->setData('scope_id', 1); } @@ -549,10 +572,12 @@ class FormTest extends \PHPUnit_Framework_TestCase 'field_config' => 'fieldData', 'scope' => 'stores', 'scope_id' => 1, - 'scope_label' => '[GLOBAL]', + 'scope_label' => __('[GLOBAL]'), 'can_use_default_value' => false, 'can_use_website_value' => false, 'can_restore_to_default' => false, + 'disabled' => false, + 'is_disable_inheritance' => false ]; $formFieldMock->expects($this->once())->method('setRenderer')->with($fieldRendererMock); @@ -571,6 +596,18 @@ class FormTest extends \PHPUnit_Framework_TestCase $fieldMock->expects($this->once())->method('populateInput'); + + $settingChecker = $this->getMockBuilder(SettingChecker::class) + ->disableOriginalConstructor() + ->getMock(); + $settingChecker->expects($this->once()) + ->method('isReadOnly') + ->willReturn(false); + $reflection = new \ReflectionClass(get_class($this->object)); + $reflectionProperty = $reflection->getProperty('settingChecker'); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($this->object, $settingChecker); + $this->object->initFields($fieldsetMock, $groupMock, $sectionMock, $fieldPrefix, $labelPrefix); } diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/LoaderTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/LoaderTest.php index 6047aa4c06afb4dfd7e1dab451aa8c93e4010755..69d4b01526a216f1e97b588fd14af0f9066ac3a3 100644 --- a/app/code/Magento/Config/Test/Unit/Model/Config/LoaderTest.php +++ b/app/code/Magento/Config/Test/Unit/Model/Config/LoaderTest.php @@ -5,6 +5,9 @@ */ namespace Magento\Config\Test\Unit\Model\Config; +/** + * @package Magento\Config\Test\Unit\Model\Config + */ class LoaderTest extends \PHPUnit_Framework_TestCase { /** @@ -32,7 +35,6 @@ class LoaderTest extends \PHPUnit_Framework_TestCase false ); $this->_model = new \Magento\Config\Model\Config\Loader($this->_configValueFactory); - $this->_configCollection = $this->getMock( \Magento\Config\Model\ResourceModel\Config\Data\Collection::class, [], diff --git a/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php b/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2e746eae410f414788a7b5277e331be7075e6655 --- /dev/null +++ b/app/code/Magento/Config/Test/Unit/Model/Config/Reader/Source/Deployed/SettingCheckerTest.php @@ -0,0 +1,71 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Config\Test\Unit\Model\Config\Reader\Source\Deployed; + +use Magento\Config\Model\Config\Reader; +use Magento\Config\Model\Config\Reader\Source\Deployed\SettingChecker; +use Magento\Framework\App\Config\ScopeCodeResolver; +use Magento\Framework\App\Config; +use Magento\Framework\App\DeploymentConfig; + +/** + * Test class for checking settings that defined in config file + * + * @package Magento\Config\Test\Unit\Model\Config\Reader\Source\Deployed + */ +class SettingCheckerTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Config|\PHPUnit_Framework_MockObject_MockObject + */ + private $config; + + /** + * @var SettingChecker + */ + private $checker; + + /** + * @var ScopeCodeResolver | \PHPUnit_Framework_MockObject_MockObject + */ + private $scopeCodeResolver; + + public function setUp() + { + $this->config = $this->getMockBuilder(DeploymentConfig::class) + ->disableOriginalConstructor() + ->getMock(); + $this->scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class) + ->disableOriginalConstructor() + ->getMock(); + $this->checker = new SettingChecker($this->config, $this->scopeCodeResolver); + } + + public function testIsDefined() + { + $path = 'general/web/locale'; + $scope = 'website'; + $scopeCode = 'myWebsite'; + $scopeCodeId = '4'; + + $this->config->expects($this->once()) + ->method('get') + ->willReturn([ + $scope => [ + $scopeCode => [ + $path => 'value' + ], + ], + ]); + + $this->scopeCodeResolver->expects($this->once()) + ->method('resolve') + ->with($scope, $scopeCodeId) + ->willReturn($scopeCode); + + $this->assertTrue($this->checker->isReadOnly($path, $scope, $scopeCodeId)); + } +} diff --git a/app/code/Magento/Config/composer.json b/app/code/Magento/Config/composer.json index b14dd825b0d12d819fd511222e80de12a7cf8c3a..ab9c95e1166536ebb71adf36a1b5f1b9aea06b68 100644 --- a/app/code/Magento/Config/composer.json +++ b/app/code/Magento/Config/composer.json @@ -11,6 +11,9 @@ "magento/module-backend": "100.2.*", "magento/module-media-storage": "100.2.*" }, + "suggest": { + "magento/module-deploy": "100.2.*" + }, "type": "magento2-module", "version": "100.2.0-dev", "license": [ diff --git a/app/code/Magento/Config/etc/di.xml b/app/code/Magento/Config/etc/di.xml index 9a72ebcb16609caa28ce328c2b3c2ebcb43c9e0d..4f9eae24b55f611db54f3f5423c3944f7d93a7f6 100644 --- a/app/code/Magento/Config/etc/di.xml +++ b/app/code/Magento/Config/etc/di.xml @@ -69,4 +69,97 @@ <argument name="resourceCollection" xsi:type="object">Magento\Config\Model\ResourceModel\Config\Data\Collection\Proxy</argument> </arguments> </type> + <type name="Magento\Framework\App\Config"> + <arguments> + <argument name="types" xsi:type="array"> + <item name="system" xsi:type="object">Magento\Config\App\Config\Type\System</item> + </argument> + </arguments> + </type> + <type name="Magento\Config\App\Config\Type\System"> + <arguments> + <argument name="source" xsi:type="object">systemConfigSourceAggregatedProxy</argument> + <argument name="postProcessor" xsi:type="object">systemConfigPostProcessorCompositeProxy</argument> + <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument> + </arguments> + </type> + <virtualType name="modulesDataProviderProxy" type="Magento\Framework\App\Config\InitialConfigSource\Proxy"> + <arguments> + <argument name="instanceName" xsi:type="string">modulesDataProvider</argument> + </arguments> + </virtualType> + <virtualType name="modulesDataProvider" type="Magento\Framework\App\Config\InitialConfigSource"> + <arguments> + <argument name="reader" xsi:type="object">Magento\Framework\App\DeploymentConfig\Reader</argument> + <argument name="configType" xsi:type="const">Magento\Framework\Config\ConfigOptionsListConstants::KEY_MODULES</argument> + <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument> + </arguments> + </virtualType> + <virtualType name="systemConfigPostProcessorCompositeProxy" type="Magento\Framework\App\Config\PostProcessorComposite\Proxy"> + <arguments> + <argument name="instanceName" xsi:type="string">systemConfigPostProcessorComposite</argument> + </arguments> + </virtualType> + <virtualType name="systemConfigSourceAggregatedProxy" type="Magento\Framework\App\Config\ConfigSourceAggregated\Proxy"> + <arguments> + <argument name="instanceName" xsi:type="string">systemConfigSourceAggregated</argument> + </arguments> + </virtualType> + <virtualType name="systemConfigPostProcessorComposite" type="Magento\Framework\App\Config\PostProcessorComposite"> + <arguments> + <argument name="processors" xsi:type="array"> + <item name="placeholder" xsi:type="object">Magento\Store\Model\Config\Processor\Placeholder</item> + <item name="metadata" xsi:type="object">Magento\Framework\App\Config\MetadataConfigTypeProcessor</item> + </argument> + </arguments> + </virtualType> + <virtualType name="systemConfigSourceAggregated" type="Magento\Framework\App\Config\ConfigSourceAggregated"> + <arguments> + <argument name="sources" xsi:type="array"> + <item name="modular" xsi:type="array"> + <item name="source" xsi:type="object">Magento\Config\App\Config\Source\ModularConfigSource</item> + <item name="sortOrder" xsi:type="string">10</item> + </item> + <item name="dynamic" xsi:type="array"> + <item name="source" xsi:type="object">Magento\Config\App\Config\Source\RuntimeConfigSource</item> + <item name="sortOrder" xsi:type="string">100</item> + </item> + <item name="initial" xsi:type="array"> + <item name="source" xsi:type="object">systemConfigInitialDataProvider</item> + <item name="sortOrder" xsi:type="string">1000</item> + </item> + </argument> + </arguments> + </virtualType> + <virtualType name="systemConfigInitialDataProvider" type="Magento\Framework\App\Config\InitialConfigSource"> + <arguments> + <argument name="reader" xsi:type="object">Magento\Framework\App\DeploymentConfig\Reader</argument> + <argument name="configType" xsi:type="const">Magento\Config\App\Config\Type\System::CONFIG_TYPE</argument> + <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument> + </arguments> + </virtualType> + <virtualType name="appDumpSystemSource" type="Magento\Framework\App\Config\ConfigSourceAggregated"> + <arguments> + <argument name="sources" xsi:type="array"> + <item name="initial" xsi:type="array"> + <item name="source" xsi:type="object">systemConfigInitialDataProvider</item> + <item name="sortOrder" xsi:type="string">10</item> + </item> + <item name="dynamic" xsi:type="array"> + <item name="source" xsi:type="object">Magento\Config\App\Config\Source\RuntimeConfigSource</item> + <item name="sortOrder" xsi:type="string">1000</item> + </item> + </argument> + </arguments> + </virtualType> + <type name="Magento\Deploy\Console\Command\App\ApplicationDumpCommand"> + <arguments> + <argument name="sources" xsi:type="array"> + <item name="system" xsi:type="array"> + <item name="source" xsi:type="object">appDumpSystemSource</item> + <item name="namespace" xsi:type="const">Magento\Config\App\Config\Type\System::CONFIG_TYPE</item> + </item> + </argument> + </arguments> + </type> </config> diff --git a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php index 29e670e9f7f4fc95ccc51974d484dc0d802c13e2..9eedf22fbc1ae721fa6f453617c2a68ad6ea32e2 100644 --- a/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php +++ b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php @@ -12,6 +12,7 @@ namespace Magento\ConfigurableImportExport\Model\Import\Product\Type; use Magento\Catalog\Api\Data\ProductInterface; use Magento\CatalogImportExport\Model\Import\Product as ImportProduct; +use Magento\Framework\EntityManager\MetadataPool; /** * Importing configurable products @@ -140,6 +141,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ * Instance of database adapter. * * @var \Magento\Framework\DB\Adapter\AdapterInterface + * @deprecated */ protected $_connection; @@ -200,6 +202,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ * @param \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypesConfig * @param \Magento\ImportExport\Model\ResourceModel\Helper $resourceHelper * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $_productColFac + * @param MetadataPool $metadataPool */ public function __construct( \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac, @@ -208,12 +211,12 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ array $params, \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypesConfig, \Magento\ImportExport\Model\ResourceModel\Helper $resourceHelper, - \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $_productColFac + \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $_productColFac, + MetadataPool $metadataPool = null ) { - parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params); + parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params, $metadataPool); $this->_productTypesConfig = $productTypesConfig; $this->_resourceHelper = $resourceHelper; - $this->_resource = $resource; $this->_productColFac = $_productColFac; $this->_connection = $this->_entityModel->getConnection(); } @@ -379,14 +382,14 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ if (!empty($productIds)) { $mainTable = $this->_resource->getTableName('catalog_product_super_attribute'); $optionTable = $this->_resource->getTableName('eav_attribute_option'); - $select = $this->_connection->select()->from( + $select = $this->connection->select()->from( ['m' => $mainTable], ['product_id', 'attribute_id', 'product_super_attribute_id'] )->joinLeft( ['o' => $optionTable], - $this->_connection->quoteIdentifier( + $this->connection->quoteIdentifier( 'o.attribute_id' - ) . ' = ' . $this->_connection->quoteIdentifier( + ) . ' = ' . $this->connection->quoteIdentifier( 'o.attribute_id' ), ['option_id'] @@ -395,7 +398,7 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ $productIds ); - foreach ($this->_connection->fetchAll($select) as $row) { + foreach ($this->connection->fetchAll($select) as $row) { $attrId = $row['attribute_id']; $productId = $row['product_id']; if ($row['option_id']) { @@ -448,8 +451,8 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ 'product_id' => $this->_productSuperData['assoc_entity_ids'][$assocId], 'parent_id' => $this->_productSuperData['product_id'], ]; - $subEntityId = $this->_connection->fetchOne( - $this->_connection->select()->from( + $subEntityId = $this->connection->fetchOne( + $this->connection->select()->from( ['cpe' => $this->_resource->getTableName('catalog_product_entity')], ['entity_id'] )->where($metadata->getLinkField() . ' = ?', $assocId) ); @@ -557,10 +560,10 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ && !empty($this->_productSuperData['product_id']) && !empty($this->_simpleIdsToDelete) ) { - $quoted = $this->_connection->quoteInto('IN (?)', [$this->_productSuperData['product_id']]); - $quotedChildren = $this->_connection->quoteInto('IN (?)', $this->_simpleIdsToDelete); - $this->_connection->delete($linkTable, "parent_id {$quoted} AND product_id {$quotedChildren}"); - $this->_connection->delete($relationTable, "parent_id {$quoted} AND child_id {$quotedChildren}"); + $quoted = $this->connection->quoteInto('IN (?)', [$this->_productSuperData['product_id']]); + $quotedChildren = $this->connection->quoteInto('IN (?)', $this->_simpleIdsToDelete); + $this->connection->delete($linkTable, "parent_id {$quoted} AND product_id {$quotedChildren}"); + $this->connection->delete($relationTable, "parent_id {$quoted} AND child_id {$quotedChildren}"); } return $this; } @@ -587,16 +590,16 @@ class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Typ } } if ($mainData) { - $this->_connection->insertOnDuplicate($mainTable, $mainData); + $this->connection->insertOnDuplicate($mainTable, $mainData); } if ($this->_superAttributesData['labels']) { - $this->_connection->insertOnDuplicate($labelTable, $this->_superAttributesData['labels']); + $this->connection->insertOnDuplicate($labelTable, $this->_superAttributesData['labels']); } if ($this->_superAttributesData['super_link']) { - $this->_connection->insertOnDuplicate($linkTable, $this->_superAttributesData['super_link']); + $this->connection->insertOnDuplicate($linkTable, $this->_superAttributesData['super_link']); } if ($this->_superAttributesData['relation']) { - $this->_connection->insertOnDuplicate($relationTable, $this->_superAttributesData['relation']); + $this->connection->insertOnDuplicate($relationTable, $this->_superAttributesData['relation']); } return $this; } diff --git a/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php index 8ce7489db932ef9f21eb5eb1ae21d6341e1658c9..4cc4e6648a0ef8d63c6ae13e28c547b6e9019155 100644 --- a/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php +++ b/app/code/Magento/ConfigurableImportExport/Test/Unit/Model/Import/Product/Type/ConfigurableTest.php @@ -312,15 +312,10 @@ class ConfigurableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst 'prodAttrColFac' => $this->attrCollectionFactory, 'params' => $this->params, 'resource' => $this->resource, - 'productColFac' => $this->productCollectionFactory + 'productColFac' => $this->productCollectionFactory, + 'metadataPool' => $metadataPoolMock, ] ); - $reflection = new \ReflectionClass( - \Magento\ConfigurableImportExport\Model\Import\Product\Type\Configurable::class - ); - $reflectionProperty = $reflection->getProperty('metadataPool'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->configurable, $metadataPoolMock); } /** diff --git a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php index 5216f13355970c153c05fa239fd1e9272354d6bb..44a4d468cd0978b1c46eee68a9b3ff384147ffea 100644 --- a/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php +++ b/app/code/Magento/ConfigurableProduct/Model/ResourceModel/Product/Type/Configurable/Product/Collection.php @@ -7,10 +7,6 @@ */ namespace Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Product; -use Magento\Customer\Api\GroupManagementInterface; -use Magento\Framework\EntityManager\MetadataPool; -use Magento\Catalog\Api\Data\ProductInterface; - /** * Class Collection * @@ -25,84 +21,6 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection */ protected $_linkTable; - /** - * @var MetadataPool - */ - private $metadataPool; - - /** - * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory - * @param \Psr\Log\LoggerInterface $logger - * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy - * @param \Magento\Framework\Event\ManagerInterface $eventManager - * @param \Magento\Eav\Model\Config $eavConfig - * @param \Magento\Framework\App\ResourceConnection $resource - * @param \Magento\Eav\Model\EntityFactory $eavEntityFactory - * @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper - * @param \Magento\Framework\Validator\UniversalFactory $universalFactory - * @param \Magento\Store\Model\StoreManagerInterface $storeManager - * @param \Magento\Framework\Module\Manager $moduleManager - * @param \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState - * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig - * @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory - * @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrl - * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate - * @param \Magento\Customer\Model\Session $customerSession - * @param \Magento\Framework\Stdlib\DateTime $dateTime - * @param GroupManagementInterface $groupManagement - * @param MetadataPool $metadataPool - * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection - * - * @SuppressWarnings(PHPMD.ExcessiveParameterList) - */ - public function __construct( - \Magento\Framework\Data\Collection\EntityFactory $entityFactory, - \Psr\Log\LoggerInterface $logger, - \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy, - \Magento\Framework\Event\ManagerInterface $eventManager, - \Magento\Eav\Model\Config $eavConfig, - \Magento\Framework\App\ResourceConnection $resource, - \Magento\Eav\Model\EntityFactory $eavEntityFactory, - \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper, - \Magento\Framework\Validator\UniversalFactory $universalFactory, - \Magento\Store\Model\StoreManagerInterface $storeManager, - \Magento\Framework\Module\Manager $moduleManager, - \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState, - \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, - \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory, - \Magento\Catalog\Model\ResourceModel\Url $catalogUrl, - \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, - \Magento\Customer\Model\Session $customerSession, - \Magento\Framework\Stdlib\DateTime $dateTime, - GroupManagementInterface $groupManagement, - MetadataPool $metadataPool, - \Magento\Framework\DB\Adapter\AdapterInterface $connection = null - ) { - $this->metadataPool = $metadataPool; - parent::__construct( - $entityFactory, - $logger, - $fetchStrategy, - $eventManager, - $eavConfig, - $resource, - $eavEntityFactory, - $resourceHelper, - $universalFactory, - $storeManager, - $moduleManager, - $catalogProductFlatState, - $scopeConfig, - $productOptionFactory, - $catalogUrl, - $localeDate, - $customerSession, - $dateTime, - $groupManagement, - $connection - ); - } - /** * Assign link table name * @@ -139,7 +57,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection */ public function setProductFilter($product) { - $metadata = $this->metadataPool->getMetadata(ProductInterface::class); + $metadata = $this->getProductEntityMetadata(); $this->getSelect()->where('link_table.parent_id = ?', $product->getData($metadata->getLinkField())); return $this; diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Initialization/Helper/Plugin/UpdateConfigurationsTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Initialization/Helper/Plugin/UpdateConfigurationsTest.php index def49f42fa960b738fe952be4a2d18bada61ffd2..79d77c66e0d05427c9a89e6fb14cbee7cbc3327e 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Initialization/Helper/Plugin/UpdateConfigurationsTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Controller/Adminhtml/Product/Initialization/Helper/Plugin/UpdateConfigurationsTest.php @@ -13,6 +13,11 @@ use Magento\ConfigurableProduct\Model\Product\VariationHandler; use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper as ProductInitializationHelper; use Magento\Catalog\Model\Product; +/** + * Class UpdateConfigurationsTest + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @package Magento\ConfigurableProduct\Test\Unit\Controller\Adminhtml\Product\Initialization\Helper\Plugin + */ class UpdateConfigurationsTest extends \PHPUnit_Framework_TestCase { /** @@ -69,10 +74,14 @@ class UpdateConfigurationsTest extends \PHPUnit_Framework_TestCase ); } - public function testAfterInitialize() + /** + * Prepare configurable matrix + * + * @return array + */ + private function getConfigurableMatrix() { - $productMock = $this->getProductMock(); - $configurableMatrix = [ + return [ [ 'newProduct' => true, 'id' => 'product1' @@ -109,6 +118,12 @@ class UpdateConfigurationsTest extends \PHPUnit_Framework_TestCase 'weight' => '5.55', ], ]; + } + + public function testAfterInitialize() + { + $productMock = $this->getProductMock(); + $configurableMatrix = $this->getConfigurableMatrix(); $configurations = [ 'product2' => [ 'status' => 'simple2_status', diff --git a/app/code/Magento/Cron/Model/Config/Data.php b/app/code/Magento/Cron/Model/Config/Data.php index d09b830d1b539240dce0e81300bc72b4adf46acc..bcfaef37ece7b70b0ca9afe976ccf196aae179b1 100644 --- a/app/code/Magento/Cron/Model/Config/Data.php +++ b/app/code/Magento/Cron/Model/Config/Data.php @@ -3,29 +3,32 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ +namespace Magento\Cron\Model\Config; + +use Magento\Framework\Serialize\SerializerInterface; /** - * Prepare cron jobs data + * Provides cron configuration */ -namespace Magento\Cron\Model\Config; - class Data extends \Magento\Framework\Config\Data { /** - * Initialize parameters + * Constructor * - * @param \Magento\Cron\Model\Config\Reader\Xml $reader - * @param \Magento\Framework\Config\CacheInterface $cache - * @param \Magento\Cron\Model\Config\Reader\Db $dbReader - * @param string $cacheId + * @param Reader\Xml $reader + * @param \Magento\Framework\Config\CacheInterface $cache + * @param Reader\Db $dbReader + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Cron\Model\Config\Reader\Xml $reader, \Magento\Framework\Config\CacheInterface $cache, \Magento\Cron\Model\Config\Reader\Db $dbReader, - $cacheId = 'crontab_config_cache' + $cacheId = 'crontab_config_cache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); $this->merge($dbReader->get()); } diff --git a/app/code/Magento/Cron/Model/Config/Reader/Db.php b/app/code/Magento/Cron/Model/Config/Reader/Db.php index 1a58c14470038f7d81568cbbdb9c7407683967bd..9602775f18106aaf02ff6f70f0d44e2e8aa4912b 100644 --- a/app/code/Magento/Cron/Model/Config/Reader/Db.php +++ b/app/code/Magento/Cron/Model/Config/Reader/Db.php @@ -5,6 +5,8 @@ */ namespace Magento\Cron\Model\Config\Reader; +use Magento\Framework\App\Config; + /** * Reader for cron parameters from data base storage */ @@ -22,17 +24,22 @@ class Db */ protected $_reader; + /** + * @var Config + */ + private $config; + /** * Initialize parameters * - * @param \Magento\Framework\App\Config\Scope\ReaderInterface $defaultReader + * @param Config $config * @param \Magento\Cron\Model\Config\Converter\Db $converter */ public function __construct( - \Magento\Framework\App\Config\Scope\ReaderInterface $defaultReader, + Config $config, \Magento\Cron\Model\Config\Converter\Db $converter ) { - $this->_reader = $defaultReader; + $this->config = $config; $this->_converter = $converter; } @@ -43,6 +50,6 @@ class Db */ public function get() { - return $this->_converter->convert($this->_reader->read()); + return $this->_converter->convert($this->config->get('system/default')); } } diff --git a/app/code/Magento/Cron/Model/Groups/Config/Data.php b/app/code/Magento/Cron/Model/Groups/Config/Data.php index 29b70b90195bc49e27013d74a3532de44e076cbf..82c35abff22b08bdb3ff29edbd084eebc19a184c 100644 --- a/app/code/Magento/Cron/Model/Groups/Config/Data.php +++ b/app/code/Magento/Cron/Model/Groups/Config/Data.php @@ -3,25 +3,30 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ +namespace Magento\Cron\Model\Groups\Config; + +use Magento\Framework\Serialize\SerializerInterface; /** - * Prepare cron jobs data + * Provides cron groups configuration */ -namespace Magento\Cron\Model\Groups\Config; - class Data extends \Magento\Framework\Config\Data { /** + * Constructor + * * @param \Magento\Cron\Model\Groups\Config\Reader\Xml $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Cron\Model\Groups\Config\Reader\Xml $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'cron_groups_config_cache' + $cacheId = 'cron_groups_config_cache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } /** diff --git a/app/code/Magento/Cron/Test/Unit/Model/Config/DataTest.php b/app/code/Magento/Cron/Test/Unit/Model/Config/DataTest.php index 1803deb002f6d20cec2ebaa83298e549d1f85477..e25fdfe71d2d105f1c956dc4ea3cfe9dac1088f3 100644 --- a/app/code/Magento/Cron/Test/Unit/Model/Config/DataTest.php +++ b/app/code/Magento/Cron/Test/Unit/Model/Config/DataTest.php @@ -30,19 +30,18 @@ class DataTest extends \PHPUnit_Framework_TestCase 'job2' => ['schedule' => '* * * * *', 'instance' => 'JobModel2', 'method' => 'method2'], ]; - $cache->expects( - $this->any() - )->method( - 'load' - )->with( - $this->equalTo('test_cache_id') - )->will( - $this->returnValue(serialize($jobs)) - ); + $cache->expects($this->any()) + ->method('load') + ->with('test_cache_id') + ->willReturn(json_encode($jobs)); $dbReader->expects($this->once())->method('get')->will($this->returnValue($dbReaderData)); - $configData = new \Magento\Cron\Model\Config\Data($reader, $cache, $dbReader, 'test_cache_id'); + $serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); + $serializerMock->method('unserialize') + ->willReturn($jobs); + + $configData = new \Magento\Cron\Model\Config\Data($reader, $cache, $dbReader, 'test_cache_id', $serializerMock); $expected = [ 'job1' => ['schedule' => '* * * * *', 'instance' => 'JobModel1', 'method' => 'method1'], diff --git a/app/code/Magento/Cron/Test/Unit/Model/Config/Reader/DbTest.php b/app/code/Magento/Cron/Test/Unit/Model/Config/Reader/DbTest.php index e93978d9683664f9378be0be1142667cac1dae99..6205c993524e4492912a3b96921b2958d8bcc984 100644 --- a/app/code/Magento/Cron/Test/Unit/Model/Config/Reader/DbTest.php +++ b/app/code/Magento/Cron/Test/Unit/Model/Config/Reader/DbTest.php @@ -5,12 +5,20 @@ */ namespace Magento\Cron\Test\Unit\Model\Config\Reader; +use Magento\Framework\App\Config; +use Magento\GoogleAdwords\Block\Code; + +/** + * Test reading for cron parameters from data base storage + * + * @package Magento\Cron\Test\Unit\Model\Config\Reader + */ class DbTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Store\Model\Config\Reader\DefaultReader|\PHPUnit_Framework_MockObject_MockObject + * @var Config | \PHPUnit_Framework_MockObject_MockObject */ - protected $_defaultReader; + protected $config; /** * @var \Magento\Cron\Model\Config\Converter\Db|\PHPUnit_Framework_MockObject_MockObject @@ -27,11 +35,11 @@ class DbTest extends \PHPUnit_Framework_TestCase */ protected function setUp() { - $this->_defaultReader = $this->getMockBuilder( - \Magento\Store\Model\Config\Reader\DefaultReader::class - )->disableOriginalConstructor()->getMock(); + $this->config = $this->getMockBuilder(Config::class) + ->disableOriginalConstructor() + ->getMock(); $this->_converter = new \Magento\Cron\Model\Config\Converter\Db(); - $this->_reader = new \Magento\Cron\Model\Config\Reader\Db($this->_defaultReader, $this->_converter); + $this->_reader = new \Magento\Cron\Model\Config\Reader\Db($this->config, $this->_converter); } /** @@ -42,7 +50,7 @@ class DbTest extends \PHPUnit_Framework_TestCase $job1 = ['schedule' => ['cron_expr' => '* * * * *']]; $job2 = ['schedule' => ['cron_expr' => '1 1 1 1 1']]; $data = ['crontab' => ['default' => ['jobs' => ['job1' => $job1, 'job2' => $job2]]]]; - $this->_defaultReader->expects($this->once())->method('read')->will($this->returnValue($data)); + $this->config->expects($this->once())->method('get')->with('system/default')->will($this->returnValue($data)); $expected = [ 'default' => [ 'job1' => ['schedule' => $job1['schedule']['cron_expr']], diff --git a/app/code/Magento/Cron/etc/di.xml b/app/code/Magento/Cron/etc/di.xml index 740eff2aed432694f9e4ef836ef799c1ab9eb19a..d5624e96765c58bd699eebc29c14c7fe76037b7a 100644 --- a/app/code/Magento/Cron/etc/di.xml +++ b/app/code/Magento/Cron/etc/di.xml @@ -8,11 +8,6 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Cron\Model\ConfigInterface" type="Magento\Cron\Model\Config" /> <preference for="Magento\Framework\Shell\CommandRendererInterface" type="Magento\Framework\Shell\CommandRenderer" /> - <type name="Magento\Cron\Model\Config\Reader\Db"> - <arguments> - <argument name="defaultReader" xsi:type="object">Magento\Store\Model\Config\Reader\DefaultReader</argument> - </arguments> - </type> <type name="Magento\Config\Model\Config\Structure\Converter"> <plugin name="cron_backend_config_structure_converter_plugin" type="Magento\Cron\Model\Backend\Config\Structure\Converter" /> </type> diff --git a/app/code/Magento/Customer/Model/Address/Config.php b/app/code/Magento/Customer/Model/Address/Config.php index cd76fd253f499ea9a951cee0bd6b27d15016706a..18a043bc019bb26b5732d2dc2f2d5359be96648c 100644 --- a/app/code/Magento/Customer/Model/Address/Config.php +++ b/app/code/Magento/Customer/Model/Address/Config.php @@ -7,12 +7,11 @@ namespace Magento\Customer\Model\Address; use Magento\Framework\Config\Data as ConfigData; use Magento\Framework\DataObject; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Store\Model\ScopeInterface; /** - * Customer address config - * - * @author Magento Core Team <core@magentocommerce.com> + * Customer address configuration */ class Config extends ConfigData { @@ -23,7 +22,7 @@ class Config extends ConfigData const DEFAULT_ADDRESS_FORMAT = 'oneline'; /** - * Customer Address Templates per store + * Customer address templates per store * * @var array */ @@ -37,8 +36,7 @@ class Config extends ConfigData protected $_store = null; /** - * Default types per store - * Using for invalid code + * Default types per store, used for invalid code * * @var array */ @@ -60,12 +58,15 @@ class Config extends ConfigData protected $_scopeConfig; /** - * @param \Magento\Customer\Model\Address\Config\Reader $reader + * Constructor + * + * @param Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Customer\Helper\Address $addressHelper * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Customer\Model\Address\Config\Reader $reader, @@ -73,9 +74,10 @@ class Config extends ConfigData \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Customer\Helper\Address $addressHelper, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, - $cacheId = 'address_format' + $cacheId = 'address_format', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); $this->_storeManager = $storeManager; $this->_addressHelper = $addressHelper; $this->_scopeConfig = $scopeConfig; diff --git a/app/code/Magento/Customer/Model/Customer/NotificationStorage.php b/app/code/Magento/Customer/Model/Customer/NotificationStorage.php index 93cb2e24d40f3fcee1f50409b9d999e33f28e00c..67ee60971d98ac7c2cd089428ad923a4580dfd78 100644 --- a/app/code/Magento/Customer/Model/Customer/NotificationStorage.php +++ b/app/code/Magento/Customer/Model/Customer/NotificationStorage.php @@ -6,6 +6,7 @@ namespace Magento\Customer\Model\Customer; use Magento\Framework\Cache\FrontendInterface; +use Magento\Framework\Serialize\SerializerInterface; class NotificationStorage { @@ -19,6 +20,16 @@ class NotificationStorage /** * @param FrontendInterface $cache */ + + /** + * @var SerializerInterface + */ + private $serializer; + + /** + * NotificationStorage constructor. + * @param FrontendInterface $cache + */ public function __construct(FrontendInterface $cache) { $this->cache = $cache; @@ -34,7 +45,7 @@ class NotificationStorage public function add($notificationType, $customerId) { $this->cache->save( - serialize([ + $this->getSerializer()->serialize([ 'customer_id' => $customerId, 'notification_type' => $notificationType ]), @@ -77,4 +88,19 @@ class NotificationStorage { return 'notification_' . $notificationType . '_' . $customerId; } + + /** + * Get serializer + * + * @return SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/app/code/Magento/Customer/Test/Unit/Model/Address/ConfigTest.php b/app/code/Magento/Customer/Test/Unit/Model/Address/ConfigTest.php index 5c2aeec636cecf90bc4d6abf383dcaef53190c89..2b4a93084c7ac40ec5909d484079245f161c35f3 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/Address/ConfigTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/Address/ConfigTest.php @@ -10,122 +10,110 @@ class ConfigTest extends \PHPUnit_Framework_TestCase /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_readerMock; + protected $addressHelperMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_cacheMock; + protected $storeMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_storeManagerMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_addressHelperMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_storeMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_scopeConfigMock; + protected $scopeConfigMock; /** * @var \Magento\Customer\Model\Address\Config */ - protected $_model; - - /** - * @var string - */ - protected $_cacheId = 'cache_id'; + protected $model; protected function setUp() { - $this->_storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false); - $this->_scopeConfigMock = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class); + $cacheId = 'cache_id'; + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false); + $this->scopeConfigMock = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class); - $this->_readerMock = $this->getMock( + $readerMock = $this->getMock( \Magento\Customer\Model\Address\Config\Reader::class, [], [], '', false ); - $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); - $this->_storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManager::class, [], [], '', false); - $this->_storeManagerMock->expects( + $cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManager::class, [], [], '', false); + $storeManagerMock->expects( $this->once() )->method( 'getStore' )->will( - $this->returnValue($this->_storeMock) + $this->returnValue($this->storeMock) ); - $this->_addressHelperMock = $this->getMock(\Magento\Customer\Helper\Address::class, [], [], '', false); + $this->addressHelperMock = $this->getMock(\Magento\Customer\Helper\Address::class, [], [], '', false); - $this->_cacheMock->expects( + $cacheMock->expects( $this->once() )->method( 'load' )->with( - $this->_cacheId + $cacheId )->will( $this->returnValue(false) ); $fixtureConfigData = require __DIR__ . '/Config/_files/formats_merged.php'; - $this->_readerMock->expects($this->once())->method('read')->will($this->returnValue($fixtureConfigData)); - - $this->_cacheMock->expects( - $this->once() - )->method( - 'save' - )->with( - serialize($fixtureConfigData), - $this->_cacheId - ); - - $this->_model = new \Magento\Customer\Model\Address\Config( - $this->_readerMock, - $this->_cacheMock, - $this->_storeManagerMock, - $this->_addressHelperMock, - $this->_scopeConfigMock, - $this->_cacheId + $readerMock->expects($this->once())->method('read')->will($this->returnValue($fixtureConfigData)); + + $cacheMock->expects($this->once()) + ->method('save') + ->with( + json_encode($fixtureConfigData), + $cacheId + ); + + $serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); + $serializerMock->method('serialize') + ->willReturn(json_encode($fixtureConfigData)); + $serializerMock->method('unserialize') + ->willReturn($fixtureConfigData); + + $this->model = $objectManagerHelper->getObject( + \Magento\Customer\Model\Address\Config::class, + [ + 'reader' => $readerMock, + 'cache' => $cacheMock, + 'storeManager' => $storeManagerMock, + 'scopeConfig' => $this->scopeConfigMock, + 'cacheId' => $cacheId, + 'serializer' => $serializerMock, + 'addressHelper' => $this->addressHelperMock, + ] ); } public function testGetStore() { - $this->assertEquals($this->_storeMock, $this->_model->getStore()); + $this->assertEquals($this->storeMock, $this->model->getStore()); } public function testSetStore() { - $this->_model->setStore($this->_storeMock); - - //no call to $_storeManagerMock's method - $this->assertEquals($this->_storeMock, $this->_model->getStore()); + $this->model->setStore($this->storeMock); + $this->assertEquals($this->storeMock, $this->model->getStore()); } public function testGetFormats() { - $this->_storeMock->expects($this->once())->method('getId'); + $this->storeMock->expects($this->once())->method('getId'); - $this->_scopeConfigMock->expects($this->any())->method('getValue')->will($this->returnValue('someValue')); + $this->scopeConfigMock->expects($this->any())->method('getValue')->will($this->returnValue('someValue')); $rendererMock = $this->getMock(\Magento\Framework\DataObject::class); - $this->_addressHelperMock->expects( + $this->addressHelperMock->expects( $this->any() )->method( 'getRenderer' @@ -160,6 +148,6 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ); $expectedResult = [$firstExpected, $secondExpected]; - $this->assertEquals($expectedResult, $this->_model->getFormats()); + $this->assertEquals($expectedResult, $this->model->getFormats()); } } diff --git a/app/code/Magento/Customer/Test/Unit/Model/Customer/NotificationStorageTest.php b/app/code/Magento/Customer/Test/Unit/Model/Customer/NotificationStorageTest.php index 0d2b32f747a80a1f564755a21f47771b5673d27f..644d0a2d7012227ae6a30cfd2e7b3b9ceb8dbd9d 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/Customer/NotificationStorageTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/Customer/NotificationStorageTest.php @@ -7,81 +7,87 @@ namespace Magento\Customer\Test\Unit\Model\Customer; use Magento\Customer\Model\Customer\NotificationStorage; -/** - * Class NotificationStorageTest - * - * Test for class \Magento\Customer\Model\Customer\NotificationStorage - */ class NotificationStorageTest extends \PHPUnit_Framework_TestCase { /** - * @var NotificationStorage|\PHPUnit_Framework_MockObject_MockObject + * @var NotificationStorage */ - protected $model; + private $notificationStorage; /** * @var \Magento\Framework\Cache\FrontendInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cache; + private $cacheMock; /** - * Set up - * - * @return void + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $serializerMock; + protected function setUp() { - $this->cache = $this->getMockBuilder(\Magento\Framework\Cache\FrontendInterface::class) - ->getMockForAbstractClass(); - $this->model = new NotificationStorage($this->cache); + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->cacheMock = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class); + $this->notificationStorage = $objectManager->getObject( + NotificationStorage::class, + ['cache' => $this->cacheMock] + ); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); + $objectManager->setBackwardCompatibleProperty($this->notificationStorage, 'serializer', $this->serializerMock); } public function testAdd() { $customerId = 1; $notificationType = 'some_type'; - $this->cache->expects($this->once()) + $data = [ + 'customer_id' => $customerId, + 'notification_type' => $notificationType + ]; + $serializedData = 'serialized data'; + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($data) + ->willReturn($serializedData); + $this->cacheMock->expects($this->once()) ->method('save') ->with( - serialize([ - 'customer_id' => $customerId, - 'notification_type' => $notificationType - ]), + $serializedData, $this->getCacheKey($notificationType, $customerId) ); - $this->model->add($notificationType, $customerId); + $this->notificationStorage->add($notificationType, $customerId); } public function testIsExists() { $customerId = 1; $notificationType = 'some_type'; - $this->cache->expects($this->once()) + $this->cacheMock->expects($this->once()) ->method('test') ->with($this->getCacheKey($notificationType, $customerId)) ->willReturn(true); - $this->assertTrue($this->model->isExists($notificationType, $customerId)); + $this->assertTrue($this->notificationStorage->isExists($notificationType, $customerId)); } public function testRemove() { $customerId = 1; $notificationType = 'some_type'; - $this->cache->expects($this->once()) + $this->cacheMock->expects($this->once()) ->method('remove') ->with($this->getCacheKey($notificationType, $customerId)); - $this->model->remove($notificationType, $customerId); + $this->notificationStorage->remove($notificationType, $customerId); } /** - * Retrieve cache key + * Get cache key * * @param string $notificationType * @param string $customerId * @return string */ - protected function getCacheKey($notificationType, $customerId) + private function getCacheKey($notificationType, $customerId) { return 'notification_' . $notificationType . '_' . $customerId; } diff --git a/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php b/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php new file mode 100644 index 0000000000000000000000000000000000000000..b4e4fef8fb2f941eaa56cc33b2df65f783fa0413 --- /dev/null +++ b/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php @@ -0,0 +1,83 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Deploy\Console\Command\App; + +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Framework\App\DeploymentConfig\Writer; +use Magento\Framework\Config\File\ConfigFilePool; +use Magento\Framework\Console\Cli; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Command for dump application state + */ +class ApplicationDumpCommand extends Command +{ + /** + * @var Writer + */ + private $writer; + + /** + * @var SourceInterface[] + */ + private $sources; + + /** + * ApplicationDumpCommand constructor. + * + * @param Writer $writer + * @param array $sources + */ + public function __construct( + Writer $writer, + array $sources + ) { + parent::__construct(); + $this->writer = $writer; + $this->sources = $sources; + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this->setName('app:config:dump'); + $this->setDescription('Create dump of application'); + parent::configure(); + } + + /** + * Dump Application + * + * @param InputInterface $input + * @param OutputInterface $output + * @return boolean + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $dump = []; + foreach ($this->sources as $sourceData) { + /** @var SourceInterface $source */ + $source = $sourceData['source']; + $namespace = $sourceData['namespace']; + $dump[$namespace] = $source->get(); + } + + $this->writer + ->saveConfig( + [ConfigFilePool::APP_CONFIG => $dump], + true, + ConfigFilePool::LOCAL + ); + $output->writeln('<info>Done.</info>'); + return Cli::RETURN_SUCCESS; + } +} diff --git a/app/code/Magento/Deploy/Model/Deploy/LocaleDeploy.php b/app/code/Magento/Deploy/Model/Deploy/LocaleDeploy.php index aa112a700133185cf06980fb6b465de509630371..c879a512d26c29c99c0152eda2e7fab148422fd8 100644 --- a/app/code/Magento/Deploy/Model/Deploy/LocaleDeploy.php +++ b/app/code/Magento/Deploy/Model/Deploy/LocaleDeploy.php @@ -6,11 +6,13 @@ namespace Magento\Deploy\Model\Deploy; +use Magento\Framework\App\ObjectManager; use Magento\Framework\App\Utility\Files; use Magento\Framework\App\View\Asset\Publisher; use Magento\Framework\View\Asset\ContentProcessorException; use Magento\Framework\View\Asset\PreProcessor\AlternativeSourceInterface; use Magento\Framework\View\Design\Theme\ThemeProviderInterface; +use Magento\Framework\View\Design\Theme\ListInterface; use Symfony\Component\Console\Output\OutputInterface; use Magento\Framework\Config\Theme; use Magento\Deploy\Console\Command\DeployStaticOptionsInterface as Options; @@ -20,6 +22,8 @@ use Psr\Log\LoggerInterface; use Magento\Framework\Console\Cli; /** + * Class which allows deploy by locales + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.TooManyFields) */ @@ -115,6 +119,11 @@ class LocaleDeploy implements DeployInterface */ private $alternativeSources; + /** + * @var ListInterface + */ + private $themeList; + /** * @var array */ @@ -242,7 +251,10 @@ class LocaleDeploy implements DeployInterface private function deployRequireJsConfig($area, $themePath) { if (!$this->getOption(Options::DRY_RUN) && !$this->getOption(Options::NO_JAVASCRIPT)) { - $design = $this->designFactory->create()->setDesignTheme($themePath, $area); + + /** @var \Magento\Framework\View\Design\ThemeInterface $theme */ + $theme = $this->getThemeList()->getThemeByFullPath($area . '/' . $themePath); + $design = $this->designFactory->create()->setDesignTheme($theme, $area); $assetRepo = $this->assetRepoFactory->create(['design' => $design]); /** @var \Magento\RequireJs\Model\FileManager $fileManager */ $fileManager = $this->fileManagerFactory->create( @@ -450,4 +462,16 @@ class LocaleDeploy implements DeployInterface } return $ancestorThemeFullPath; } + + /** + * @deprecated + * @return ListInterface + */ + private function getThemeList() + { + if ($this->themeList === null) { + $this->themeList = ObjectManager::getInstance()->get(ListInterface::class); + } + return $this->themeList; + } } diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php b/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..686cf19d8f3113371339c29187c51ceae3cbf313 --- /dev/null +++ b/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php @@ -0,0 +1,91 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Deploy\Test\Unit\Console\Command; + +use Magento\Deploy\Console\Command\App\ApplicationDumpCommand; +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Framework\App\DeploymentConfig\Writer; +use Magento\Framework\Config\File\ConfigFilePool; +use Magento\Framework\Console\Cli; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Test command for dump application state + */ +class ApplicationDumpCommandTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var InputInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $input; + + /** + * @var OutputInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $output; + + /** + * @var Writer|\PHPUnit_Framework_MockObject_MockObject + */ + private $writer; + + /** + * @var SourceInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $source; + + /** + * @var ApplicationDumpCommand + */ + private $command; + + public function setUp() + { + $this->input = $this->getMockBuilder(InputInterface::class) + ->getMockForAbstractClass(); + $this->output = $this->getMockBuilder(OutputInterface::class) + ->getMockForAbstractClass(); + $this->writer = $this->getMockBuilder(Writer::class) + ->disableOriginalConstructor() + ->getMock(); + $this->source = $this->getMockBuilder(SourceInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->command = new ApplicationDumpCommand($this->writer, [[ + 'namespace' => 'system', + 'source' => $this->source + ]]); + } + + public function testExport() + { + $dump = [ + 'system' => ['systemDATA'] + ]; + $data = [ConfigFilePool::APP_CONFIG => $dump]; + $this->source + ->expects($this->once()) + ->method('get') + ->willReturn(['systemDATA']); + $this->output->expects($this->once()) + ->method('writeln') + ->with('<info>Done.</info>'); + $this->writer->expects($this->once()) + ->method('saveConfig') + ->with($data); + $method = new \ReflectionMethod(ApplicationDumpCommand::class, 'execute'); + $method->setAccessible(true); + $this->assertEquals( + Cli::RETURN_SUCCESS, + $method->invokeArgs( + $this->command, + [$this->input, $this->output] + ) + ); + } +} diff --git a/app/code/Magento/Deploy/Test/Unit/Model/Deploy/LocaleDeployTest.php b/app/code/Magento/Deploy/Test/Unit/Model/Deploy/LocaleDeployTest.php index 757da133ddbc3df30eac5a590c1c8dbf00fd002a..f43c8f111146c500fd824c67f3b128a5b6110574 100644 --- a/app/code/Magento/Deploy/Test/Unit/Model/Deploy/LocaleDeployTest.php +++ b/app/code/Magento/Deploy/Test/Unit/Model/Deploy/LocaleDeployTest.php @@ -5,210 +5,134 @@ */ namespace Magento\Deploy\Test\Unit\Model\Deploy; +use Magento\Deploy\Model\Deploy\LocaleDeploy; use Magento\Framework\App\Utility\Files; use Magento\Framework\App\View\Asset\Publisher; use Magento\Framework\Translate\Js\Config; use Magento\Framework\View\Asset\Minification; use Magento\Framework\View\Asset\Repository; use Magento\Framework\View\Asset\RepositoryFactory; +use Magento\RequireJs\Model\FileManagerFactory; +use Magento\Framework\RequireJs\ConfigFactory; +use Magento\Framework\View\Asset\Bundle\Manager; +use Magento\Framework\View\Design\Theme\ThemeProviderInterface; +use Magento\Framework\View\DesignInterfaceFactory; +use Magento\Framework\Locale\ResolverInterface; +use Magento\Framework\View\Design\Theme\ListInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Output\OutputInterface; /** + * Test class which allows deploy by locales * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class LocaleDeployTest extends \PHPUnit_Framework_TestCase { /** - * @var \PHPUnit_Framework_MockObject_MockObject|Config + * @var string */ - private $jsTranslationMock; + private $area; /** - * @var \PHPUnit_Framework_MockObject_MockObject|Minification + * @var string */ - private $minificationMock; + private $locale; /** - * @var \PHPUnit_Framework_MockObject_MockObject|RepositoryFactory + * @var string */ - private $assetRepoFactoryMock; + private $themePath; /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\RequireJs\Model\FileManagerFactory + * @var \Magento\Deploy\Model\Deploy\LocaleDeploy */ - private $fileManagerFactoryMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\RequireJs\ConfigFactory - */ - private $configFactoryMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\View\Asset\Bundle\Manager - */ - private $bundleManagerMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|Files - */ - private $filesUtilMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\View\DesignInterfaceFactory - */ - private $designFactoryMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Locale\ResolverInterface - */ - private $localeResolverMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|OutputInterface - */ - private $outputMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|LoggerInterface - */ - private $loggerMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - private $assetRepoMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - private $assetPublisherMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - private $themeProviderMock; + private $model; protected function setUp() { - $this->outputMock = $this->getMock(OutputInterface::class, [], [], '', false); - $this->loggerMock = $this->getMock(LoggerInterface::class, [], [], '', false); - $this->filesUtilMock = $this->getMock(Files::class, [], [], '', false); - $this->assetRepoMock = $this->getMock(Repository::class, [], [], '', false); - $this->minificationMock = $this->getMock(Minification::class, [], [], '', false); - $this->jsTranslationMock = $this->getMock(Config::class, [], [], '', false); - $this->assetPublisherMock = $this->getMock(Publisher::class, [], [], '', false); - $this->assetRepoFactoryMock = $this->getMock( - RepositoryFactory::class, - ['create'], - [], - '', - false - ); - $this->fileManagerFactoryMock = $this->getMock( - \Magento\RequireJs\Model\FileManagerFactory::class, - ['create'], - [], - '', - false - ); - $this->configFactoryMock = $this->getMock( - \Magento\Framework\RequireJs\ConfigFactory::class, - ['create'], - [], - '', - false - ); - $this->bundleManagerMock = $this->getMock( - \Magento\Framework\View\Asset\Bundle\Manager::class, - [], - [], - '', - false - ); - $this->themeProviderMock = $this->getMock( - \Magento\Framework\View\Design\Theme\ThemeProviderInterface::class, - [], - [], - '', - false - ); - $this->designFactoryMock = $this->getMock( - \Magento\Framework\View\DesignInterfaceFactory::class, - ['create'], - [], - '', - false - ); - $this->localeResolverMock = $this->getMock( - \Magento\Framework\Locale\ResolverInterface::class, - [], - [], - '', - false - ); - } - - public function testDeploy() - { - $area = 'adminhtml'; - $themePath = '/theme/path'; - $locale = 'en_US'; - + $this->area = 'adminhtml'; + $this->themePath = '/theme/path'; + $this->locale = 'en_US'; + + $outputMock = $this->getMock(OutputInterface::class, [], [], '', false); + $jsTranslationMock = $this->getMock(Config::class, [], [], '', false); + $jsTranslationMock->expects($this->once())->method('dictionaryEnabled')->willReturn(false); + $minificationMock = $this->getMock(Minification::class, [], [], '', false); + $minificationMock->expects($this->once())->method('isEnabled')->with('js')->willReturn(true); + + $themeMock = $this->getMockBuilder(\Magento\Framework\View\Design\ThemeInterface::class) + ->disableOriginalConstructor() + ->getMock(); $designMock = $this->getMock(\Magento\Framework\View\DesignInterface::class, [], [], '', false); + $designMock->expects($this->once())->method('setDesignTheme')->with($themeMock, $this->area)->willReturnSelf(); $assetRepoMock = $this->getMock(Repository::class, [], [], '', false); - $requireJsConfigMock = $this->getMock(\Magento\Framework\RequireJs\Config::class, [], [], '', false); - $fileManagerMock = $this->getMock(\Magento\RequireJs\Model\FileManager::class, [], [], '', false); - - $model = $this->getModel([\Magento\Deploy\Console\Command\DeployStaticOptionsInterface::NO_JAVASCRIPT => 0]); - - $this->localeResolverMock->expects($this->once())->method('setLocale')->with($locale); - $this->designFactoryMock->expects($this->once())->method('create')->willReturn($designMock); - $designMock->expects($this->once())->method('setDesignTheme')->with($themePath, $area)->willReturnSelf(); - $this->assetRepoFactoryMock->expects($this->once())->method('create')->with(['design' => $designMock]) + $assetRepoFactoryMock = $this->getMock(RepositoryFactory::class, ['create'], [], '', false); + $assetRepoFactoryMock->expects($this->once()) + ->method('create') + ->with(['design' => $designMock]) ->willReturn($assetRepoMock); - $this->configFactoryMock->expects($this->once())->method('create')->willReturn($requireJsConfigMock); - $this->fileManagerFactoryMock->expects($this->once())->method('create')->willReturn($fileManagerMock); + $fileManagerMock = $this->getMock(\Magento\RequireJs\Model\FileManager::class, [], [], '', false); $fileManagerMock->expects($this->once())->method('createRequireJsConfigAsset')->willReturnSelf(); - $this->filesUtilMock->expects($this->once())->method('getStaticPreProcessingFiles')->willReturn([]); - $this->filesUtilMock->expects($this->once())->method('getStaticLibraryFiles')->willReturn([]); - - $this->jsTranslationMock->expects($this->once())->method('dictionaryEnabled')->willReturn(false); - $this->minificationMock->expects($this->once())->method('isEnabled')->with('js')->willReturn(true); $fileManagerMock->expects($this->once())->method('createMinResolverAsset')->willReturnSelf(); + $fileManagerFactoryMock = $this->getMock(FileManagerFactory::class, ['create'], [], '', false); + $fileManagerFactoryMock->expects($this->once())->method('create')->willReturn($fileManagerMock); - $this->bundleManagerMock->expects($this->once())->method('flush'); - - $this->assertEquals( - \Magento\Framework\Console\Cli::RETURN_SUCCESS, - $model->deploy($area, $themePath, $locale) + $requireJsConfigMock = $this->getMock(\Magento\Framework\RequireJs\Config::class, [], [], '', false); + $configFactoryMock = $this->getMock(ConfigFactory::class, ['create'], [], '', false); + $configFactoryMock->expects($this->once())->method('create')->willReturn($requireJsConfigMock); + + $assetPublisherMock = $this->getMock(Publisher::class, [], [], '', false); + + $bundleManagerMock = $this->getMock(Manager::class, [], [], '', false); + $bundleManagerMock->expects($this->once())->method('flush'); + + $themeProviderMock = $this->getMock(ThemeProviderInterface::class, [], [], '', false); + $loggerMock = $this->getMock(LoggerInterface::class, [], [], '', false); + + $filesUtilMock = $this->getMock(Files::class, [], [], '', false); + $filesUtilMock->expects($this->once())->method('getStaticPreProcessingFiles')->willReturn([]); + $filesUtilMock->expects($this->once())->method('getStaticLibraryFiles')->willReturn([]); + + $designFactoryMock = $this->getMock(DesignInterfaceFactory::class, ['create'], [], '', false); + $designFactoryMock->expects($this->once())->method('create')->willReturn($designMock); + + $localeResolverMock = $this->getMock(ResolverInterface::class, [], [], '', false); + $localeResolverMock->expects($this->once())->method('setLocale')->with($this->locale); + + $themeList = $this->getMock(ListInterface::class, [], [], '', false); + $themeList->expects($this->once())->method('getThemeByFullPath') + ->with($this->area . '/' . $this->themePath) + ->willReturn($themeMock); + + $this->model = new LocaleDeploy( + $outputMock, + $jsTranslationMock, + $minificationMock, + $assetRepoMock, + $assetRepoFactoryMock, + $fileManagerFactoryMock, + $configFactoryMock, + $assetPublisherMock, + $bundleManagerMock, + $themeProviderMock, + $loggerMock, + $filesUtilMock, + $designFactoryMock, + $localeResolverMock, + [], + [\Magento\Deploy\Console\Command\DeployStaticOptionsInterface::NO_JAVASCRIPT => 0] ); + $property = new \ReflectionProperty(get_class($this->model), 'themeList'); + $property->setAccessible(true); + $property->setValue($this->model, $themeList); } - /** - * @param array $options - * @return \Magento\Deploy\Model\Deploy\LocaleDeploy - */ - private function getModel($options = []) + public function testDeploy() { - return new \Magento\Deploy\Model\Deploy\LocaleDeploy( - $this->outputMock, - $this->jsTranslationMock, - $this->minificationMock, - $this->assetRepoMock, - $this->assetRepoFactoryMock, - $this->fileManagerFactoryMock, - $this->configFactoryMock, - $this->assetPublisherMock, - $this->bundleManagerMock, - $this->themeProviderMock, - $this->loggerMock, - $this->filesUtilMock, - $this->designFactoryMock, - $this->localeResolverMock, - [], - $options + $this->assertEquals( + \Magento\Framework\Console\Cli::RETURN_SUCCESS, + $this->model->deploy($this->area, $this->themePath, $this->locale) ); } } diff --git a/app/code/Magento/Deploy/etc/di.xml b/app/code/Magento/Deploy/etc/di.xml index 52c880c28d0a71ad7eaeb34b6c2096c6c7b5060a..f230238364ab788907753388d9594e2eece7c97d 100644 --- a/app/code/Magento/Deploy/etc/di.xml +++ b/app/code/Magento/Deploy/etc/di.xml @@ -23,9 +23,9 @@ <type name="Magento\Framework\Console\CommandListInterface"> <arguments> <argument name="commands" xsi:type="array"> - <item name="staticContentDeployCommand" xsi:type="object">Magento\Deploy\Console\Command\DeployStaticContentCommand</item> <item name="setModeCommand" xsi:type="object">Magento\Deploy\Console\Command\SetModeCommand</item> <item name="showModeCommand" xsi:type="object">Magento\Deploy\Console\Command\ShowModeCommand</item> + <item name="dumpApplicationCommand" xsi:type="object">\Magento\Deploy\Console\Command\App\ApplicationDumpCommand</item> </argument> </arguments> </type> diff --git a/app/code/Magento/Directory/Block/Data.php b/app/code/Magento/Directory/Block/Data.php index 627e34d9ff40455e277b5813319837f764cd937b..3c8b682d1a1e8ad1dd066bd5300373f5a05c8859 100644 --- a/app/code/Magento/Directory/Block/Data.php +++ b/app/code/Magento/Directory/Block/Data.php @@ -5,6 +5,9 @@ */ namespace Magento\Directory\Block; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class Data extends \Magento\Framework\View\Element\Template { /** @@ -32,6 +35,11 @@ class Data extends \Magento\Framework\View\Element\Template */ protected $directoryHelper; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\View\Element\Template\Context $context * @param \Magento\Directory\Helper\Data $directoryHelper @@ -110,12 +118,12 @@ class Data extends \Magento\Framework\View\Element\Template $cacheKey = 'DIRECTORY_COUNTRY_SELECT_STORE_' . $this->_storeManager->getStore()->getCode(); $cache = $this->_configCacheType->load($cacheKey); if ($cache) { - $options = unserialize($cache); + $options = $this->getSerializer()->unserialize($cache); } else { $options = $this->getCountryCollection() ->setForegroundCountries($this->getTopDestinations()) ->toOptionArray(); - $this->_configCacheType->save(serialize($options), $cacheKey); + $this->_configCacheType->save($this->getSerializer()->serialize($options), $cacheKey); } $html = $this->getLayout()->createBlock( \Magento\Framework\View\Element\Html\Select::class @@ -160,10 +168,10 @@ class Data extends \Magento\Framework\View\Element\Template $cacheKey = 'DIRECTORY_REGION_SELECT_STORE' . $this->_storeManager->getStore()->getId(); $cache = $this->_configCacheType->load($cacheKey); if ($cache) { - $options = unserialize($cache); + $options = $this->getSerializer()->unserialize($cache); } else { $options = $this->getRegionCollection()->toOptionArray(); - $this->_configCacheType->save(serialize($options), $cacheKey); + $this->_configCacheType->save($this->getSerializer()->serialize($options), $cacheKey); } $html = $this->getLayout()->createBlock( \Magento\Framework\View\Element\Html\Select::class @@ -224,4 +232,19 @@ class Data extends \Magento\Framework\View\Element\Template \Magento\Framework\Profiler::stop('TEST: ' . __METHOD__); return $regionsJs; } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Serialize\SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/app/code/Magento/Directory/Model/Country/Postcode/Config/Data.php b/app/code/Magento/Directory/Model/Country/Postcode/Config/Data.php index 879eccd9879193691809706008a3b1dee922d54f..c24da536e779c1b6f6e78716be2dc6e253a6057d 100644 --- a/app/code/Magento/Directory/Model/Country/Postcode/Config/Data.php +++ b/app/code/Magento/Directory/Model/Country/Postcode/Config/Data.php @@ -5,16 +5,27 @@ */ namespace Magento\Directory\Model\Country\Postcode\Config; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides country postcodes configuration + */ class Data extends \Magento\Framework\Config\Data { /** - * @param \Magento\Directory\Model\Country\Postcode\Config\Reader $reader + * Constructor + * + * @param Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Directory\Model\Country\Postcode\Config\Reader $reader, - \Magento\Framework\Config\CacheInterface $cache + \Magento\Framework\Config\CacheInterface $cache, + $cacheId = 'country_postcodes', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, 'country_postcodes'); + parent::__construct($reader, $cache, $cacheId, $serializer); } } diff --git a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php index 165a369b119b9b9d9ebb0fff9fcb69069ce34924..8bad1c1efee375eabe08ebe0e94b4bfc86ee4fad 100644 --- a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php +++ b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php @@ -9,10 +9,9 @@ use Magento\Directory\Block\Data; use Magento\Directory\Helper\Data as HelperData; use Magento\Directory\Model\ResourceModel\Country\Collection as CountryCollection; use Magento\Directory\Model\ResourceModel\Country\CollectionFactory as CountryCollectionFactory; -use Magento\Directory\Model\ResourceModel\Region\CollectionFactory as RegionCollectionFactory; use Magento\Framework\App\Cache\Type\Config; use Magento\Framework\App\Config\ScopeConfigInterface; -use Magento\Framework\Json\EncoderInterface; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Framework\View\Element\Template\Context; use Magento\Framework\View\LayoutInterface; use Magento\Store\Model\ScopeInterface; @@ -25,117 +24,114 @@ use Magento\Store\Model\StoreManagerInterface; class DataTest extends \PHPUnit_Framework_TestCase { /** @var Data */ - protected $model; + private $block; /** @var Context |\PHPUnit_Framework_MockObject_MockObject */ - protected $context; + private $contextMock; /** @var HelperData |\PHPUnit_Framework_MockObject_MockObject */ - protected $helperData; - - /** @var EncoderInterface |\PHPUnit_Framework_MockObject_MockObject */ - protected $jsonEncoder; + private $helperDataMock; /** @var Config |\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheTypeConfig; - - /** @var RegionCollectionFactory |\PHPUnit_Framework_MockObject_MockObject */ - protected $regionCollectionFactory; + private $cacheTypeConfigMock; /** @var CountryCollectionFactory |\PHPUnit_Framework_MockObject_MockObject */ - protected $countryCollectionFactory; + private $countryCollectionFactoryMock; /** @var ScopeConfigInterface |\PHPUnit_Framework_MockObject_MockObject */ - protected $scopeConfig; + private $scopeConfigMock; /** @var StoreManagerInterface |\PHPUnit_Framework_MockObject_MockObject */ - protected $storeManager; + private $storeManagerMock; /** @var Store |\PHPUnit_Framework_MockObject_MockObject */ - protected $store; + private $storeMock; /** @var CountryCollection |\PHPUnit_Framework_MockObject_MockObject */ - protected $countryCollection; + private $countryCollectionMock; /** @var LayoutInterface |\PHPUnit_Framework_MockObject_MockObject */ - protected $layout; + private $layoutMock; + + /** @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $serializerMock; protected function setUp() { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->prepareContext(); - $this->helperData = $this->getMockBuilder(\Magento\Directory\Helper\Data::class) + $this->helperDataMock = $this->getMockBuilder(\Magento\Directory\Helper\Data::class) ->disableOriginalConstructor() ->getMock(); - $this->jsonEncoder = $this->getMockBuilder(\Magento\Framework\Json\EncoderInterface::class) - ->getMockForAbstractClass(); - - $this->cacheTypeConfig = $this->getMockBuilder(\Magento\Framework\App\Cache\Type\Config::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->regionCollectionFactory = $this->getMockBuilder( - \Magento\Directory\Model\ResourceModel\Region\CollectionFactory::class - ) + $this->cacheTypeConfigMock = $this->getMockBuilder(\Magento\Framework\App\Cache\Type\Config::class) ->disableOriginalConstructor() ->getMock(); $this->prepareCountryCollection(); - $this->model = new Data( - $this->context, - $this->helperData, - $this->jsonEncoder, - $this->cacheTypeConfig, - $this->regionCollectionFactory, - $this->countryCollectionFactory + $this->block = $objectManagerHelper->getObject( + Data::class, + [ + 'context' => $this->contextMock, + 'directoryHelper' => $this->helperDataMock, + 'configCacheType' => $this->cacheTypeConfigMock, + 'countryCollectionFactory' => $this->countryCollectionFactoryMock + ] + ); + + $this->serializerMock = $this->getMock(SerializerInterface::class, [], [], '', false); + $objectManagerHelper->setBackwardCompatibleProperty( + $this->block, + 'serializer', + $this->serializerMock ); } protected function prepareContext() { - $this->store = $this->getMockBuilder(\Magento\Store\Model\Store::class) + $this->storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class) ->disableOriginalConstructor() ->getMock(); - $this->scopeConfig = $this->getMockBuilder(\Magento\Framework\App\Config\ScopeConfigInterface::class) + $this->scopeConfigMock = $this->getMockBuilder(\Magento\Framework\App\Config\ScopeConfigInterface::class) ->getMockForAbstractClass(); - $this->storeManager = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class) + $this->storeManagerMock = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class) ->getMockForAbstractClass(); - $this->storeManager->expects($this->any()) + $this->storeManagerMock->expects($this->any()) ->method('getStore') - ->willReturn($this->store); + ->willReturn($this->storeMock); - $this->layout = $this->getMockBuilder(\Magento\Framework\View\LayoutInterface::class) + $this->layoutMock = $this->getMockBuilder(\Magento\Framework\View\LayoutInterface::class) ->getMockForAbstractClass(); - $this->context = $this->getMockBuilder(\Magento\Framework\View\Element\Template\Context::class) + $this->contextMock = $this->getMockBuilder(\Magento\Framework\View\Element\Template\Context::class) ->disableOriginalConstructor() ->getMock(); - $this->context->expects($this->any()) + $this->contextMock->expects($this->any()) ->method('getScopeConfig') - ->willReturn($this->scopeConfig); + ->willReturn($this->scopeConfigMock); - $this->context->expects($this->any()) + $this->contextMock->expects($this->any()) ->method('getStoreManager') - ->willReturn($this->storeManager); + ->willReturn($this->storeManagerMock); - $this->context->expects($this->any()) + $this->contextMock->expects($this->any()) ->method('getLayout') - ->willReturn($this->layout); + ->willReturn($this->layoutMock); } protected function prepareCountryCollection() { - $this->countryCollection = $this->getMockBuilder( + $this->countryCollectionMock = $this->getMockBuilder( \Magento\Directory\Model\ResourceModel\Country\Collection::class )->disableOriginalConstructor()->getMock(); - $this->countryCollectionFactory = $this->getMockBuilder( + $this->countryCollectionFactoryMock = $this->getMockBuilder( \Magento\Directory\Model\ResourceModel\Country\CollectionFactory::class ) ->disableOriginalConstructor() @@ -144,9 +140,9 @@ class DataTest extends \PHPUnit_Framework_TestCase ]) ->getMock(); - $this->countryCollectionFactory->expects($this->any()) + $this->countryCollectionFactoryMock->expects($this->any()) ->method('create') - ->willReturn($this->countryCollection); + ->willReturn($this->countryCollectionMock); } /** @@ -166,46 +162,50 @@ class DataTest extends \PHPUnit_Framework_TestCase $options, $resultHtml ) { - $this->helperData->expects($this->once()) + $this->helperDataMock->expects($this->once()) ->method('getDefaultCountry') ->willReturn($defaultCountry); - $this->store->expects($this->once()) + $this->storeMock->expects($this->once()) ->method('getCode') ->willReturn($storeCode); - $this->cacheTypeConfig->expects($this->once()) + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->willReturn('serializedData'); + + $this->cacheTypeConfigMock->expects($this->once()) ->method('load') ->with('DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode) ->willReturn(false); - $this->cacheTypeConfig->expects($this->once()) + $this->cacheTypeConfigMock->expects($this->once()) ->method('save') - ->with(serialize($options), 'DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode) + ->with('serializedData', 'DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode) ->willReturnSelf(); - $this->scopeConfig->expects($this->once()) + $this->scopeConfigMock->expects($this->once()) ->method('getValue') ->with('general/country/destinations', ScopeInterface::SCOPE_STORE) ->willReturn($destinations); - $this->countryCollection->expects($this->once()) + $this->countryCollectionMock->expects($this->once()) ->method('loadByStore') ->willReturnSelf(); - $this->countryCollection->expects($this->any()) + $this->countryCollectionMock->expects($this->any()) ->method('setForegroundCountries') ->with($expectedDestinations) ->willReturnSelf(); - $this->countryCollection->expects($this->once()) + $this->countryCollectionMock->expects($this->once()) ->method('toOptionArray') ->willReturn($options); $elementHtmlSelect = $this->mockElementHtmlSelect($defaultCountry, $options, $resultHtml); - $this->layout->expects($this->once()) + $this->layoutMock->expects($this->once()) ->method('createBlock') ->willReturn($elementHtmlSelect); - $this->assertEquals($resultHtml, $this->model->getCountryHtmlSelect()); + $this->assertEquals($resultHtml, $this->block->getCountryHtmlSelect()); } /** diff --git a/app/code/Magento/Directory/Test/Unit/Model/Country/Postcode/Config/DataTest.php b/app/code/Magento/Directory/Test/Unit/Model/Country/Postcode/Config/DataTest.php index c4681d88d28e73dba119810e1e29ca0133dc2fbb..57c86ab58c91b84ba7d22465a3bb382011bd1912 100644 --- a/app/code/Magento/Directory/Test/Unit/Model/Country/Postcode/Config/DataTest.php +++ b/app/code/Magento/Directory/Test/Unit/Model/Country/Postcode/Config/DataTest.php @@ -8,31 +8,54 @@ namespace Magento\Directory\Test\Unit\Model\Country\Postcode\Config; class DataTest extends \PHPUnit_Framework_TestCase { /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Directory\Model\Country\Postcode\Config\Reader|\PHPUnit_Framework_MockObject_MockObject */ - protected $readerMock; + private $readerMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\Cache\Type\Config|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheMock; + private $cacheMock; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; protected function setUp() { - $this->readerMock = $this->getMockBuilder( - \Magento\Directory\Model\Country\Postcode\Config\Reader::class - )->disableOriginalConstructor()->getMock(); - $this->cacheMock = $this->getMockBuilder( - \Magento\Framework\App\Cache\Type\Config::class - )->disableOriginalConstructor()->getMock(); + $this->readerMock = $this->getMock( + \Magento\Directory\Model\Country\Postcode\Config\Reader::class, + [], + [], + '', + false + ); + $this->cacheMock = $this->getMock( + \Magento\Framework\App\Cache\Type\Config::class, + [], + [], + '', + false + ); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } public function testGet() { $expected = ['someData' => ['someValue', 'someKey' => 'someValue']]; - $this->cacheMock->expects($this->any())->method('load')->will($this->returnValue(serialize($expected))); - $configData = new \Magento\Directory\Model\Country\Postcode\Config\Data($this->readerMock, $this->cacheMock); - + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn(json_encode($expected)); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->willReturn($expected); + $configData = new \Magento\Directory\Model\Country\Postcode\Config\Data( + $this->readerMock, + $this->cacheMock, + 'country_postcodes', + $this->serializerMock + ); $this->assertEquals($expected, $configData->get()); } } diff --git a/app/code/Magento/DownloadableImportExport/Model/Import/Product/Type/Downloadable.php b/app/code/Magento/DownloadableImportExport/Model/Import/Product/Type/Downloadable.php index a641093f5454033fe4c628587e23f47b4d1ac9df..7a447aa90eea8f6eb39100e0218bbc90302a715f 100644 --- a/app/code/Magento/DownloadableImportExport/Model/Import/Product/Type/Downloadable.php +++ b/app/code/Magento/DownloadableImportExport/Model/Import/Product/Type/Downloadable.php @@ -7,7 +7,7 @@ */ namespace Magento\DownloadableImportExport\Model\Import\Product\Type; -use Magento\CatalogImportExport\Model\Import\Product; +use Magento\Framework\EntityManager\MetadataPool; use \Magento\Store\Model\Store; /** @@ -244,7 +244,7 @@ class Downloadable extends \Magento\CatalogImportExport\Model\Import\Product\Typ protected $downloadableHelper; /** - * Constructor + * Downloadable constructor * * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac * @param \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $prodAttrColFac @@ -252,7 +252,7 @@ class Downloadable extends \Magento\CatalogImportExport\Model\Import\Product\Typ * @param array $params * @param \Magento\DownloadableImportExport\Helper\Uploader $uploaderHelper * @param \Magento\DownloadableImportExport\Helper\Data $downloadableHelper - * @throws \Magento\Framework\Exception\LocalizedException + * @param MetadataPool $metadataPool */ public function __construct( \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory $attrSetColFac, @@ -260,12 +260,12 @@ class Downloadable extends \Magento\CatalogImportExport\Model\Import\Product\Typ \Magento\Framework\App\ResourceConnection $resource, array $params, \Magento\DownloadableImportExport\Helper\Uploader $uploaderHelper, - \Magento\DownloadableImportExport\Helper\Data $downloadableHelper + \Magento\DownloadableImportExport\Helper\Data $downloadableHelper, + MetadataPool $metadataPool = null ) { - parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params); + parent::__construct($attrSetColFac, $prodAttrColFac, $resource, $params, $metadataPool); $this->parameters = $this->_entityModel->getParameters(); $this->_resource = $resource; - $this->connection = $resource->getConnection('write'); $this->uploaderHelper = $uploaderHelper; $this->downloadableHelper = $downloadableHelper; } diff --git a/app/code/Magento/DownloadableImportExport/Test/Unit/Model/Import/Product/Type/DownloadableTest.php b/app/code/Magento/DownloadableImportExport/Test/Unit/Model/Import/Product/Type/DownloadableTest.php index d3cd979b31a9118250062408205c38c7a7c8adb7..c4799bcc42ae9c8d81b6ec321370e8684265a654 100644 --- a/app/code/Magento/DownloadableImportExport/Test/Unit/Model/Import/Product/Type/DownloadableTest.php +++ b/app/code/Magento/DownloadableImportExport/Test/Unit/Model/Import/Product/Type/DownloadableTest.php @@ -710,10 +710,6 @@ class DownloadableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst ->getMock(\Magento\Framework\EntityManager\MetadataPool::class, ['getLinkField'], [], '', false); $metadataPoolMock->expects($this->any())->method('getMetadata')->willReturnSelf(); - $this->prepareObjectManager([ - [\Magento\Framework\EntityManager\MetadataPool::class, $metadataPoolMock], - ]); - $this->downloadableModelMock = $this->objectManagerHelper->getObject( \Magento\DownloadableImportExport\Model\Import\Product\Type\Downloadable::class, [ @@ -722,7 +718,8 @@ class DownloadableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst 'resource' => $this->resourceMock, 'params' => $this->paramsArray, 'uploaderHelper' => $this->uploaderHelper, - 'downloadableHelper' => $this->downloadableHelper + 'downloadableHelper' => $this->downloadableHelper, + 'metadataPool' => $metadataPoolMock, ] ); $this->entityModelMock->expects($this->once())->method('getNewSku')->will($this->returnValue($newSku)); @@ -870,20 +867,4 @@ class DownloadableTest extends \Magento\ImportExport\Test\Unit\Model\Import\Abst $reflectionProperty->setValue($object, $value); return $object; } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Eav/Model/Config.php b/app/code/Magento/Eav/Model/Config.php index 36be7733dcd75a1fed3c7f63072f546d32378416..0d0237a1f6732cd06f540caa0c4f114947afeb6e 100644 --- a/app/code/Magento/Eav/Model/Config.php +++ b/app/code/Magento/Eav/Model/Config.php @@ -6,6 +6,8 @@ namespace Magento\Eav\Model; use Magento\Eav\Model\Entity\Type; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\App\ObjectManager; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -92,12 +94,18 @@ class Config */ protected $_universalFactory; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\App\CacheInterface $cache * @param \Magento\Eav\Model\Entity\TypeFactory $entityTypeFactory * @param \Magento\Eav\Model\ResourceModel\Entity\Type\CollectionFactory $entityTypeCollectionFactory * @param \Magento\Framework\App\Cache\StateInterface $cacheState * @param \Magento\Framework\Validator\UniversalFactory $universalFactory + * @param SerializerInterface $serializer * @codeCoverageIgnore */ public function __construct( @@ -105,13 +113,15 @@ class Config \Magento\Eav\Model\Entity\TypeFactory $entityTypeFactory, \Magento\Eav\Model\ResourceModel\Entity\Type\CollectionFactory $entityTypeCollectionFactory, \Magento\Framework\App\Cache\StateInterface $cacheState, - \Magento\Framework\Validator\UniversalFactory $universalFactory + \Magento\Framework\Validator\UniversalFactory $universalFactory, + SerializerInterface $serializer = null ) { $this->_cache = $cache; $this->_entityTypeFactory = $entityTypeFactory; $this->entityTypeCollectionFactory = $entityTypeCollectionFactory; $this->_cacheState = $cacheState; $this->_universalFactory = $universalFactory; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); } /** @@ -278,7 +288,7 @@ class Config \Magento\Framework\Profiler::start('EAV: ' . __METHOD__, ['group' => 'EAV', 'method' => __METHOD__]); if ($this->isCacheEnabled() && ($cache = $this->_cache->load(self::ENTITIES_CACHE_ID))) { - $this->_entityTypeData = unserialize($cache); + $this->_entityTypeData = $this->serializer->unserialize($cache); foreach ($this->_entityTypeData as $typeCode => $data) { $typeId = $data['entity_type_id']; $this->_addEntityTypeReference($typeId, $typeCode); @@ -302,7 +312,7 @@ class Config if ($this->isCacheEnabled()) { $this->_cache->save( - serialize($this->_entityTypeData), + $this->serializer->serialize($this->_entityTypeData), self::ENTITIES_CACHE_ID, [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, @@ -372,7 +382,7 @@ class Config } $cacheKey = self::ATTRIBUTES_CACHE_ID . $entityTypeCode; if ($this->isCacheEnabled() && ($attributes = $this->_cache->load($cacheKey))) { - $attributes = unserialize($attributes); + $attributes = $this->serializer->unserialize($attributes); if ($attributes) { foreach ($attributes as $attribute) { $this->_createAttribute($entityType, $attribute); @@ -402,7 +412,7 @@ class Config } if ($this->isCacheEnabled()) { $this->_cache->save( - serialize($this->_attributeData[$entityTypeCode]), + $this->serializer->serialize($this->_attributeData[$entityTypeCode]), $cacheKey, [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, @@ -487,7 +497,7 @@ class Config } if ($this->isCacheEnabled() && ($attributes = $this->_cache->load($cacheKey))) { - $this->_attributeCodes[$cacheKey] = unserialize($attributes); + $this->_attributeCodes[$cacheKey] = $this->serializer->unserialize($attributes); return $this->_attributeCodes[$cacheKey]; } @@ -514,7 +524,7 @@ class Config $this->_attributeCodes[$cacheKey] = $attributes; if ($this->isCacheEnabled()) { $this->_cache->save( - serialize($attributes), + $this->serializer->serialize($attributes), $cacheKey, [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Config.php b/app/code/Magento/Eav/Model/Entity/Attribute/Config.php index ae5c2f5e2339fd7b16f071c333971c3707a211e4..1bc5bba6d5e79fdfbd9cf5343f21f299121ceb43 100644 --- a/app/code/Magento/Eav/Model/Entity/Attribute/Config.php +++ b/app/code/Magento/Eav/Model/Entity/Attribute/Config.php @@ -5,20 +5,28 @@ */ namespace Magento\Eav\Model\Entity\Attribute; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides EAV attributes configuration + */ class Config extends \Magento\Framework\Config\Data { /** - * @param \Magento\Eav\Model\Entity\Attribute\Config\Reader $reader + * Constructor + * + * @param Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId - * @codeCoverageIgnore + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Eav\Model\Entity\Attribute\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = "eav_attributes" + $cacheId = 'eav_attributes', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } /** diff --git a/app/code/Magento/Eav/Model/Entity/AttributeCache.php b/app/code/Magento/Eav/Model/Entity/AttributeCache.php index 865fc5ebb5b1e0f26b3b75108be0115c11a7682a..f4f52e154cdd1cb1970ff07913cd273b0a5c77b2 100644 --- a/app/code/Magento/Eav/Model/Entity/AttributeCache.php +++ b/app/code/Magento/Eav/Model/Entity/AttributeCache.php @@ -9,6 +9,7 @@ namespace Magento\Eav\Model\Entity; use Magento\Eav\Model\Entity\Attribute\AbstractAttribute; use Magento\Framework\App\CacheInterface; use Magento\Framework\App\Cache\StateInterface; +use Magento\Framework\Serialize\SerializerInterface; /** * Class AttributeCache @@ -120,7 +121,7 @@ class AttributeCache [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, \Magento\Eav\Model\Entity\Attribute::CACHE_TAG, - \Magento\Framework\App\Config\ScopePool::CACHE_TAG + \Magento\Config\App\Config\Type\System::CACHE_TAG ] ); } diff --git a/app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute/Set.php b/app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute/Set.php index 4e6e45f5d2270aa42e049ae2fe52c60bd1bce82b..b3e7bf2bc3925224cace683b4aba2fe57b29e63e 100644 --- a/app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute/Set.php +++ b/app/code/Magento/Eav/Model/ResourceModel/Entity/Attribute/Set.php @@ -5,11 +5,8 @@ */ namespace Magento\Eav\Model\ResourceModel\Entity\Attribute; -/** - * Eav attribute set resource model - * - * @author Magento Core Team <core@magentocommerce.com> - */ +use Magento\Framework\Serialize\SerializerInterface; + class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb { /** @@ -27,6 +24,11 @@ class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb */ protected $eavConfig; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\Model\ResourceModel\Db\Context $context * @param GroupFactory $attrGroupFactory @@ -152,7 +154,7 @@ class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb $cacheKey = self::ATTRIBUTES_CACHE_ID . $setId; if ($this->eavConfig->isCacheEnabled() && ($cache = $this->eavConfig->getCache()->load($cacheKey))) { - $setInfoData = unserialize($cache); + $setInfoData = $this->getSerializer()->unserialize($cache); } else { $attributeSetData = $this->fetchAttributeSetData($setId); @@ -168,7 +170,7 @@ class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb if ($this->eavConfig->isCacheEnabled()) { $this->eavConfig->getCache()->save( - serialize($setInfoData), + $this->getSerializer()->serialize($setInfoData), $cacheKey, [ \Magento\Eav\Model\Cache\Type::CACHE_TAG, @@ -233,4 +235,19 @@ class Set extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb } return $connection->fetchAll($select, $bind); } + + /** + * Get serializer + * + * @return SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if (null === $this->serializer) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/app/code/Magento/Eav/Plugin/Model/ResourceModel/Entity/Attribute.php b/app/code/Magento/Eav/Plugin/Model/ResourceModel/Entity/Attribute.php index c76449b1223ed3369df37202da1415c7f14a5187..56bad8bf75e11e8329f895d62f5ccb9e5faa3148 100644 --- a/app/code/Magento/Eav/Plugin/Model/ResourceModel/Entity/Attribute.php +++ b/app/code/Magento/Eav/Plugin/Model/ResourceModel/Entity/Attribute.php @@ -5,6 +5,13 @@ */ namespace Magento\Eav\Plugin\Model\ResourceModel\Entity; +use Magento\Framework\App\CacheInterface; +use Magento\Framework\App\Cache\StateInterface; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Eav\Model\ResourceModel\Entity\Attribute as AttributeResource; +use Magento\Eav\Model\Cache\Type; +use Magento\Eav\Model\Entity\Attribute as EntityAttribute; + class Attribute { /** @@ -12,52 +19,74 @@ class Attribute */ const STORE_LABEL_ATTRIBUTE = 'EAV_STORE_LABEL_ATTRIBUTE'; - /** @var \Magento\Framework\App\CacheInterface */ - protected $cache; + /** + * @var CacheInterface + */ + private $cache; + + /** + * @var StateInterface + */ + private $cacheState; - /** @var bool|null */ - protected $isCacheEnabled = null; + /** + * @var SerializerInterface + */ + private $serializer; /** - * @param \Magento\Framework\App\CacheInterface $cache - * @param \Magento\Framework\App\Cache\StateInterface $cacheState + * @param CacheInterface $cache + * @param StateInterface $cacheState + * @param SerializerInterface $serializer * @codeCoverageIgnore */ public function __construct( - \Magento\Framework\App\CacheInterface $cache, - \Magento\Framework\App\Cache\StateInterface $cacheState + CacheInterface $cache, + StateInterface $cacheState, + SerializerInterface $serializer ) { $this->cache = $cache; - $this->isCacheEnabled = $cacheState->isEnabled(\Magento\Eav\Model\Cache\Type::TYPE_IDENTIFIER); + $this->serializer = $serializer; + $this->cacheState = $cacheState; } /** - * @param \Magento\Eav\Model\ResourceModel\Entity\Attribute $subject + * @param AttributeResource $subject * @param callable $proceed * @param int $attributeId * @return array * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundGetStoreLabelsByAttributeId( - \Magento\Eav\Model\ResourceModel\Entity\Attribute $subject, + AttributeResource $subject, \Closure $proceed, $attributeId ) { $cacheId = self::STORE_LABEL_ATTRIBUTE . $attributeId; - if ($this->isCacheEnabled && ($storeLabels = $this->cache->load($cacheId))) { - return unserialize($storeLabels); + if ($this->isCacheEnabled() && ($storeLabels = $this->cache->load($cacheId))) { + return $this->serializer->unserialize($storeLabels); } $storeLabels = $proceed($attributeId); - if ($this->isCacheEnabled) { + if ($this->isCacheEnabled()) { $this->cache->save( - serialize($storeLabels), + $this->serializer->serialize($storeLabels), $cacheId, [ - \Magento\Eav\Model\Cache\Type::CACHE_TAG, - \Magento\Eav\Model\Entity\Attribute::CACHE_TAG + Type::CACHE_TAG, + EntityAttribute::CACHE_TAG ] ); } return $storeLabels; } + + /** + * Check if cache is enabled + * + * @return bool + */ + private function isCacheEnabled() + { + return $this->cacheState->isEnabled(Type::TYPE_IDENTIFIER); + } } diff --git a/app/code/Magento/Eav/Test/Unit/Model/ConfigTest.php b/app/code/Magento/Eav/Test/Unit/Model/ConfigTest.php index f5fad571f205c14232676327269c52b3cb61370a..ff1e186de604a0b71b0bf765579f74fdd73aa4c4 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/ConfigTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/ConfigTest.php @@ -3,11 +3,15 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Eav\Test\Unit\Model; use Magento\Framework\DataObject; use Magento\Eav\Model\Config; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Eav\Model\Entity\Type; +use Magento\Eav\Model\Cache\Type as Cache; +use Magento\Eav\Model\Entity\Attribute; +use Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection; class ConfigTest extends \PHPUnit_Framework_TestCase { @@ -34,19 +38,26 @@ class ConfigTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\App\Cache\StateInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $stateMock; + protected $cacheStateMock; /** * @var \Magento\Framework\Validator\UniversalFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $universalFactoryMock; + /** + * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + + /** + * @var Type|\PHPUnit_Framework_MockObject_MockObject + */ + private $typeMock; + protected function setUp() { - $this->cacheMock = $this->getMockBuilder(\Magento\Framework\App\CacheInterface::class) - ->disableOriginalConstructor() - ->setMethods(['load', 'getFrontend', 'save', 'remove', 'clean']) - ->getMock(); + $this->cacheMock = $this->getMock(\Magento\Framework\App\CacheInterface::class); $this->typeFactoryMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\TypeFactory::class) ->setMethods(['create']) ->disableOriginalConstructor() @@ -56,35 +67,44 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); - $this->stateMock = $this->getMockBuilder(\Magento\Framework\App\Cache\StateInterface::class) - ->setMethods(['isEnabled', 'setEnabled', 'persist']) - ->disableOriginalConstructor() - ->getMock(); + $this->cacheStateMock = $this->getMock(\Magento\Framework\App\Cache\StateInterface::class); $this->universalFactoryMock = $this->getMockBuilder(\Magento\Framework\Validator\UniversalFactory::class) ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); + $this->serializerMock = $this->getMock(SerializerInterface::class); + + $this->typeMock = $this->getMock(Type::class, [], [], '', false); + $this->config = new Config( $this->cacheMock, $this->typeFactoryMock, $this->collectionFactoryMock, - $this->stateMock, - $this->universalFactoryMock + $this->cacheStateMock, + $this->universalFactoryMock, + $this->serializerMock ); } /** * @param boolean $cacheEnabled * @param int $loadCalls - * @param string $cachedValue + * @param int $cachedValue + * @param int $unserializeCalls * @dataProvider getAttributeCacheDataProvider * @return void */ - public function testGetAttributeCache($cacheEnabled, $loadCalls, $cachedValue) + public function testGetAttributeCache($cacheEnabled, $loadCalls, $unserializeCalls, $cachedValue) { + $attributeData = [ + [ + 'attribute_code' => 'attribute_code_1', + 'attribute_id' => 1 + ] + ]; $attributeCollectionMock = $this->getMockBuilder( - \Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection::class + Collection::class )->disableOriginalConstructor() ->setMethods(['getData', 'setEntityTypeFilter']) ->getMock(); @@ -96,29 +116,40 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ->expects($this->any()) ->method('getData') ->willReturn([]); - $entityAttributeMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute::class) + $entityAttributeMock = $this->getMockBuilder(Attribute::class) ->setMethods(['setData']) ->disableOriginalConstructor() ->getMock(); $factoryCalls = [ - [\Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection::class, [], $attributeCollectionMock], - [\Magento\Eav\Model\Entity\Attribute::class, [], $entityAttributeMock], + [ + Collection::class, + [], + $attributeCollectionMock + ], + [ + Attribute::class, + [], + $entityAttributeMock + ], ]; - $this->stateMock + $this->cacheStateMock ->expects($this->atLeastOnce()) ->method('isEnabled') - ->with(\Magento\Eav\Model\Cache\Type::TYPE_IDENTIFIER) + ->with(Cache::TYPE_IDENTIFIER) ->willReturn($cacheEnabled); $this->cacheMock ->expects($this->exactly($loadCalls)) ->method('load') ->with(Config::ATTRIBUTES_CACHE_ID) ->willReturn($cachedValue); + $this->serializerMock + ->expects($this->exactly($unserializeCalls)) + ->method('unserialize') + ->with($cachedValue) + ->willReturn($attributeData); - $collectionStub = new DataObject([ - ['entity_type_code' => 'type_code_1', 'entity_type_id' => 1], - ]); + $collectionStub = new DataObject([$attributeData]); $this->collectionFactoryMock ->expects($this->any()) ->method('create') @@ -134,7 +165,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ->method('create') ->will($this->returnValueMap($factoryCalls)); - $entityType = $this->getMockBuilder(\Magento\Eav\Model\Entity\Type::class) + $entityType = $this->getMockBuilder(Type::class) ->setMethods(['getEntity', 'setData', 'getData']) ->disableOriginalConstructor() ->getMock(); @@ -151,38 +182,145 @@ class ConfigTest extends \PHPUnit_Framework_TestCase 'cache-disabled' => [ false, 0, + 0, false, ], 'cache-miss' => [ true, 1, + 0, false, ], 'cached' => [ true, 1, - serialize( - [ - ['attribute_code' => 'attribute_code_1', 'attribute_id' => 1], - ] - ), + 1, + 'attribute serialzied data', ], ]; } public function testClear() { - $this->cacheMock - ->expects($this->once()) + $this->cacheMock->expects($this->once()) ->method('clean') ->with( $this->equalTo( [ - \Magento\Eav\Model\Cache\Type::CACHE_TAG, - \Magento\Eav\Model\Entity\Attribute::CACHE_TAG, + Cache::CACHE_TAG, + Attribute::CACHE_TAG, ] ) ); $this->config->clear(); } + + public function testGetEntityTypeInstanceOfTypePassed() + { + $this->assertEquals( + $this->typeMock, + $this->config->getEntityType($this->typeMock) + ); + } + + public function testGetEntityTypeCacheExists() + { + $entityTypeCode = 'catalog_product'; + $data = [ + $entityTypeCode => [ + 'entity_type_id' => 1 + ] + ]; + $serializedData = 'serialized data'; + $this->cacheStateMock->expects($this->once()) + ->method('isEnabled') + ->with(Cache::TYPE_IDENTIFIER) + ->willReturn(true); + $this->cacheMock->expects($this->once()) + ->method('load') + ->with(Config::ENTITIES_CACHE_ID) + ->willReturn($serializedData); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedData) + ->willReturn($data); + $this->typeMock->expects($this->exactly(2)) + ->method('getId') + ->willReturn($data[$entityTypeCode]['entity_type_id']); + $this->typeMock->expects($this->once()) + ->method('getEntityTypeCode') + ->willReturn($entityTypeCode); + $this->typeFactoryMock->expects($this->once()) + ->method('create') + ->with(['data' => $data[$entityTypeCode]]) + ->willReturn($this->typeMock); + $this->assertInstanceOf( + Type::class, + $this->config->getEntityType($entityTypeCode) + ); + } + + public function testGetEntityTypeCacheDoesNotExist() + { + $entityTypeCode = 'catalog_product'; + $collectionData = [ + [ + 'entity_type_id' => 1, + 'entity_type_code' => $entityTypeCode + ] + ]; + $data = [ + $entityTypeCode => [ + 'entity_type_id' => 1, + 'entity_type_code' => $entityTypeCode, + 'attribute_model' => Attribute::class + ] + ]; + $serializedData = 'serialized data'; + $this->cacheStateMock->expects($this->once()) + ->method('isEnabled') + ->with(Cache::TYPE_IDENTIFIER) + ->willReturn(true); + $this->cacheMock->expects($this->once()) + ->method('load') + ->with(Config::ENTITIES_CACHE_ID) + ->willReturn(false); + $this->serializerMock->expects($this->never()) + ->method('unserialize'); + $attributeCollectionMock = $this->getMock(Collection::class, [], [], '', false); + $this->collectionFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($attributeCollectionMock); + $attributeCollectionMock->expects($this->once()) + ->method('getData') + ->willReturn($collectionData); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($data) + ->willReturn($serializedData); + $this->cacheMock->expects($this->once()) + ->method('save') + ->with( + $serializedData, + Config::ENTITIES_CACHE_ID, + [ + Cache::CACHE_TAG, + Attribute::CACHE_TAG + ] + ); + $this->typeMock->expects($this->exactly(2)) + ->method('getId') + ->willReturn($data[$entityTypeCode]['entity_type_id']); + $this->typeMock->expects($this->once()) + ->method('getEntityTypeCode') + ->willReturn($entityTypeCode); + $this->typeFactoryMock->expects($this->once()) + ->method('create') + ->with(['data' => $data[$entityTypeCode]]) + ->willReturn($this->typeMock); + $this->assertInstanceOf( + Type::class, + $this->config->getEntityType($entityTypeCode) + ); + } } diff --git a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/ConfigTest.php b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/ConfigTest.php index 78dbc6bed34c31e5025cb366c2200457e4303b1d..5ae74a16b27a90b0bbf53b3ab13ad2a4cf398efe 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/ConfigTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/Entity/Attribute/ConfigTest.php @@ -32,7 +32,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase protected $_cacheId; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Eav\Model\Entity\Attribute|\PHPUnit_Framework_MockObject_MockObject */ protected $_attribute; @@ -54,20 +54,20 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ); $this->_cacheMock = $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false); $this->_cacheId = 'eav_attributes'; - $this->_cacheMock->expects( - $this->once() - )->method( - 'load' - )->with( - $this->equalTo($this->_cacheId) - )->will( - $this->returnValue(serialize([])) - ); + $this->_cacheMock->expects($this->once()) + ->method('load') + ->with($this->_cacheId) + ->willReturn(''); + + $serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); + $serializerMock->method('unserialize') + ->willReturn([]); $this->_model = new \Magento\Eav\Model\Entity\Attribute\Config( $this->_readerMock, $this->_cacheMock, - $this->_cacheId + $this->_cacheId, + $serializerMock ); } diff --git a/app/code/Magento/Eav/Test/Unit/Model/ResourceModel/Entity/Attribute/SetTest.php b/app/code/Magento/Eav/Test/Unit/Model/ResourceModel/Entity/Attribute/SetTest.php index a380b14595eb24afb563dfccb94f867de55e5eff..e00a8ee97648c0768c7dac4c10359e1378856674 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/ResourceModel/Entity/Attribute/SetTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/ResourceModel/Entity/Attribute/SetTest.php @@ -1,14 +1,14 @@ <?php /** - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Eav\Test\Unit\Model\ResourceModel\Entity\Attribute; use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set; - +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; + /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ @@ -49,11 +49,17 @@ class SetTest extends \PHPUnit_Framework_TestCase */ protected $relationProcessor; + /** + * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + /** * {@inheritdoc} */ protected function setUp() { + $objectManager = new ObjectManager($this); $this->resourceMock = $this->getMockBuilder(\Magento\Framework\App\ResourceConnection::class) ->disableOriginalConstructor() ->setMethods(['getConnection', 'getTableName']) @@ -81,31 +87,28 @@ class SetTest extends \PHPUnit_Framework_TestCase ->setMethods(['isCacheEnabled', 'getEntityType', 'getCache']) ->disableOriginalConstructor() ->getMock(); - $this->model = $this->getMock( + + $this->serializerMock = $this->getMock(SerializerInterface::class); + + $attributeGroupFactoryMock = $this->getMock( + \Magento\Eav\Model\ResourceModel\Entity\Attribute\GroupFactory::class, + [], + [], + '', + false + ); + + $this->model = $objectManager->getObject( \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set::class, [ - 'beginTransaction', - 'getMainTable', - 'getIdFieldName', - '_afterDelete', - 'commit', - 'rollBack', - '__wakeup' - ], - [ - $contextMock, - $this->getMock( - \Magento\Eav\Model\ResourceModel\Entity\Attribute\GroupFactory::class, - [], - [], - '', - false - ), - $this->eavConfigMock - ], - '', - true + 'context' => $contextMock, + 'attrGroupFactory' => $attributeGroupFactoryMock, + 'eavConfig' => $this->eavConfigMock + ] ); + + $objectManager->setBackwardCompatibleProperty($this->model, 'serializer', $this->serializerMock); + $this->typeMock = $this->getMock(\Magento\Eav\Model\Entity\Type::class, [], [], '', false); $this->objectMock = $this->getMock( \Magento\Framework\Model\AbstractModel::class, @@ -123,7 +126,6 @@ class SetTest extends \PHPUnit_Framework_TestCase '', false ); - } /** @@ -182,6 +184,22 @@ class SetTest extends \PHPUnit_Framework_TestCase */ public function testGetSetInfoCacheMiss() { + $serializedData = 'serialized data'; + $setElement = [ + 10000 => [ + 'group_id' => 10, + 'group_sort' => 100, + 'sort' => 1000 + ] + ]; + $setData = [ + 1 => $setElement, + 2 => [], + 3 => [] + ]; + $cached = [ + 1 => $setElement + ]; $cacheMock = $this->getMockBuilder(\Magento\Framework\App\CacheInterface::class) ->disableOriginalConstructor() ->setMethods(['load', 'save', 'getFrontend', 'remove', 'clean']) @@ -192,21 +210,15 @@ class SetTest extends \PHPUnit_Framework_TestCase ->method('load') ->with($cacheKey) ->willReturn(false); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($cached) + ->willReturn($serializedData); $cacheMock ->expects($this->once()) ->method('save') ->with( - serialize( - [ - 1 => [ - 10000 => [ - 'group_id' => 10, - 'group_sort' => 100, - 'sort' => 1000 - ] - ] - ] - ), + $serializedData, $cacheKey, [\Magento\Eav\Model\Cache\Type::CACHE_TAG, \Magento\Eav\Model\Entity\Attribute::CACHE_TAG] ); @@ -242,17 +254,7 @@ class SetTest extends \PHPUnit_Framework_TestCase $this->resourceMock->expects($this->any())->method('getConnection')->willReturn($connectionMock); $this->resourceMock->expects($this->any())->method('getTableName')->willReturn('_TABLE_'); $this->assertEquals( - [ - 1 => [ - 10000 => [ - 'group_id' => 10, - 'group_sort' => 100, - 'sort' => 1000 - ] - ], - 2 => [], - 3 => [] - ], + $setData, $this->model->getSetInfo([1, 2, 3], 1) ); } @@ -262,42 +264,41 @@ class SetTest extends \PHPUnit_Framework_TestCase */ public function testGetSetInfoCacheHit() { - $cached = [ - 1 => [ - 10000 => [ - 'group_id' => 10, - 'group_sort' => 100, - 'sort' => 1000 - ] + $setElement = [ + 10000 => [ + 'group_id' => 10, + 'group_sort' => 100, + 'sort' => 1000 ] ]; - + $setData = [ + 1 => $setElement, + 2 => [], + 3 => [] + ]; + $cached = [ + 1 => $setElement + ]; + $serializedData = 'serialized data'; $this->resourceMock->expects($this->never())->method('getConnection'); $this->eavConfigMock->expects($this->any())->method('isCacheEnabled')->willReturn(true); $cacheMock = $this->getMockBuilder(\Magento\Framework\App\CacheInterface::class) ->disableOriginalConstructor() ->setMethods(['load', 'save', 'getFrontend', 'remove', 'clean']) ->getMock(); - $cacheMock - ->expects($this->once()) + $cacheMock->expects($this->once()) ->method('load') ->with(Set::ATTRIBUTES_CACHE_ID . 1) - ->willReturn(serialize($cached)); + ->willReturn($serializedData); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedData) + ->willReturn($cached); $this->eavConfigMock->expects($this->any())->method('getCache')->willReturn($cacheMock); $this->assertEquals( - [ - 1 => [ - 10000 => [ - 'group_id' => 10, - 'group_sort' => 100, - 'sort' => 1000 - ] - ], - 2 => [], - 3 => [] - ], + $setData, $this->model->getSetInfo([1, 2, 3], 1) ); } diff --git a/app/code/Magento/Eav/Test/Unit/Plugin/Model/ResourceModel/Entity/AttributeTest.php b/app/code/Magento/Eav/Test/Unit/Plugin/Model/ResourceModel/Entity/AttributeTest.php index 7d4561259cf88f1fdaf4a5bb53ac2d2eac7408f7..3fa739d4096a8eedb0b2aaaa69b6c0f1adf93c30 100644 --- a/app/code/Magento/Eav/Test/Unit/Plugin/Model/ResourceModel/Entity/AttributeTest.php +++ b/app/code/Magento/Eav/Test/Unit/Plugin/Model/ResourceModel/Entity/AttributeTest.php @@ -3,111 +3,166 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - -// @codingStandardsIgnoreFile - namespace Magento\Eav\Test\Unit\Plugin\Model\ResourceModel\Entity; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\App\CacheInterface; +use Magento\Framework\App\Cache\StateInterface; +use Magento\Eav\Model\ResourceModel\Entity\Attribute as AttributeResource; +use Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute as AttributeResourcePlugin; +use Magento\Eav\Model\Cache\Type; +use Magento\Eav\Model\Entity\Attribute; class AttributeTest extends \PHPUnit_Framework_TestCase { - /** @var \Magento\Framework\App\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cache; + /** + * @var CacheInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $cacheMock; - /** @var \Magento\Framework\App\Cache\StateInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheState; + /** + * @var StateInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $cacheStateMock; + + /** + * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + + /** + * @var AttributeResource|\PHPUnit_Framework_MockObject_MockObject + */ + private $attributeResourceMock; - /** @var \Magento\Eav\Model\ResourceModel\Entity\Attribute|\PHPUnit_Framework_MockObject_MockObject */ - protected $subject; + /** + * @var AttributeResourcePlugin + */ + private $attributeResourcePlugin; protected function setUp() { - $this->cache = $this->getMock(\Magento\Framework\App\CacheInterface::class); - $this->cacheState = $this->getMock(\Magento\Framework\App\Cache\StateInterface::class); - $this->subject = $this->getMock(\Magento\Eav\Model\ResourceModel\Entity\Attribute::class, [], [], '', false); + $objectManager = new ObjectManager($this); + $this->cacheMock = $this->getMock(CacheInterface::class); + $this->cacheStateMock = $this->getMock(StateInterface::class); + $this->attributeResourceMock = $this->getMock(AttributeResource::class, [], [], '', false); + $this->serializerMock = $this->getMock(SerializerInterface::class); + $this->attributeResourcePlugin = $objectManager->getObject( + AttributeResourcePlugin::class, + [ + 'cache' => $this->cacheMock, + 'cacheState' => $this->cacheStateMock, + 'serializer' => $this->serializerMock + ] + ); } - public function testGetStoreLabelsByAttributeIdOnCacheDisabled() + public function testAroundGetStoreLabelsByAttributeIdCacheIsDisabled() { - $this->cache->expects($this->never())->method('load'); + $attributeId = 1; + $this->cacheMock->expects($this->never()) + ->method('load'); + $this->cacheStateMock->expects($this->exactly(2)) + ->method('isEnabled') + ->with(Type::TYPE_IDENTIFIER) + ->willReturn(false); - $this->assertEquals( - 'attributeId', - $this->getAttribute(false)->aroundGetStoreLabelsByAttributeId( - $this->subject, - $this->mockPluginProceed('attributeId'), - 'attributeId' - ) + $isProceedCalled = false; + // @SuppressWarnings(PHPMD.UnusedFormalParameter) + $proceed = function ($attributeId) use (&$isProceedCalled) { + $isProceedCalled = true; + }; + + $this->attributeResourcePlugin->aroundGetStoreLabelsByAttributeId( + $this->attributeResourceMock, + $proceed, + $attributeId ); + $this->assertTrue($isProceedCalled); } - public function testGetStoreLabelsByAttributeIdFromCache() + public function testAroundGetStoreLabelsByAttributeIdCacheExists() { $attributeId = 1; - $attributes = ['k' => 'v']; - $cacheId = \Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute::STORE_LABEL_ATTRIBUTE . $attributeId; - $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(serialize($attributes)); + $attributes = ['foo' => 'bar']; + $serializedAttributes = 'serialized attributes'; + $cacheId = AttributeResourcePlugin::STORE_LABEL_ATTRIBUTE . $attributeId; + $this->cacheStateMock->expects($this->once()) + ->method('isEnabled') + ->with(Type::TYPE_IDENTIFIER) + ->willReturn(true); + $this->cacheMock->expects($this->once()) + ->method('load') + ->with($cacheId) + ->willReturn($serializedAttributes); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedAttributes) + ->willReturn($attributes); + + $isProceedCalled = false; + // @SuppressWarnings(PHPMD.UnusedFormalParameter) + $proceed = function ($attributeId) use (&$isProceedCalled) { + $isProceedCalled = true; + }; $this->assertEquals( $attributes, - $this->getAttribute(true)->aroundGetStoreLabelsByAttributeId( - $this->subject, - $this->mockPluginProceed(), + $this->attributeResourcePlugin->aroundGetStoreLabelsByAttributeId( + $this->attributeResourceMock, + $proceed, $attributeId ) ); + $this->assertFalse($isProceedCalled); } - public function testGetStoreLabelsByAttributeIdWithCacheSave() + public function testAroundGetStoreLabelsByAttributeIdCacheDoesNotExist() { $attributeId = 1; - $cacheId = \Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute::STORE_LABEL_ATTRIBUTE . $attributeId; - $this->cache->expects($this->any())->method('load')->with($cacheId)->willReturn(false); - $this->cache->expects($this->any())->method('save')->with( - serialize([$attributeId]), - $cacheId, - [ - \Magento\Eav\Model\Cache\Type::CACHE_TAG, - \Magento\Eav\Model\Entity\Attribute::CACHE_TAG - ] - ); + $attributes = ['foo' => 'bar']; + $serializedAttributes = 'serialized attributes'; + $cacheId = AttributeResourcePlugin::STORE_LABEL_ATTRIBUTE . $attributeId; + $this->cacheStateMock->expects($this->exactly(2)) + ->method('isEnabled') + ->with(Type::TYPE_IDENTIFIER) + ->willReturn(true); + $this->cacheMock->expects($this->once()) + ->method('load') + ->with($cacheId) + ->willReturn(false); + $this->serializerMock->expects($this->never()) + ->method('unserialize') + ->with($serializedAttributes) + ->willReturn($attributes); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($attributes) + ->willReturn($serializedAttributes); + $this->cacheMock->expects($this->once()) + ->method('save') + ->with( + $serializedAttributes, + $cacheId, + [ + Type::CACHE_TAG, + Attribute::CACHE_TAG + ] + ); + + // @SuppressWarnings(PHPMD.UnusedFormalParameter) + $proceed = function ($attributeId) use ($attributes) { + return $attributes; + }; $this->assertEquals( - [$attributeId], - $this->getAttribute(true)->aroundGetStoreLabelsByAttributeId( - $this->subject, - $this->mockPluginProceed([$attributeId]), + $attributes, + $this->attributeResourcePlugin->aroundGetStoreLabelsByAttributeId( + $this->attributeResourceMock, + $proceed, $attributeId ) ); } - - /** - * @param bool $cacheEnabledFlag - * @return \Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute - */ - protected function getAttribute($cacheEnabledFlag) - { - $this->cacheState->expects($this->any())->method('isEnabled') - ->with(\Magento\Eav\Model\Cache\Type::TYPE_IDENTIFIER)->willReturn($cacheEnabledFlag); - return (new ObjectManager($this))->getObject( - \Magento\Eav\Plugin\Model\ResourceModel\Entity\Attribute::class, - [ - 'cache' => $this->cache, - 'cacheState' => $this->cacheState - ] - ); - } - - /** - * @param mixed $returnValue - * @return callable - */ - protected function mockPluginProceed($returnValue = null) - { - return function () use ($returnValue) { - return $returnValue; - }; - } } diff --git a/app/code/Magento/Email/Model/Template/Config/Data.php b/app/code/Magento/Email/Model/Template/Config/Data.php index c7f4054bf311efbf55add66d4794981a42a1e459..1f6a4beb166e0da25283b8b29efff85c3b24ba58 100644 --- a/app/code/Magento/Email/Model/Template/Config/Data.php +++ b/app/code/Magento/Email/Model/Template/Config/Data.php @@ -1,22 +1,31 @@ <?php /** - * Email templates configuration data container. Provides email templates configuration data. - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Email\Model\Template\Config; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides email templates configuration + */ class Data extends \Magento\Framework\Config\Data { /** + * Constructor + * * @param \Magento\Email\Model\Template\Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Email\Model\Template\Config\Reader $reader, - \Magento\Framework\Config\CacheInterface $cache + \Magento\Framework\Config\CacheInterface $cache, + $cacheId = 'email_templates', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, 'email_templates'); + parent::__construct($reader, $cache, $cacheId, $serializer); } } diff --git a/app/code/Magento/Email/Model/Template/Css/Processor.php b/app/code/Magento/Email/Model/Template/Css/Processor.php index ae7d083750863d2d7dbd5869341bbee772544421..0386a9ace5ea5a7b5d9c93075224d1031017f28f 100644 --- a/app/code/Magento/Email/Model/Template/Css/Processor.php +++ b/app/code/Magento/Email/Model/Template/Css/Processor.php @@ -8,6 +8,9 @@ namespace Magento\Email\Model\Template\Css; use Magento\Framework\View\Asset\NotationResolver\Variable; use Magento\Framework\View\Asset\Repository; +/** + * Class for processing css placeholders + */ class Processor { /** diff --git a/app/code/Magento/Email/Model/Template/Filter.php b/app/code/Magento/Email/Model/Template/Filter.php index d9409d62f159cfd7c2ab1e6c32aae6d07a33b8fc..658b2977fdf738207d07ddcb5d4774c6fe9cb72c 100644 --- a/app/code/Magento/Email/Model/Template/Filter.php +++ b/app/code/Magento/Email/Model/Template/Filter.php @@ -216,31 +216,6 @@ class Filter extends \Magento\Framework\Filter\Template parent::__construct($string, $variables); } - /** - * @deprecated - * @return Css\Processor - */ - private function getCssProcessor() - { - if (!$this->cssProcessor) { - $this->cssProcessor = ObjectManager::getInstance()->get(Css\Processor::class); - } - return $this->cssProcessor; - } - - /** - * @deprecated - * @param string $dirType - * @return ReadInterface - */ - private function getPubDirectory($dirType) - { - if (!$this->pubDirectory) { - $this->pubDirectory = ObjectManager::getInstance()->get(Filesystem::class)->getDirectoryRead($dirType); - } - return $this->pubDirectory; - } - /** * Set use absolute links flag * @@ -333,6 +308,31 @@ class Filter extends \Magento\Framework\Filter\Template return $this; } + /** + * @deprecated + * @return Css\Processor + */ + private function getCssProcessor() + { + if (!$this->cssProcessor) { + $this->cssProcessor = ObjectManager::getInstance()->get(Css\Processor::class); + } + return $this->cssProcessor; + } + + /** + * @deprecated + * @param string $dirType + * @return ReadInterface + */ + private function getPubDirectory($dirType) + { + if (!$this->pubDirectory) { + $this->pubDirectory = ObjectManager::getInstance()->get(Filesystem::class)->getDirectoryRead($dirType); + } + return $this->pubDirectory; + } + /** * Get design parameters * diff --git a/app/code/Magento/ImportExport/Model/Export/Config.php b/app/code/Magento/ImportExport/Model/Export/Config.php index 267a7e6c7a9e1ef161aff935377848e19faf72c2..2d7b2c7a3af253e7ef7d80d13de45a95007f6c5a 100644 --- a/app/code/Magento/ImportExport/Model/Export/Config.php +++ b/app/code/Magento/ImportExport/Model/Export/Config.php @@ -5,19 +5,28 @@ */ namespace Magento\ImportExport\Model\Export; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides export configuration + */ class Config extends \Magento\Framework\Config\Data implements \Magento\ImportExport\Model\Export\ConfigInterface { /** - * @param \Magento\ImportExport\Model\Export\Config\Reader $reader + * Constructor + * + * @param Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\ImportExport\Model\Export\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'export_config_cache' + $cacheId = 'export_config_cache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } /** diff --git a/app/code/Magento/ImportExport/Model/Import/Config.php b/app/code/Magento/ImportExport/Model/Import/Config.php index 0652dd03d9ff43944ef9e7cb10fa1671c7048987..a1ec492da3e9630d0166d52f6eae28a564897c12 100644 --- a/app/code/Magento/ImportExport/Model/Import/Config.php +++ b/app/code/Magento/ImportExport/Model/Import/Config.php @@ -5,19 +5,28 @@ */ namespace Magento\ImportExport\Model\Import; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides import configuration + */ class Config extends \Magento\Framework\Config\Data implements \Magento\ImportExport\Model\Import\ConfigInterface { /** - * @param \Magento\ImportExport\Model\Import\Config\Reader $reader + * Constructor + * + * @param Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\ImportExport\Model\Import\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'import_config_cache' + $cacheId = 'import_config_cache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } /** diff --git a/app/code/Magento/ImportExport/Test/Unit/Model/Export/ConfigTest.php b/app/code/Magento/ImportExport/Test/Unit/Model/Export/ConfigTest.php index 797c9f7a1ae32a8464114e3f144bfc7b679fb54e..0b1e542f85b9deb9dc3c24a7cb0497ba4d9d5168 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Model/Export/ConfigTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Model/Export/ConfigTest.php @@ -8,35 +8,41 @@ namespace Magento\ImportExport\Test\Unit\Model\Export; class ConfigTest extends \PHPUnit_Framework_TestCase { /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\ImportExport\Model\Export\Config\Reader|\PHPUnit_Framework_MockObject_MockObject */ - protected $_readerMock; + private $readerMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_configScopeMock; + private $cacheMock; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; /** * @var string */ - protected $_cacheId = 'some_id'; + private $cacheId = 'some_id'; /** * @var \Magento\ImportExport\Model\Export\Config */ - protected $_model; + private $model; protected function setUp() { - $this->_readerMock = $this->getMock( + $this->readerMock = $this->getMock( \Magento\ImportExport\Model\Export\Config\Reader::class, [], [], '', false ); - $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } /** @@ -46,22 +52,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase */ public function testGetEntities($value, $expected) { - $this->_configScopeMock->expects( + $this->cacheMock->expects( $this->any() )->method( 'load' )->with( - $this->_cacheId + $this->cacheId )->will( $this->returnValue(false) ); - $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($value)); - $this->_model = new \Magento\ImportExport\Model\Export\Config( - $this->_readerMock, - $this->_configScopeMock, - $this->_cacheId + $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($value)); + $this->model = new \Magento\ImportExport\Model\Export\Config( + $this->readerMock, + $this->cacheMock, + $this->cacheId, + $this->serializerMock ); - $this->assertEquals($expected, $this->_model->getEntities('entities')); + $this->assertEquals($expected, $this->model->getEntities('entities')); } public function getEntitiesDataProvider() @@ -80,22 +87,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase */ public function testGetEntityTypes($configData, $entity, $expectedResult) { - $this->_configScopeMock->expects( + $this->cacheMock->expects( $this->any() )->method( 'load' )->with( - $this->_cacheId + $this->cacheId )->will( $this->returnValue(false) ); - $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($configData)); - $this->_model = new \Magento\ImportExport\Model\Export\Config( - $this->_readerMock, - $this->_configScopeMock, - $this->_cacheId + $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($configData)); + $this->model = new \Magento\ImportExport\Model\Export\Config( + $this->readerMock, + $this->cacheMock, + $this->cacheId, + $this->serializerMock ); - $this->assertEquals($expectedResult, $this->_model->getEntityTypes($entity)); + $this->assertEquals($expectedResult, $this->model->getEntityTypes($entity)); } public function getEntityTypesDataProvider() @@ -133,22 +141,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase */ public function testGetFileFormats($value, $expected) { - $this->_configScopeMock->expects( + $this->cacheMock->expects( $this->any() )->method( 'load' )->with( - $this->_cacheId + $this->cacheId )->will( $this->returnValue(false) ); - $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($value)); - $this->_model = new \Magento\ImportExport\Model\Export\Config( - $this->_readerMock, - $this->_configScopeMock, - $this->_cacheId + $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($value)); + $this->model = new \Magento\ImportExport\Model\Export\Config( + $this->readerMock, + $this->cacheMock, + $this->cacheId, + $this->serializerMock ); - $this->assertEquals($expected, $this->_model->getFileFormats('fileFormats')); + $this->assertEquals($expected, $this->model->getFileFormats('fileFormats')); } public function getFileFormatsDataProvider() diff --git a/app/code/Magento/ImportExport/Test/Unit/Model/Import/ConfigTest.php b/app/code/Magento/ImportExport/Test/Unit/Model/Import/ConfigTest.php index 1530c0b4a4d00d00944b6f57c41e1b5410ee9d16..60cd1f50238a46f746ad9e8107f7fd612d4f593b 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Model/Import/ConfigTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Model/Import/ConfigTest.php @@ -8,35 +8,41 @@ namespace Magento\ImportExport\Test\Unit\Model\Import; class ConfigTest extends \PHPUnit_Framework_TestCase { /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\ImportExport\Model\Import\Config\Reader|\PHPUnit_Framework_MockObject_MockObject */ - protected $_readerMock; + protected $readerMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_configScopeMock; + protected $cacheMock; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializerMock; /** * @var string */ - protected $_cacheId = 'some_id'; + protected $cacheId = 'some_id'; /** * @var \Magento\ImportExport\Model\Import\Config */ - protected $_model; + protected $model; protected function setUp() { - $this->_readerMock = $this->getMock( + $this->readerMock = $this->getMock( \Magento\ImportExport\Model\Import\Config\Reader::class, [], [], '', false ); - $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } /** @@ -46,22 +52,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase */ public function testGetEntities($value, $expected) { - $this->_configScopeMock->expects( + $this->cacheMock->expects( $this->any() )->method( 'load' )->with( - $this->_cacheId + $this->cacheId )->will( $this->returnValue(false) ); - $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($value)); - $this->_model = new \Magento\ImportExport\Model\Import\Config( - $this->_readerMock, - $this->_configScopeMock, - $this->_cacheId + $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($value)); + $this->model = new \Magento\ImportExport\Model\Import\Config( + $this->readerMock, + $this->cacheMock, + $this->cacheId, + $this->serializerMock ); - $this->assertEquals($expected, $this->_model->getEntities('entities')); + $this->assertEquals($expected, $this->model->getEntities('entities')); } public function getEntitiesDataProvider() @@ -80,22 +87,23 @@ class ConfigTest extends \PHPUnit_Framework_TestCase */ public function testGetEntityTypes($configData, $entity, $expectedResult) { - $this->_configScopeMock->expects( + $this->cacheMock->expects( $this->any() )->method( 'load' )->with( - $this->_cacheId + $this->cacheId )->will( $this->returnValue(false) ); - $this->_readerMock->expects($this->any())->method('read')->will($this->returnValue($configData)); - $this->_model = new \Magento\ImportExport\Model\Import\Config( - $this->_readerMock, - $this->_configScopeMock, - $this->_cacheId + $this->readerMock->expects($this->any())->method('read')->will($this->returnValue($configData)); + $this->model = new \Magento\ImportExport\Model\Import\Config( + $this->readerMock, + $this->cacheMock, + $this->cacheId, + $this->serializerMock ); - $this->assertEquals($expectedResult, $this->_model->getEntityTypes($entity)); + $this->assertEquals($expectedResult, $this->model->getEntityTypes($entity)); } public function getEntityTypesDataProvider() diff --git a/app/code/Magento/Indexer/Model/Config/Data.php b/app/code/Magento/Indexer/Model/Config/Data.php index 68a390a8c06b761b710b0ab950b56528a4228d22..3cedaa51ef4bb4952799321d5032e90c154b4feb 100644 --- a/app/code/Magento/Indexer/Model/Config/Data.php +++ b/app/code/Magento/Indexer/Model/Config/Data.php @@ -5,6 +5,12 @@ */ namespace Magento\Indexer\Model\Config; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\App\ObjectManager; + +/** + * Provides indexer configuration + */ class Data extends \Magento\Framework\Config\Data { /** @@ -13,22 +19,26 @@ class Data extends \Magento\Framework\Config\Data protected $stateCollection; /** + * Constructor + * * @param \Magento\Framework\Indexer\Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache * @param \Magento\Indexer\Model\ResourceModel\Indexer\State\Collection $stateCollection - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Indexer\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, \Magento\Indexer\Model\ResourceModel\Indexer\State\Collection $stateCollection, - $cacheId = 'indexer_config' + $cacheId = 'indexer_config', + SerializerInterface $serializer = null ) { $this->stateCollection = $stateCollection; $isCacheExists = $cache->test($cacheId); - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); if (!$isCacheExists) { $this->deleteNonexistentStates(); diff --git a/app/code/Magento/Indexer/Test/Unit/Model/Config/DataTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Config/DataTest.php index 5e0f7c314cf31d2189a0540b66d87b983f8dd0e9..e16c21b8f112592e759cca7489a685ae59aa5dbe 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/Config/DataTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/Config/DataTest.php @@ -37,6 +37,11 @@ class DataTest extends \PHPUnit_Framework_TestCase */ protected $indexers = ['indexer1' => [], 'indexer3' => []]; + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + protected function setUp() { $this->reader = $this->getMock(\Magento\Framework\Indexer\Config\Reader::class, ['read'], [], '', false); @@ -56,20 +61,22 @@ class DataTest extends \PHPUnit_Framework_TestCase '', false ); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } public function testConstructorWithCache() { + $serializedData = 'serialized data'; $this->cache->expects($this->once())->method('test')->with($this->cacheId)->will($this->returnValue(true)); - $this->cache->expects( - $this->once() - )->method( - 'load' - )->with( - $this->cacheId - )->will( - $this->returnValue(serialize($this->indexers)) - ); + $this->cache->expects($this->once()) + ->method('load') + ->with($this->cacheId) + ->willReturn($serializedData); + + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedData) + ->willReturn($this->indexers); $this->stateCollection->expects($this->never())->method('getItems'); @@ -77,7 +84,8 @@ class DataTest extends \PHPUnit_Framework_TestCase $this->reader, $this->cache, $this->stateCollection, - $this->cacheId + $this->cacheId, + $this->serializerMock ); } @@ -116,7 +124,8 @@ class DataTest extends \PHPUnit_Framework_TestCase $this->reader, $this->cache, $this->stateCollection, - $this->cacheId + $this->cacheId, + $this->serializerMock ); } } diff --git a/app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml b/app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml index 6def568e9cbbd83fec74955430834f7538418ab9..63ef028238393bbbbcebaeff4c50caa1e94b44db 100644 --- a/app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml +++ b/app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml @@ -46,6 +46,7 @@ <argument name="index" xsi:type="string">title</argument> <argument name="sortable" xsi:type="string">0</argument> <argument name="column_css_class" xsi:type="string">indexer-title</argument> + <argument name="translate" xsi:type="boolean">true</argument> </arguments> </block> <block class="Magento\Backend\Block\Widget\Grid\Column" as="indexer_description"> @@ -54,6 +55,7 @@ <argument name="index" xsi:type="string">description</argument> <argument name="sortable" xsi:type="string">0</argument> <argument name="column_css_class" xsi:type="string">indexer-description</argument> + <argument name="translate" xsi:type="boolean">true</argument> </arguments> </block> <block class="Magento\Backend\Block\Widget\Grid\Column" as="indexer_mode"> diff --git a/app/code/Magento/OfflineShipping/Model/Quote/Address/FreeShipping.php b/app/code/Magento/OfflineShipping/Model/Quote/Address/FreeShipping.php index d2febaccb2fdf3644774f89626e6224bf6e89415..cf9eed3e84d26860792c4d3751e138ad84863eb8 100644 --- a/app/code/Magento/OfflineShipping/Model/Quote/Address/FreeShipping.php +++ b/app/code/Magento/OfflineShipping/Model/Quote/Address/FreeShipping.php @@ -5,8 +5,6 @@ */ namespace Magento\OfflineShipping\Model\Quote\Address; -use Magento\Quote\Model\Quote\Address; - class FreeShipping implements \Magento\Quote\Model\Quote\Address\FreeShippingInterface { /** @@ -48,7 +46,8 @@ class FreeShipping implements \Magento\Quote\Model\Quote\Address\FreeShippingInt $quote->getCustomerGroupId(), $quote->getCouponCode() ); - + $shippingAddress = $quote->getShippingAddress(); + $shippingAddress->setFreeShipping(0); /** @var \Magento\Quote\Api\Data\CartItemInterface $item */ foreach ($items as $item) { if ($item->getNoDiscount()) { @@ -66,10 +65,14 @@ class FreeShipping implements \Magento\Quote\Model\Quote\Address\FreeShippingInt $itemFreeShipping = (bool)$item->getFreeShipping(); $addressFreeShipping = $addressFreeShipping && $itemFreeShipping; + if ($addressFreeShipping && !$item->getAddress()->getFreeShipping()) { + $item->getAddress()->setFreeShipping(true); + } + /** Parent free shipping we apply to all children*/ $this->applyToChildren($item, $itemFreeShipping); } - return $addressFreeShipping; + return (bool)$shippingAddress->getFreeShipping(); } /** diff --git a/app/code/Magento/OfflineShipping/Test/Unit/Model/Quote/Address/FreeShippingTest.php b/app/code/Magento/OfflineShipping/Test/Unit/Model/Quote/Address/FreeShippingTest.php new file mode 100644 index 0000000000000000000000000000000000000000..27f3c375c91c5a70de74c3ed620838ec358144db --- /dev/null +++ b/app/code/Magento/OfflineShipping/Test/Unit/Model/Quote/Address/FreeShippingTest.php @@ -0,0 +1,111 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\OfflineShipping\Test\Unit\Model\Quote\Address; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; + +class FreeShippingTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\OfflineShipping\Model\Quote\Address\FreeShipping + */ + private $model; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Store\Model\StoreManagerInterface + */ + private $storeManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\OfflineShipping\Model\SalesRule\Calculator + */ + private $calculatorMock; + + protected function setUp() + { + $this->storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class); + $this->calculatorMock = $this->getMock( + \Magento\OfflineShipping\Model\SalesRule\Calculator::class, + [], + [], + '', + false + ); + + $this->model = new \Magento\OfflineShipping\Model\Quote\Address\FreeShipping( + $this->storeManagerMock, + $this->calculatorMock + ); + } + + public function testIsFreeShippingIfNoItems() + { + $quoteMock = $this->getMock(\Magento\Quote\Model\Quote::class, [], [], '', false); + $this->assertFalse($this->model->isFreeShipping($quoteMock, [])); + } + + public function testIsFreeShipping() + { + $storeId = 100; + $websiteId = 200; + $customerGroupId = 300; + $objectManagerMock = new ObjectManagerHelper($this); + $quoteMock = $this->getMock( + \Magento\Quote\Model\Quote::class, + ['getShippingAddress', 'getStoreId', 'getCustomerGroupId', 'getCouponCode'], + [], + '', + false + ); + $itemMock = $this->getMock( + \Magento\Quote\Model\Quote\Item::class, + [ + 'getNoDiscount', + 'getParentItemId', + 'getFreeShipping', + 'getAddress', + 'isChildrenCalculated', + 'getHasChildren', + 'getChildren' + ], + [], + '', + false + ); + + $quoteMock->expects($this->once())->method('getStoreId')->willReturn($storeId); + $storeMock = $this->getMock(\Magento\Store\Api\Data\StoreInterface::class); + $storeMock->expects($this->once())->method('getWebsiteId')->willReturn($websiteId); + $this->storeManagerMock->expects($this->once())->method('getStore')->with($storeId)->willReturn($storeMock); + + $quoteMock->expects($this->once())->method('getCustomerGroupId')->willReturn($customerGroupId); + $quoteMock->expects($this->once())->method('getCouponCode')->willReturn(null); + + $this->calculatorMock->expects($this->once()) + ->method('init') + ->with($websiteId, $customerGroupId, null) + ->willReturnSelf(); + + $itemMock->expects($this->once())->method('getNoDiscount')->willReturn(false); + $itemMock->expects($this->once())->method('getParentItemId')->willReturn(false); + $this->calculatorMock->expects($this->exactly(2))->method('processFreeShipping')->willReturnSelf(); + $itemMock->expects($this->once())->method('getFreeShipping')->willReturn(true); + + $addressMock = $objectManagerMock->getObject(\Magento\Quote\Model\Quote\Address::class); + $quoteMock->expects($this->once())->method('getShippingAddress')->willReturn($addressMock); + $itemMock->expects($this->exactly(2))->method('getAddress')->willReturn($addressMock); + + $itemMock->expects($this->once())->method('getHasChildren')->willReturn(true); + $itemMock->expects($this->once())->method('isChildrenCalculated')->willReturn(true); + + $childMock = $this->getMock(\Magento\Quote\Model\Quote\Item::class, ['setFreeShipping'], [], '', false); + $childMock->expects($this->once())->method('setFreeShipping')->with(true)->willReturnSelf(); + $itemMock->expects($this->once())->method('getChildren')->willReturn([$childMock]); + + $this->assertTrue($this->model->isFreeShipping($quoteMock, [$itemMock])); + } +} diff --git a/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/RepositoryTest.php b/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/RepositoryTest.php index dae3d56aa04b093c76d33f671606e2acfedb57af..c6e5241282cd0e9212ad342b0d48ee6da006ed51 100644 --- a/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/RepositoryTest.php +++ b/app/code/Magento/Quote/Test/Unit/Model/Quote/Item/RepositoryTest.php @@ -12,6 +12,11 @@ namespace Magento\Quote\Test\Unit\Model\Quote\Item; */ class RepositoryTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\Quote\Api\CartItemRepositoryInterface */ @@ -68,6 +73,7 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase */ protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->quoteRepositoryMock = $this->getMock(\Magento\Quote\Api\CartRepositoryInterface::class); $this->productRepositoryMock = $this->getMock(\Magento\Catalog\Api\ProductRepositoryInterface::class); $this->itemDataFactoryMock = @@ -100,12 +106,6 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase '', false ); - $this->prepareObjectManager([ - [ - \Magento\Quote\Model\Quote\Item\CartItemOptionsProcessor::class, - $this->optionsProcessorMock - ] - ]); $this->repository = new \Magento\Quote\Model\Quote\Item\Repository( $this->quoteRepositoryMock, @@ -113,6 +113,11 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase $this->itemDataFactoryMock, ['custom_options' => $this->customOptionProcessor] ); + $this->objectManager->setBackwardCompatibleProperty( + $this->repository, + 'cartItemOptionsProcessor', + $this->optionsProcessorMock + ); } /** @@ -246,20 +251,4 @@ class RepositoryTest extends \PHPUnit_Framework_TestCase $this->assertTrue($this->repository->deleteById($cartId, $itemId)); } - - /** - * @param array $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Quote/Test/Unit/Model/ShippingAddressManagementTest.php b/app/code/Magento/Quote/Test/Unit/Model/ShippingAddressManagementTest.php index abae7bae110e6521fbf7b708270eb32cb6792c69..d8e65de847457e243a02d9535196e4c42f0499f8 100644 --- a/app/code/Magento/Quote/Test/Unit/Model/ShippingAddressManagementTest.php +++ b/app/code/Magento/Quote/Test/Unit/Model/ShippingAddressManagementTest.php @@ -104,12 +104,6 @@ class ShippingAddressManagementTest extends \PHPUnit_Framework_TestCase '', false ); - $this->prepareObjectManager([ - [ - \Magento\Quote\Model\Quote\Validator\MinimumOrderAmount\ValidationMessage::class, - $this->amountErrorMessageMock - ] - ]); $this->service = $this->objectManager->getObject( \Magento\Quote\Model\ShippingAddressManagement::class, @@ -122,6 +116,11 @@ class ShippingAddressManagementTest extends \PHPUnit_Framework_TestCase 'addressRepository' => $this->addressRepository ] ); + $this->objectManager->setBackwardCompatibleProperty( + $this->service, + 'minimumAmountErrorMessage', + $this->amountErrorMessageMock + ); } /** @@ -375,20 +374,4 @@ class ShippingAddressManagementTest extends \PHPUnit_Framework_TestCase $this->service->get('cartId'); } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php index f4945508fe722c9308002cbc2b49a4123eacde77..f066bb53b51accc86b7a0141423334aa417739a1 100644 --- a/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php +++ b/app/code/Magento/Review/Model/ResourceModel/Review/Product/Collection.php @@ -7,6 +7,8 @@ namespace Magento\Review\Model\ResourceModel\Review\Product; use Magento\Eav\Model\Entity\Attribute\AbstractAttribute; use Magento\Framework\DB\Select; +use Magento\Framework\EntityManager\MetadataPool; +use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; /** * Review Product Collection @@ -59,7 +61,8 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection protected $_voteFactory; /** - * Collection constructor. + * Collection constructor + * * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy @@ -81,7 +84,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection * @param \Magento\Customer\Api\GroupManagementInterface $groupManagement * @param \Magento\Review\Model\RatingFactory $ratingFactory * @param \Magento\Review\Model\Rating\Option\VoteFactory $voteFactory - * @param mixed $connection + * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection + * @param ProductLimitationFactory|null $productLimitationFactory + * @param MetadataPool|null $metadataPool * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -107,7 +112,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection \Magento\Customer\Api\GroupManagementInterface $groupManagement, \Magento\Review\Model\RatingFactory $ratingFactory, \Magento\Review\Model\Rating\Option\VoteFactory $voteFactory, - \Magento\Framework\DB\Adapter\AdapterInterface $connection = null + \Magento\Framework\DB\Adapter\AdapterInterface $connection = null, + ProductLimitationFactory $productLimitationFactory = null, + MetadataPool $metadataPool = null ) { $this->_ratingFactory = $ratingFactory; $this->_voteFactory = $voteFactory; @@ -131,7 +138,9 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection $customerSession, $dateTime, $groupManagement, - $connection + $connection, + $productLimitationFactory, + $metadataPool ); } diff --git a/app/code/Magento/Review/Test/Unit/Model/ResourceModel/Review/Product/CollectionTest.php b/app/code/Magento/Review/Test/Unit/Model/ResourceModel/Review/Product/CollectionTest.php index b1a1b9a69c7ff9905954385d7d685b87f9e2d273..8c51535a7f6ab9e40c1186315d9302eba760cc23 100644 --- a/app/code/Magento/Review/Test/Unit/Model/ResourceModel/Review/Product/CollectionTest.php +++ b/app/code/Magento/Review/Test/Unit/Model/ResourceModel/Review/Product/CollectionTest.php @@ -5,11 +5,18 @@ */ namespace Magento\Review\Test\Unit\Model\ResourceModel\Review\Product; +use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; + /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class CollectionTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\Review\Model\ResourceModel\Review\Product\Collection */ @@ -74,16 +81,23 @@ class CollectionTest extends \PHPUnit_Framework_TestCase false ); $fetchStrategy->expects($this->any())->method('fetchAll')->will($this->returnValue([])); - $this->model = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this)) - ->getObject( - \Magento\Review\Model\ResourceModel\Review\Product\Collection::class, - [ - 'universalFactory' => $universalFactory, - 'storeManager' => $storeManager, - 'eavConfig' => $eavConfig, - 'fetchStrategy' => $fetchStrategy - ] - ); + $productLimitationMock = $this->getMock( + \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation::class + ); + $productLimitationFactoryMock = $this->getMock(ProductLimitationFactory::class, ['create']); + $productLimitationFactoryMock->method('create') + ->willReturn($productLimitationMock); + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->model = $this->objectManager->getObject( + \Magento\Review\Model\ResourceModel\Review\Product\Collection::class, + [ + 'universalFactory' => $universalFactory, + 'storeManager' => $storeManager, + 'eavConfig' => $eavConfig, + 'fetchStrategy' => $fetchStrategy, + 'productLimitationFactory' => $productLimitationFactoryMock + ] + ); } /** diff --git a/app/code/Magento/Rss/Model/Rss.php b/app/code/Magento/Rss/Model/Rss.php index 0f228cb9a21c2f6c8ca64a2692f309bbfaced855..af716613bd2612cce965c386e1bb8eac107a4222 100644 --- a/app/code/Magento/Rss/Model/Rss.php +++ b/app/code/Magento/Rss/Model/Rss.php @@ -5,13 +5,10 @@ */ namespace Magento\Rss\Model; +use Magento\Framework\App\ObjectManager; use Magento\Framework\App\Rss\DataProviderInterface; +use Magento\Framework\Serialize\SerializerInterface; -/** - * Auth session model - * - * @author Magento Core Team <core@magentocommerce.com> - */ class Rss { /** @@ -25,11 +22,22 @@ class Rss protected $cache; /** + * @var SerializerInterface + */ + private $serializer; + + /** + * Rss constructor + * * @param \Magento\Framework\App\CacheInterface $cache + * @param SerializerInterface|null $serializer */ - public function __construct(\Magento\Framework\App\CacheInterface $cache) - { + public function __construct( + \Magento\Framework\App\CacheInterface $cache, + SerializerInterface $serializer = null + ) { $this->cache = $cache; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); } /** @@ -46,14 +54,14 @@ class Rss } if ($cache) { - return unserialize($cache); + return $this->serializer->unserialize($cache); } $data = $this->dataProvider->getRssData(); if ($this->dataProvider->getCacheKey() && $this->dataProvider->getCacheLifetime()) { $this->cache->save( - serialize($data), + $this->serializer->serialize($data), $this->dataProvider->getCacheKey(), ['rss'], $this->dataProvider->getCacheLifetime() diff --git a/app/code/Magento/Rss/Test/Unit/Model/RssTest.php b/app/code/Magento/Rss/Test/Unit/Model/RssTest.php index 7a12c4818e71a16a7ffc1b4f41cff78cb547798f..0c5eb303935ff37c084fb0e27803e2ef40a17f95 100644 --- a/app/code/Magento/Rss/Test/Unit/Model/RssTest.php +++ b/app/code/Magento/Rss/Test/Unit/Model/RssTest.php @@ -6,6 +6,7 @@ namespace Magento\Rss\Test\Unit\Model; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; class RssTest extends \PHPUnit_Framework_TestCase @@ -40,17 +41,23 @@ class RssTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\App\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheInterface; + private $cacheMock; + + /** + * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; protected function setUp() { - $this->cacheInterface = $this->getMock(\Magento\Framework\App\CacheInterface::class); - + $this->cacheMock = $this->getMock(\Magento\Framework\App\CacheInterface::class); + $this->serializerMock = $this->getMock(SerializerInterface::class); $this->objectManagerHelper = new ObjectManagerHelper($this); $this->rss = $this->objectManagerHelper->getObject( \Magento\Rss\Model\Rss::class, [ - 'cache' => $this->cacheInterface + 'cache' => $this->cacheMock, + 'serializer' => $this->serializerMock ] ); } @@ -64,8 +71,18 @@ class RssTest extends \PHPUnit_Framework_TestCase $this->rss->setDataProvider($dataProvider); - $this->cacheInterface->expects($this->once())->method('load')->will($this->returnValue(false)); - $this->cacheInterface->expects($this->once())->method('save')->will($this->returnValue(true)); + $this->cacheMock->expects($this->once()) + ->method('load') + ->with('cache_key') + ->will($this->returnValue(false)); + $this->cacheMock->expects($this->once()) + ->method('save') + ->with('serializedData') + ->will($this->returnValue(true)); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($this->feedData) + ->willReturn('serializedData'); $this->assertEquals($this->feedData, $this->rss->getFeeds()); } @@ -79,9 +96,15 @@ class RssTest extends \PHPUnit_Framework_TestCase $this->rss->setDataProvider($dataProvider); - $this->cacheInterface->expects($this->once())->method('load') - ->will($this->returnValue(serialize($this->feedData))); - $this->cacheInterface->expects($this->never())->method('save'); + $this->cacheMock->expects($this->once()) + ->method('load') + ->with('cache_key') + ->will($this->returnValue('serializedData')); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with('serializedData') + ->willReturn($this->feedData); + $this->cacheMock->expects($this->never())->method('save'); $this->assertEquals($this->feedData, $this->rss->getFeeds()); } diff --git a/app/code/Magento/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php index 45f0c092c4aece714653feec67abdaf36b2def0c..73e3db2c8a35895c8943284a62377d1a4e03d592 100644 --- a/app/code/Magento/Rule/Model/AbstractModel.php +++ b/app/code/Magento/Rule/Model/AbstractModel.php @@ -3,9 +3,11 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Rule\Model; +use Magento\Framework\Api\AttributeValueFactory; +use Magento\Framework\Api\ExtensionAttributesFactory; + /** * Abstract Rule entity data model * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -76,7 +78,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible protected $_localeDate; /** - * AbstractModel constructor. + * AbstractModel constructor * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -85,6 +87,8 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection * @param array $data + * @param ExtensionAttributesFactory|null $extensionFactory + * @param AttributeValueFactory|null $customAttributeFactory */ public function __construct( \Magento\Framework\Model\Context $context, @@ -93,15 +97,17 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, - array $data = [] + array $data = [], + ExtensionAttributesFactory $extensionFactory = null, + AttributeValueFactory $customAttributeFactory = null ) { $this->_formFactory = $formFactory; $this->_localeDate = $localeDate; parent::__construct( $context, $registry, - $this->getExtensionFactory(), - $this->getCustomAttributeFactory(), + $extensionFactory ?: $this->getExtensionFactory(), + $customAttributeFactory ?: $this->getCustomAttributeFactory(), $resource, $resourceCollection, $data diff --git a/app/code/Magento/Sales/Block/Status/Grid/Column/State.php b/app/code/Magento/Sales/Block/Status/Grid/Column/State.php index cd049799e7b497b5b657bd03122a2dcf4e2986ab..ae9ea20fd35fd110e796d87564409cadcd8fe57e 100644 --- a/app/code/Magento/Sales/Block/Status/Grid/Column/State.php +++ b/app/code/Magento/Sales/Block/Status/Grid/Column/State.php @@ -49,8 +49,9 @@ class State extends \Magento\Backend\Block\Widget\Grid\Column */ public function decorateState($value, $row, $column, $isExport) { + $status = $row->getStatus(); if ($value) { - $cell = $value . '[' . $this->_config->getStateLabel($value) . ']'; + $cell = $value . '[' . $this->_config->getStateLabelByStateAndStatus($value, $status) . ']'; } else { $cell = $value; } diff --git a/app/code/Magento/Sales/Model/Config/Data.php b/app/code/Magento/Sales/Model/Config/Data.php index 6d3d3a2ac123459bb1734a8f0456c98442e216c2..b6a1b43012f9e8ba55c4440d78cde41a0d6e2dfc 100644 --- a/app/code/Magento/Sales/Model/Config/Data.php +++ b/app/code/Magento/Sales/Model/Config/Data.php @@ -3,24 +3,29 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ +namespace Magento\Sales\Model\Config; + +use Magento\Framework\Serialize\SerializerInterface; /** - * Sales configuration data container + * Provides sales configuration */ -namespace Magento\Sales\Model\Config; - class Data extends \Magento\Framework\Config\Data { /** - * @param \Magento\Sales\Model\Config\Reader $reader + * Constructor + * + * @param Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Sales\Model\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'sales_totals_config_cache' + $cacheId = 'sales_totals_config_cache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } } diff --git a/app/code/Magento/Sales/Model/Order/Config.php b/app/code/Magento/Sales/Model/Order/Config.php index 8c6f2e55f55acfa9ea8b0c26e25efac97f330f30..535e2975ee13da8458cba83666ba49abb942a89a 100644 --- a/app/code/Magento/Sales/Model/Order/Config.php +++ b/app/code/Magento/Sales/Model/Order/Config.php @@ -256,4 +256,22 @@ class Config } return $this->statuses[(bool) $visibility]; } + + /** + * Retrieve label by state and status + * + * @param string $state + * @param string $status + * @return \Magento\Framework\Phrase|string + */ + public function getStateLabelByStateAndStatus($state, $status) + { + foreach ($this->_getCollection() as $item) { + if ($item->getData('state') == $state && $item->getData('status') == $status) { + $label = $item->getData('label'); + return __($label); + } + } + return $state; + } } diff --git a/app/code/Magento/Sales/Setup/UpgradeSchema.php b/app/code/Magento/Sales/Setup/UpgradeSchema.php index d35825242fb291a41961eb882ad93f7d24c58ee9..288e8085a0dab51947905ed0254e69c8479e79ff 100644 --- a/app/code/Magento/Sales/Setup/UpgradeSchema.php +++ b/app/code/Magento/Sales/Setup/UpgradeSchema.php @@ -76,8 +76,9 @@ class UpgradeSchema implements UpgradeSchemaInterface 'sales_shipment_grid', ]; foreach ($tables as $table) { - $setup->getConnection()->modifyColumn( - $setup->getTable($table), + $salesConnection = $setup->getConnection(self::$connectionName); + $salesConnection->modifyColumn( + $installer->getTable($table, self::$connectionName), 'customer_group_id', ['type' => 'integer'] ); diff --git a/app/code/Magento/Sales/Test/Unit/Block/Status/Grid/Column/StateTest.php b/app/code/Magento/Sales/Test/Unit/Block/Status/Grid/Column/StateTest.php new file mode 100644 index 0000000000000000000000000000000000000000..59e7accb583d051a62821276a3c6521c8abb54f2 --- /dev/null +++ b/app/code/Magento/Sales/Test/Unit/Block/Status/Grid/Column/StateTest.php @@ -0,0 +1,91 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Sales\Test\Unit\Block\Status\Grid\Column; + +class StateTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Sales\Block\Status\Grid\Column\State + */ + private $stateColumn; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $orderStatusCollectionFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $configMock; + + protected function setUp() + { + $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->orderStatusCollectionFactoryMock = $this->getMock( + \Magento\Sales\Model\ResourceModel\Order\Status\CollectionFactory::class, + ['create'], + [], + '', + false, + false + ); + $this->configMock = $helper->getObject( + \Magento\Sales\Model\Order\Config::class, + [ + 'orderStatusCollectionFactory' => $this->orderStatusCollectionFactoryMock + ] + ); + $this->stateColumn = $helper + ->getObject( + \Magento\Sales\Block\Status\Grid\Column\State::class, + [ + 'config' => $this->configMock, + ] + ); + } + + public function testDecorateState() + { + $rowMock = $this->getMock(\Magento\Sales\Model\Order\Status::class, [], [], '', false); + $rowMock->expects($this->any())->method('getStatus')->willReturn('fraud'); + $columnMock = $this->getMock(\Magento\Backend\Block\Widget\Grid\Column::class, [], [], '', false); + $statuses = [ + new \Magento\Framework\DataObject( + [ + 'status' => 'fraud', + 'state' => 'processing', + 'label' => 'Suspected Fraud', + ] + ), + new \Magento\Framework\DataObject( + [ + 'status' => 'processing', + 'state' => 'processing', + 'label' => 'Processing', + ] + ) + ]; + $collectionMock = $this->getMock( + \Magento\Sales\Model\ResourceModel\Order\Status\Collection::class, + ['create', 'joinStates'], + [], + '', + false, + false + ); + $this->orderStatusCollectionFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($collectionMock)); + $collectionMock->expects($this->once()) + ->method('joinStates') + ->will($this->returnValue($statuses)); + + $result = $this->stateColumn->decorateState('processing', $rowMock, $columnMock, false); + $this->assertSame('processing[processing]', $result); + } +} diff --git a/app/code/Magento/Sales/Test/Unit/Model/Config/DataTest.php b/app/code/Magento/Sales/Test/Unit/Model/Config/DataTest.php index 722fdb2b9495fd86413eeda76a8abc041a0722dc..0c342ff115eaff8d761c8b1ac7c395b724daefb2 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Config/DataTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Config/DataTest.php @@ -7,31 +7,56 @@ namespace Magento\Sales\Test\Unit\Model\Config; class DataTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_readerMock; + private $_readerMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_cacheMock; + private $_cacheMock; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->_readerMock = $this->getMockBuilder( \Magento\Sales\Model\Config\Reader::class )->disableOriginalConstructor()->getMock(); $this->_cacheMock = $this->getMockBuilder( \Magento\Framework\App\Cache\Type\Config::class )->disableOriginalConstructor()->getMock(); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } public function testGet() { $expected = ['someData' => ['someValue', 'someKey' => 'someValue']]; - $this->_cacheMock->expects($this->any())->method('load')->will($this->returnValue(serialize($expected))); - $configData = new \Magento\Sales\Model\Config\Data($this->_readerMock, $this->_cacheMock); + $this->_cacheMock->expects($this->once()) + ->method('load'); + + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->willReturn($expected); + + $configData = $this->objectManager->getObject( + \Magento\Sales\Model\Config\Data::class, + [ + 'reader' => $this->_readerMock, + 'cache' => $this->_cacheMock, + 'serializer' => $this->serializerMock, + ] + ); $this->assertEquals($expected, $configData->get()); } diff --git a/app/code/Magento/Sales/Test/Unit/Model/Order/ConfigTest.php b/app/code/Magento/Sales/Test/Unit/Model/Order/ConfigTest.php index 1f29235efaef29a790daccd7cf16447d9254adac..7ee4f745cde8f75de23147c956ca0bf039ab2e3a 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Order/ConfigTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Order/ConfigTest.php @@ -5,8 +5,6 @@ */ namespace Magento\Sales\Test\Unit\Model\Order; -use \Magento\Sales\Model\Order\Config; - /** * Class ConfigTest */ @@ -95,4 +93,40 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $result = $this->salesConfig->getInvisibleOnFrontStatuses(); $this->assertSame($expectedResult, $result); } + + public function testGetStateLabelByStateAndStatus() + { + $statuses = [ + new \Magento\Framework\DataObject( + [ + 'status' => 'fraud', + 'state' => 'processing', + 'label' => 'Suspected Fraud', + ] + ), + new \Magento\Framework\DataObject( + [ + 'status' => 'processing', + 'state' => 'processing', + 'label' => 'Processing', + ] + ) + ]; + $collectionMock = $this->getMock( + \Magento\Sales\Model\ResourceModel\Order\Status\Collection::class, + ['create', 'joinStates'], + [], + '', + false, + false + ); + $this->orderStatusCollectionFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($collectionMock)); + $collectionMock->expects($this->once()) + ->method('joinStates') + ->will($this->returnValue($statuses)); + $result = $this->salesConfig->getStateLabelByStateAndStatus('processing', 'fraud'); + $this->assertSame('Suspected Fraud', $result->getText()); + } } diff --git a/app/code/Magento/SalesRule/Model/ResourceModel/Rule.php b/app/code/Magento/SalesRule/Model/ResourceModel/Rule.php index 78cc3e1c39c275055811fb38db1474634c2b0386..0398508eccf3ef621afb1a0b1cb0f0753128bd14 100644 --- a/app/code/Magento/SalesRule/Model/ResourceModel/Rule.php +++ b/app/code/Magento/SalesRule/Model/ResourceModel/Rule.php @@ -5,12 +5,11 @@ */ namespace Magento\SalesRule\Model\ResourceModel; +use Magento\Framework\App\ObjectManager; use \Magento\SalesRule\Model\Rule as SalesRule; use Magento\Framework\Model\AbstractModel; -use Magento\Framework\DB\Select; use Magento\Rule\Model\ResourceModel\AbstractResource; use Magento\Framework\EntityManager\EntityManager; -use Magento\SalesRule\Api\Data\RuleInterface; /** * Sales Rule resource model @@ -56,16 +55,21 @@ class Rule extends AbstractResource * @param \Magento\Framework\Stdlib\StringUtils $string * @param \Magento\SalesRule\Model\ResourceModel\Coupon $resourceCoupon * @param string $connectionName + * @param \Magento\Framework\DataObject|null $associatedEntityMapInstance */ public function __construct( \Magento\Framework\Model\ResourceModel\Db\Context $context, \Magento\Framework\Stdlib\StringUtils $string, \Magento\SalesRule\Model\ResourceModel\Coupon $resourceCoupon, - $connectionName = null + $connectionName = null, + \Magento\Framework\DataObject $associatedEntityMapInstance = null ) { $this->string = $string; $this->_resourceCoupon = $resourceCoupon; - $this->_associatedEntitiesMap = $this->getAssociatedEntitiesMap(); + $associatedEntitiesMapInstance = $associatedEntityMapInstance ?: ObjectManager::getInstance()->get( + \Magento\SalesRule\Model\ResourceModel\Rule\AssociatedEntityMap::class + ); + $this->_associatedEntitiesMap = $associatedEntitiesMapInstance->getData(); parent::__construct($context, $connectionName); } @@ -380,20 +384,6 @@ class Rule extends AbstractResource return $this; } - /** - * @return array - * @deprecated - */ - private function getAssociatedEntitiesMap() - { - if (!$this->_associatedEntitiesMap) { - $this->_associatedEntitiesMap = \Magento\Framework\App\ObjectManager::getInstance() - ->get(\Magento\SalesRule\Model\ResourceModel\Rule\AssociatedEntityMap::class) - ->getData(); - } - return $this->_associatedEntitiesMap; - } - /** * @return \Magento\Framework\EntityManager\EntityManager * @deprecated diff --git a/app/code/Magento/SalesRule/Model/Rule.php b/app/code/Magento/SalesRule/Model/Rule.php index 3253c040ac9f90398cf7388870fca5598980309a..033c0ebd5be90b523bed4da381aa059ba8d7d3a9 100644 --- a/app/code/Magento/SalesRule/Model/Rule.php +++ b/app/code/Magento/SalesRule/Model/Rule.php @@ -5,6 +5,8 @@ */ namespace Magento\SalesRule\Model; +use Magento\Framework\Api\AttributeValueFactory; +use Magento\Framework\Api\ExtensionAttributesFactory; use Magento\Quote\Model\Quote\Address; /** @@ -171,6 +173,8 @@ class Rule extends \Magento\Rule\Model\AbstractModel protected $_storeManager; /** + * Rule constructor + * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Data\FormFactory $formFactory @@ -184,6 +188,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection * @param array $data + * @param ExtensionAttributesFactory|null $extensionFactory + * @param AttributeValueFactory|null $customAttributeFactory + * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -199,7 +206,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, - array $data = [] + array $data = [], + ExtensionAttributesFactory $extensionFactory = null, + AttributeValueFactory $customAttributeFactory = null ) { $this->_couponFactory = $couponFactory; $this->_codegenFactory = $codegenFactory; @@ -214,7 +223,9 @@ class Rule extends \Magento\Rule\Model\AbstractModel $localeDate, $resource, $resourceCollection, - $data + $data, + $extensionFactory, + $customAttributeFactory ); } diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/RuleTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/RuleTest.php index 5c60007543916f163f5e13ea8c83bf1a0e178be7..763e77f94f7a277c592a294c426b4f1478e51248 100644 --- a/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/RuleTest.php +++ b/app/code/Magento/SalesRule/Test/Unit/Model/ResourceModel/RuleTest.php @@ -3,16 +3,18 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\SalesRule\Test\Unit\Model\ResourceModel; -use Magento\SalesRule\Api\Data\RuleInterface; - /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class RuleTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\SalesRule\Model\ResourceModel\Rule */ @@ -60,7 +62,7 @@ class RuleTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->rule = $this->getMockBuilder(\Magento\SalesRule\Model\Rule::class) ->disableOriginalConstructor() ->getMock(); @@ -117,7 +119,13 @@ class RuleTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $associatedEntitiesMap = $this->getMock(\Magento\Framework\DataObject::class, [], [], '', false); + $associatedEntitiesMap = $this->getMock( + \Magento\Framework\DataObject::class, + ['getData'], + [], + '', + false + ); $associatedEntitiesMap->expects($this->once()) ->method('getData') ->willReturn( @@ -135,19 +143,13 @@ class RuleTest extends \PHPUnit_Framework_TestCase ] ); - $this->prepareObjectManager([ - [ - \Magento\SalesRule\Model\ResourceModel\Rule\AssociatedEntityMap::class, - $associatedEntitiesMap - ], - ]); - - $this->model = $objectManager->getObject( + $this->model = $this->objectManager->getObject( \Magento\SalesRule\Model\ResourceModel\Rule::class, [ 'context' => $context, 'connectionName' => $connectionName, 'entityManager' => $this->entityManager, + 'associatedEntityMapInstance' => $associatedEntitiesMap ] ); } @@ -184,20 +186,4 @@ class RuleTest extends \PHPUnit_Framework_TestCase ->with($this->rule); $this->assertEquals($this->model->delete($this->rule), $this->model); } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/SalesRule/Test/Unit/Model/RuleTest.php b/app/code/Magento/SalesRule/Test/Unit/Model/RuleTest.php index f3d16c188fdf9dec8d2404d52fd01047a5deed6f..48cd2ab7c4850450d5c62986619877531fc382b4 100644 --- a/app/code/Magento/SalesRule/Test/Unit/Model/RuleTest.php +++ b/app/code/Magento/SalesRule/Test/Unit/Model/RuleTest.php @@ -3,7 +3,6 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\SalesRule\Test\Unit\Model; class RuleTest extends \PHPUnit_Framework_TestCase @@ -57,17 +56,6 @@ class RuleTest extends \PHPUnit_Framework_TestCase ->setMethods(['create']) ->getMock(); - $this->prepareObjectManager([ - [ - \Magento\Framework\Api\ExtensionAttributesFactory::class, - $this->getMock(\Magento\Framework\Api\ExtensionAttributesFactory::class, [], [], '', false) - ], - [ - \Magento\Framework\Api\AttributeValueFactory::class, - $this->getMock(\Magento\Framework\Api\AttributeValueFactory::class, [], [], '', false) - ], - ]); - $this->model = $objectManager->getObject( \Magento\SalesRule\Model\Rule::class, [ @@ -179,20 +167,4 @@ class RuleTest extends \PHPUnit_Framework_TestCase $expectedResult = 'form_namerule_actions_fieldset_100'; $this->assertEquals($expectedResult, $this->model->getActionsFieldSetId($formName)); } - - /** - * @param $map - */ - private function prepareObjectManager($map) - { - $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $objectManagerMock->expects($this->any())->method('getInstance')->willReturnSelf(); - $objectManagerMock->expects($this->any()) - ->method('get') - ->will($this->returnValueMap($map)); - $reflectionClass = new \ReflectionClass(\Magento\Framework\App\ObjectManager::class); - $reflectionProperty = $reflectionClass->getProperty('_instance'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($objectManagerMock); - } } diff --git a/app/code/Magento/Search/Model/SearchEngine/Config/Data.php b/app/code/Magento/Search/Model/SearchEngine/Config/Data.php index 18a3b620eee18d1905d9c0cc533d358e05044c53..d128a9d50025d8f69437284ba2d42a5ae5f022ff 100644 --- a/app/code/Magento/Search/Model/SearchEngine/Config/Data.php +++ b/app/code/Magento/Search/Model/SearchEngine/Config/Data.php @@ -5,6 +5,11 @@ */ namespace Magento\Search\Model\SearchEngine\Config; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides search engine configuration + */ class Data extends \Magento\Framework\Config\Data { /** @@ -12,13 +17,15 @@ class Data extends \Magento\Framework\Config\Data * * @param \Magento\Framework\Search\SearchEngine\Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Search\SearchEngine\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'search_engine_config_cache' + $cacheId = 'search_engine_config_cache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } } diff --git a/app/code/Magento/Store/App/Config/Source/RuntimeConfigSource.php b/app/code/Magento/Store/App/Config/Source/RuntimeConfigSource.php new file mode 100644 index 0000000000000000000000000000000000000000..015ba1d6ef63392cf3c4ac6ec7d6f38a1777c80b --- /dev/null +++ b/app/code/Magento/Store/App/Config/Source/RuntimeConfigSource.php @@ -0,0 +1,197 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\App\Config\Source; + +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\App\DeploymentConfig; +use Magento\Store\Model\ResourceModel\Website\CollectionFactory as WebsiteCollectionFactory; +use Magento\Store\Model\ResourceModel\Group\CollectionFactory as GroupCollectionFactory; +use Magento\Store\Model\ResourceModel\Store\CollectionFactory as StoreCollectionFactory; +use Magento\Store\Model\WebsiteFactory; +use Magento\Store\Model\GroupFactory; +use Magento\Store\Model\StoreFactory; + +/** + * Class RuntimeConfigSource + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class RuntimeConfigSource implements ConfigSourceInterface +{ + /** + * @var WebsiteCollectionFactory + */ + private $websiteCollectionFactory; + + /** + * @var GroupCollectionFactory + */ + private $groupCollectionFactory; + + /** + * @var StoreCollectionFactory + */ + private $storeCollectionFactory; + + /** + * @var DeploymentConfig + */ + private $deploymentConfig; + + /** + * @var WebsiteFactory + */ + private $websiteFactory; + + /** + * @var GroupFactory + */ + private $groupFactory; + + /** + * @var StoreFactory + */ + private $storeFactory; + + /** + * DynamicDataProvider constructor. + * + * @param WebsiteCollectionFactory $websiteCollectionFactory + * @param GroupCollectionFactory $groupCollectionFactory + * @param StoreCollectionFactory $storeCollectionFactory + * @param WebsiteFactory $websiteFactory + * @param GroupFactory $groupFactory + * @param StoreFactory $storeFactory + * @param DeploymentConfig $deploymentConfig + */ + public function __construct( + WebsiteCollectionFactory $websiteCollectionFactory, + GroupCollectionFactory $groupCollectionFactory, + StoreCollectionFactory $storeCollectionFactory, + WebsiteFactory $websiteFactory, + GroupFactory $groupFactory, + StoreFactory $storeFactory, + DeploymentConfig $deploymentConfig + ) { + $this->websiteCollectionFactory = $websiteCollectionFactory; + $this->groupCollectionFactory = $groupCollectionFactory; + $this->storeCollectionFactory = $storeCollectionFactory; + $this->deploymentConfig = $deploymentConfig; + $this->websiteFactory = $websiteFactory; + $this->groupFactory = $groupFactory; + $this->storeFactory = $storeFactory; + } + + /** + * @inheritdoc + */ + public function get($path = '') + { + if (strpos($path, '/') === false) { + $scopePool = $path; + $scopeCode = null; + } else { + list($scopePool, $scopeCode) = explode('/', $path); + } + + $data = []; + if ($this->canUseDatabase()) { + switch ($scopePool) { + case 'websites': + $data = $this->getWebsitesData($scopeCode); + break; + case 'groups': + $data = $this->getGroupsData($scopeCode); + break; + case 'stores': + $data = $this->getStoresData($scopeCode); + break; + default: + $data = [ + 'websites' => $this->getWebsitesData(), + 'groups' => $this->getGroupsData(), + 'stores' => $this->getStoresData(), + ]; + break; + } + } + + return $data; + } + + /** + * @param string|null $code + * @return array + */ + private function getWebsitesData($code = null) + { + if ($code) { + $website = $this->websiteFactory->create(); + $website->load($code); + $data = $website->getData(); + } else { + $collection = $this->websiteCollectionFactory->create(); + $collection->setLoadDefault(true); + $data = []; + foreach ($collection as $website) { + $data[$website->getCode()] = $website->getData(); + } + } + return $data; + } + + /** + * @param string|null $id + * @return array + */ + private function getGroupsData($id = null) + { + if ($id) { + $group = $this->groupFactory->create(); + $group->load($id); + $data = $group->getData(); + } else { + $collection = $this->groupCollectionFactory->create(); + $collection->setLoadDefault(true); + $data = []; + foreach ($collection as $group) { + $data[$group->getId()] = $group->getData(); + } + } + return $data; + } + + /** + * @param string|null $code + * @return array + */ + private function getStoresData($code = null) + { + if ($code) { + $store = $this->storeFactory->create(); + $store->load($code, 'code'); + $data = $store->getData(); + } else { + $collection = $this->storeCollectionFactory->create(); + $collection->setLoadDefault(true); + $data = []; + foreach ($collection as $store) { + $data[$store->getCode()] = $store->getData(); + } + return $data; + } + return $data; + } + + /** + * Check whether db connection is available and can be used + * + * @return bool + */ + private function canUseDatabase() + { + return $this->deploymentConfig->get('db'); + } +} diff --git a/app/code/Magento/Store/App/Config/Type/Scopes.php b/app/code/Magento/Store/App/Config/Type/Scopes.php new file mode 100644 index 0000000000000000000000000000000000000000..1c9ac59442163945f6aab2739807afdd74be7673 --- /dev/null +++ b/app/code/Magento/Store/App/Config/Type/Scopes.php @@ -0,0 +1,62 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\App\Config\Type; + +use Magento\Framework\App\Config\ConfigTypeInterface; +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\DataObject; + +/** + * Merge and hold scopes data from different sources + * + * @package Magento\Store\App\Config\Type + */ +class Scopes implements ConfigTypeInterface +{ + const CONFIG_TYPE = 'scopes'; + + /** + * @var ConfigSourceInterface + */ + private $source; + + /** + * @var DataObject[] + */ + private $data; + + /** + * System constructor. + * @param ConfigSourceInterface $source + */ + public function __construct( + ConfigSourceInterface $source + ) { + $this->source = $source; + } + + /** + * @inheritdoc + */ + public function get($path = '') + { + if (!$this->data) { + $this->data = new DataObject($this->source->get()); + } + + return $this->data->getData($path); + } + + /** + * Clean cache + * + * @return void + */ + public function clean() + { + $this->data = null; + } +} diff --git a/app/code/Magento/Store/Model/Config/Converter.php b/app/code/Magento/Store/Model/Config/Converter.php index 9cc898e58207a890e7f8eaaf3730a01e88f83181..939544399d517f7adc73da6f8ee1ac32948721eb 100644 --- a/app/code/Magento/Store/Model/Config/Converter.php +++ b/app/code/Magento/Store/Model/Config/Converter.php @@ -7,21 +7,11 @@ */ namespace Magento\Store\Model\Config; +/** + * Class Converter. + */ class Converter extends \Magento\Framework\App\Config\Scope\Converter { - /** - * @var \Magento\Store\Model\Config\Processor\Placeholder - */ - protected $_processor; - - /** - * @param \Magento\Store\Model\Config\Processor\Placeholder $processor - */ - public function __construct(\Magento\Store\Model\Config\Processor\Placeholder $processor) - { - $this->_processor = $processor; - } - /** * Convert config data * @@ -31,7 +21,6 @@ class Converter extends \Magento\Framework\App\Config\Scope\Converter */ public function convert($source, $initialConfig = []) { - $config = array_replace_recursive($initialConfig, parent::convert($source)); - return $this->_processor->process($config); + return array_replace_recursive($initialConfig, parent::convert($source)); } } diff --git a/app/code/Magento/Store/Model/Config/Placeholder.php b/app/code/Magento/Store/Model/Config/Placeholder.php new file mode 100644 index 0000000000000000000000000000000000000000..af313c82b949aeaf177655c08d3af4003a3ae2e0 --- /dev/null +++ b/app/code/Magento/Store/Model/Config/Placeholder.php @@ -0,0 +1,165 @@ +<?php +/** + * Placeholder configuration values processor. Replace placeholders in configuration with config values + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model\Config; + +class Placeholder +{ + /** + * @var \Magento\Framework\App\RequestInterface + */ + protected $request; + + /** + * @var string[] + */ + protected $urlPaths; + + /** + * @var string + */ + protected $urlPlaceholder; + + /** + * @param \Magento\Framework\App\RequestInterface $request + * @param string[] $urlPaths + * @param string $urlPlaceholder + */ + public function __construct(\Magento\Framework\App\RequestInterface $request, $urlPaths, $urlPlaceholder) + { + $this->request = $request; + $this->urlPaths = $urlPaths; + $this->urlPlaceholder = $urlPlaceholder; + } + + /** + * Replace placeholders with config values + * + * @param array $data + * @return array + */ + public function process(array $data = []) + { + foreach (array_keys($data) as $key) { + $this->_processData($data, $key); + } + return $data; + } + + /** + * Process array data recursively + * + * @param array &$data + * @param string $path + * @return void + */ + protected function _processData(&$data, $path) + { + $configValue = $this->_getValue($path, $data); + if (is_array($configValue)) { + foreach (array_keys($configValue) as $key) { + $this->_processData($data, $path . '/' . $key); + } + } else { + $this->_setValue($data, $path, $this->_processPlaceholders($configValue, $data)); + } + } + + /** + * Replace placeholders with config values + * + * @param string $value + * @param array $data + * @return string + */ + protected function _processPlaceholders($value, $data) + { + $placeholder = $this->_getPlaceholder($value); + if ($placeholder) { + $url = false; + if ($placeholder == 'unsecure_base_url') { + $url = $this->_getValue($this->urlPaths['unsecureBaseUrl'], $data); + } elseif ($placeholder == 'secure_base_url') { + $url = $this->_getValue($this->urlPaths['secureBaseUrl'], $data); + } + + if ($url) { + $value = str_replace('{{' . $placeholder . '}}', $url, $value); + } elseif (strpos($value, $this->urlPlaceholder) !== false) { + $distroBaseUrl = $this->request->getDistroBaseUrl(); + $value = str_replace($this->urlPlaceholder, $distroBaseUrl, $value); + } + + if (null !== $this->_getPlaceholder($value)) { + $value = $this->_processPlaceholders($value, $data); + } + } + return $value; + } + + /** + * Get placeholder from value + * + * @param string $value + * @return string|null + */ + protected function _getPlaceholder($value) + { + if (is_string($value) && preg_match('/{{(.*)}}.*/', $value, $matches)) { + $placeholder = $matches[1]; + if ($placeholder == 'unsecure_base_url' || $placeholder == 'secure_base_url' || strpos( + $value, + $this->urlPlaceholder + ) !== false + ) { + return $placeholder; + } + } + return null; + } + + /** + * Get array value by path + * + * @param string $path + * @param array $data + * @return array|null + */ + protected function _getValue($path, array $data) + { + $keys = explode('/', $path); + foreach ($keys as $key) { + if (is_array($data) && (isset($data[$key]) || array_key_exists($key, $data))) { + $data = $data[$key]; + } else { + return null; + } + } + return $data; + } + + /** + * Set array value by path + * + * @param array &$container + * @param string $path + * @param string $value + * @return void + */ + protected function _setValue(array &$container, $path, $value) + { + $segments = explode('/', $path); + $currentPointer = & $container; + foreach ($segments as $segment) { + if (!isset($currentPointer[$segment])) { + $currentPointer[$segment] = []; + } + $currentPointer = & $currentPointer[$segment]; + } + $currentPointer = $value; + } +} diff --git a/app/code/Magento/Store/Model/Config/Processor/Fallback.php b/app/code/Magento/Store/Model/Config/Processor/Fallback.php new file mode 100644 index 0000000000000000000000000000000000000000..612f0514e77c13d9b7600478af0f1ff9fcaddf69 --- /dev/null +++ b/app/code/Magento/Store/Model/Config/Processor/Fallback.php @@ -0,0 +1,115 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model\Config\Processor; + +use Magento\Framework\App\Config\Spi\PostProcessorInterface; +use Magento\Store\App\Config\Type\Scopes; + +/** + * Fallback throguh different scopes and merge them + * + * @package Magento\Store\Model\Config\Processor + */ +class Fallback implements PostProcessorInterface +{ + /** + * @var Scopes + */ + private $scopes; + + /** + * Fallback constructor. + * @param Scopes $scopes + */ + public function __construct(Scopes $scopes) + { + $this->scopes = $scopes; + } + + /** + * @inheritdoc + */ + public function process(array $data) + { + $defaultConfig = isset($data['default']) ? $data['default'] : []; + $result = [ + 'default' => $defaultConfig, + 'websites' => [], + 'stores' => [] + ]; + + $websitesConfig = isset($data['websites']) ? $data['websites'] : []; + $result['websites'] = $this->prepareWebsitesConfig($defaultConfig, $websitesConfig); + + $storesConfig = isset($data['stores']) ? $data['stores'] : []; + $result['stores'] = $this->prepareStoresConfig($defaultConfig, $websitesConfig, $storesConfig); + + return $result; + } + + /** + * Prepare website data from Config/Type/Scopes + * + * @param array $defaultConfig + * @param array $websitesConfig + * @return array + */ + private function prepareWebsitesConfig(array $defaultConfig, array $websitesConfig) + { + $result = []; + foreach ($this->scopes->get('websites') as $websiteData) { + $code = $websiteData['code']; + $id = $websiteData['website_id']; + $websiteConfig = isset($websitesConfig[$code]) ? $websitesConfig[$code] : []; + $result[$code] = array_replace_recursive($defaultConfig, $websiteConfig); + $result[$id] = $result[$code]; + } + return $result; + } + + /** + * Prepare stores data from Config/Type/Scopes + * + * @param array $defaultConfig + * @param array $websitesConfig + * @param array $storesConfig + * @return array + */ + private function prepareStoresConfig(array $defaultConfig, array $websitesConfig, array $storesConfig) + { + $result = []; + foreach ($this->scopes->get('stores') as $storeData) { + $code = $storeData['code']; + $id = $storeData['store_id']; + $websiteConfig = []; + if (isset($storeData['website_id'])) { + $websiteConfig = $this->getWebsiteConfig($websitesConfig, $storeData['website_id']); + } + $storeConfig = isset($storesConfig[$code]) ? $storesConfig[$code] : []; + $result[$code] = array_replace_recursive($defaultConfig, $websiteConfig, $storeConfig); + $result[$id] = $result[$code]; + } + return $result; + } + + /** + * Retrieve Website Config + * + * @param array $websites + * @param int $id + * @return array + */ + private function getWebsiteConfig(array $websites, $id) + { + foreach ($this->scopes->get('websites') as $websiteData) { + if ($websiteData['website_id'] == $id) { + $code = $websiteData['code']; + return isset($websites[$code]) ? $websites[$code] : []; + } + } + return []; + } +} diff --git a/app/code/Magento/Store/Model/Config/Processor/Placeholder.php b/app/code/Magento/Store/Model/Config/Processor/Placeholder.php index ac150267053885b7c8b6e863155aa164cd17d6da..3695a9a9d66ce05de260bae5d60649a602e5a68d 100644 --- a/app/code/Magento/Store/Model/Config/Processor/Placeholder.php +++ b/app/code/Magento/Store/Model/Config/Processor/Placeholder.php @@ -7,159 +7,44 @@ */ namespace Magento\Store\Model\Config\Processor; -class Placeholder -{ - /** - * @var \Magento\Framework\App\RequestInterface - */ - protected $request; - - /** - * @var string[] - */ - protected $urlPaths; - - /** - * @var string - */ - protected $urlPlaceholder; - - /** - * @param \Magento\Framework\App\RequestInterface $request - * @param string[] $urlPaths - * @param string $urlPlaceholder - */ - public function __construct(\Magento\Framework\App\RequestInterface $request, $urlPaths, $urlPlaceholder) - { - $this->request = $request; - $this->urlPaths = $urlPaths; - $this->urlPlaceholder = $urlPlaceholder; - } - - /** - * Replace placeholders with config values - * - * @param array $data - * @return array - */ - public function process(array $data = []) - { - foreach (array_keys($data) as $key) { - $this->_processData($data, $key); - } - return $data; - } - - /** - * Process array data recursively - * - * @param array &$data - * @param string $path - * @return void - */ - protected function _processData(&$data, $path) - { - $configValue = $this->_getValue($path, $data); - if (is_array($configValue)) { - foreach (array_keys($configValue) as $key) { - $this->_processData($data, $path . '/' . $key); - } - } else { - $this->_setValue($data, $path, $this->_processPlaceholders($configValue, $data)); - } - } +use Magento\Framework\App\Config\Spi\PostProcessorInterface; +use Magento\Store\Model\Config\Placeholder as ConfigPlaceholder; +/** + * Placeholder configuration values processor. Replace placeholders in configuration with config values + * @package Magento\Store\Model\Config\Processor + */ +class Placeholder implements PostProcessorInterface +{ /** - * Replace placeholders with config values - * - * @param string $value - * @param array $data - * @return string + * @var ConfigPlaceholder */ - protected function _processPlaceholders($value, $data) - { - $placeholder = $this->_getPlaceholder($value); - if ($placeholder) { - $url = false; - if ($placeholder == 'unsecure_base_url') { - $url = $this->_getValue($this->urlPaths['unsecureBaseUrl'], $data); - } elseif ($placeholder == 'secure_base_url') { - $url = $this->_getValue($this->urlPaths['secureBaseUrl'], $data); - } - - if ($url) { - $value = str_replace('{{' . $placeholder . '}}', $url, $value); - } elseif (strpos($value, $this->urlPlaceholder) !== false) { - $distroBaseUrl = $this->request->getDistroBaseUrl(); - $value = str_replace($this->urlPlaceholder, $distroBaseUrl, $value); - } - - if (null !== $this->_getPlaceholder($value)) { - $value = $this->_processPlaceholders($value, $data); - } - } - return $value; - } + private $configPlaceholder; /** - * Get placeholder from value - * - * @param string $value - * @return string|null + * Placeholder constructor. + * @param ConfigPlaceholder $configPlaceholder */ - protected function _getPlaceholder($value) + public function __construct(ConfigPlaceholder $configPlaceholder) { - if (is_string($value) && preg_match('/{{(.*)}}.*/', $value, $matches)) { - $placeholder = $matches[1]; - if ($placeholder == 'unsecure_base_url' || $placeholder == 'secure_base_url' || strpos( - $value, - $this->urlPlaceholder - ) !== false - ) { - return $placeholder; - } - } - return null; + $this->configPlaceholder = $configPlaceholder; } /** - * Get array value by path - * - * @param string $path - * @param array $data - * @return array|null + * @inheritdoc */ - protected function _getValue($path, array $data) + public function process(array $data) { - $keys = explode('/', $path); - foreach ($keys as $key) { - if (is_array($data) && (isset($data[$key]) || array_key_exists($key, $data))) { - $data = $data[$key]; + foreach ($data as $scope => &$scopeData) { + if ($scope === 'default') { + $scopeData = $this->configPlaceholder->process($scopeData); } else { - return null; + foreach ($scopeData as &$sData) { + $sData = $this->configPlaceholder->process($sData); + } } } - return $data; - } - /** - * Set array value by path - * - * @param array &$container - * @param string $path - * @param string $value - * @return void - */ - protected function _setValue(array &$container, $path, $value) - { - $segments = explode('/', $path); - $currentPointer = & $container; - foreach ($segments as $segment) { - if (!isset($currentPointer[$segment])) { - $currentPointer[$segment] = []; - } - $currentPointer = & $currentPointer[$segment]; - } - $currentPointer = $value; + return $data; } } diff --git a/app/code/Magento/Store/Model/Config/Reader/DefaultReader.php b/app/code/Magento/Store/Model/Config/Reader/DefaultReader.php deleted file mode 100644 index 6436f1895a67525919767a0cc0025736f82d5c02..0000000000000000000000000000000000000000 --- a/app/code/Magento/Store/Model/Config/Reader/DefaultReader.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php -/** - * Default configuration reader - * - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Store\Model\Config\Reader; - -use Magento\Framework\App\Config\ScopeConfigInterface; -use Magento\Framework\Exception\LocalizedException; - -class DefaultReader implements \Magento\Framework\App\Config\Scope\ReaderInterface -{ - /** - * @var \Magento\Framework\App\Config\Initial - */ - protected $_initialConfig; - - /** - * @var \Magento\Framework\App\Config\Scope\Converter - */ - protected $_converter; - - /** - * @var \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory - */ - protected $_collectionFactory; - - /** - * @param \Magento\Framework\App\Config\Initial $initialConfig - * @param \Magento\Framework\App\Config\Scope\Converter $converter - * @param \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory - */ - public function __construct( - \Magento\Framework\App\Config\Initial $initialConfig, - \Magento\Framework\App\Config\Scope\Converter $converter, - \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory - ) { - $this->_initialConfig = $initialConfig; - $this->_converter = $converter; - $this->_collectionFactory = $collectionFactory; - } - - /** - * Read configuration data - * - * @param null|string $scope - * @throws LocalizedException Exception is thrown when scope other than default is given - * @return array - */ - public function read($scope = null) - { - $scope = $scope === null ? ScopeConfigInterface::SCOPE_TYPE_DEFAULT : $scope; - if ($scope !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT) { - throw new \Magento\Framework\Exception\LocalizedException(__("Only default scope allowed")); - } - - $config = $this->_initialConfig->getData($scope); - - $collection = $this->_collectionFactory->create( - ['scope' => $scope] - ); - $dbDefaultConfig = []; - foreach ($collection as $item) { - $dbDefaultConfig[$item->getPath()] = $item->getValue(); - } - $dbDefaultConfig = $this->_converter->convert($dbDefaultConfig); - $config = array_replace_recursive($config, $dbDefaultConfig); - - return $config; - } -} diff --git a/app/code/Magento/Store/Model/Config/Reader/ReaderPool.php b/app/code/Magento/Store/Model/Config/Reader/ReaderPool.php deleted file mode 100644 index 55bbe33c3a93c4354d2d06304218d63c0cbece04..0000000000000000000000000000000000000000 --- a/app/code/Magento/Store/Model/Config/Reader/ReaderPool.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Store\Model\Config\Reader; - -class ReaderPool implements \Magento\Framework\App\Config\Scope\ReaderPoolInterface -{ - /** - * List of readers - * - * @var array - */ - protected $_readers = []; - - /** - * @param \Magento\Framework\App\Config\Scope\ReaderInterface[] $readers - */ - public function __construct( - array $readers - ) { - $this->_readers = $readers; - } - - /** - * Retrieve reader by scope type - * - * @param string $scopeType - * @return mixed - */ - public function getReader($scopeType) - { - return $this->_readers[$scopeType]; - } -} diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/DefaultScope.php b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/DefaultScope.php new file mode 100644 index 0000000000000000000000000000000000000000..1f25a29856a78fbcbb3df02853bf30c9ab5fcb30 --- /dev/null +++ b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/DefaultScope.php @@ -0,0 +1,61 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model\Config\Reader\Source\Dynamic; + +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory; +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Framework\App\Config\ScopeConfigInterface; + +/** + * Class for retrieving configuration from DB by default scope + */ +class DefaultScope implements SourceInterface +{ + /** + * @var ScopedFactory + */ + private $collectionFactory; + + /** + * @var Converter + */ + private $converter; + + /** + * @param ScopedFactory $collectionFactory + * @param Converter $converter + */ + public function __construct( + ScopedFactory $collectionFactory, + Converter $converter + ) { + $this->collectionFactory = $collectionFactory; + $this->converter = $converter; + } + + /** + * Retrieve config by default scope + * + * @param string|null $scopeCode + * @return array + */ + public function get($scopeCode = null) + { + try { + $collection = $this->collectionFactory->create( + ['scope' => ScopeConfigInterface::SCOPE_TYPE_DEFAULT] + ); + } catch (\DomainException $e) { + $collection = []; + } + $config = []; + foreach ($collection as $item) { + $config[$item->getPath()] = $item->getValue(); + } + return $this->converter->convert($config); + } +} diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Store.php b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Store.php new file mode 100644 index 0000000000000000000000000000000000000000..e1d0eaf51e05c27fb792e0c856073d1846bd38ba --- /dev/null +++ b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Store.php @@ -0,0 +1,92 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model\Config\Reader\Source\Dynamic; + +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory; +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Store\Model\ScopeInterface; +use Magento\Store\Model\StoreManagerInterface; +use Magento\Store\Model\WebsiteFactory; + +/** + * Class for retrieving configuration from DB by store scope + */ +class Store implements SourceInterface +{ + /** + * @var ScopedFactory + */ + private $collectionFactory; + + /** + * @var Converter + */ + private $converter; + + /** + * @var WebsiteFactory + */ + private $websiteFactory; + + /** + * @var Website + */ + private $websiteSource; + + /** + * @var StoreManagerInterface + */ + private $storeManager; + + /** + * @param ScopedFactory $collectionFactory + * @param Converter $converter + * @param WebsiteFactory $websiteFactory + * @param Website $websiteSource + * @param StoreManagerInterface $storeManager + */ + public function __construct( + ScopedFactory $collectionFactory, + Converter $converter, + WebsiteFactory $websiteFactory, + Website $websiteSource, + StoreManagerInterface $storeManager + ) { + $this->collectionFactory = $collectionFactory; + $this->converter = $converter; + $this->websiteFactory = $websiteFactory; + $this->websiteSource = $websiteSource; + $this->storeManager = $storeManager; + } + + /** + * Retrieve config by store scope + * + * @param string|null $scopeCode + * @return array + */ + public function get($scopeCode = null) + { + try { + $store = $this->storeManager->getStore($scopeCode); + $collection = $this->collectionFactory->create( + ['scope' => ScopeInterface::SCOPE_STORES, 'scopeId' => $store->getId()] + ); + + $config = []; + foreach ($collection as $item) { + $config[$item->getPath()] = $item->getValue(); + } + return $this->converter->convert(array_replace_recursive( + $this->websiteSource->get($store->getWebsiteId()), + $this->converter->convert($config) + )); + } catch (\DomainException $e) { + return []; + } + } +} diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Website.php b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Website.php new file mode 100644 index 0000000000000000000000000000000000000000..0edd12fd2809876f600244319cdc98ffa88231d3 --- /dev/null +++ b/app/code/Magento/Store/Model/Config/Reader/Source/Dynamic/Website.php @@ -0,0 +1,80 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model\Config\Reader\Source\Dynamic; + +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory; +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Store\Model\ScopeInterface; +use Magento\Store\Model\WebsiteFactory; + +/** + * Class for retrieving configuration from DB by website scope + */ +class Website implements SourceInterface +{ + /** + * @var ScopedFactory + */ + private $collectionFactory; + + /** + * @var Converter + */ + private $converter; + + /** + * @var WebsiteFactory + */ + private $websiteFactory; + + /** + * @var DefaultScope + */ + private $defaultScope; + + /** + * @param ScopedFactory $collectionFactory + * @param Converter $converter + * @param WebsiteFactory $websiteFactory + * @param DefaultScope $defaultScope + */ + public function __construct( + ScopedFactory $collectionFactory, + Converter $converter, + WebsiteFactory $websiteFactory, + DefaultScope $defaultScope + ) { + $this->collectionFactory = $collectionFactory; + $this->converter = $converter; + $this->websiteFactory = $websiteFactory; + $this->defaultScope = $defaultScope; + } + + /** + * Retrieve config by website scope + * + * @param string|null $scopeCode + * @return array + */ + public function get($scopeCode = null) + { + try { + $website = $this->websiteFactory->create(); + $website->load($scopeCode); + $collection = $this->collectionFactory->create( + ['scope' => ScopeInterface::SCOPE_WEBSITES, 'scopeId' => $website->getId()] + ); + $config = []; + foreach ($collection as $item) { + $config[$item->getPath()] = $item->getValue(); + } + return array_replace_recursive($this->defaultScope->get(), $this->converter->convert($config)); + } catch (\DomainException $e) { + return []; + } + } +} diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Initial/DefaultScope.php b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/DefaultScope.php new file mode 100644 index 0000000000000000000000000000000000000000..071599d2df56b8b1e5b52c42777abe43eab165a0 --- /dev/null +++ b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/DefaultScope.php @@ -0,0 +1,50 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model\Config\Reader\Source\Initial; + +use Magento\Framework\App\Config\Initial; +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Framework\App\Config\ScopeConfigInterface; + +/** + * Class for retrieving configuration from initial by default scope + */ +class DefaultScope implements SourceInterface +{ + /** + * @var Initial + */ + private $initialConfig; + + /** + * @var Converter + */ + private $converter; + + /** + * @param Initial $initialConfig + * @param Converter $converter + */ + public function __construct( + Initial $initialConfig, + Converter $converter + ) { + $this->initialConfig = $initialConfig; + $this->converter = $converter; + } + + /** + * Retrieve config by default scope + * + * @param string|null $scopeCode + * @return array + */ + public function get($scopeCode = null) + { + return $this->converter->convert($this->initialConfig->getData(ScopeConfigInterface::SCOPE_TYPE_DEFAULT)); + } +} diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Store.php b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Store.php new file mode 100644 index 0000000000000000000000000000000000000000..8a36fa76ed335f0e768df1a3aecad4b627b9b987 --- /dev/null +++ b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Store.php @@ -0,0 +1,75 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model\Config\Reader\Source\Initial; + +use Magento\Framework\App\Config\Initial; +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Store\Model\StoreManagerInterface; + +/** + * Class for retrieving configuration from initial config by store scope + */ +class Store implements SourceInterface +{ + /** + * @var Initial + */ + private $initialConfig; + + /** + * @var Website + */ + private $websiteSource; + + /** + * @var StoreManagerInterface + */ + private $storeManager; + + /** + * @var Converter + */ + private $converter; + + /** + * @param Initial $initialConfig + * @param Website $website + * @param StoreManagerInterface $storeManager + * @param Converter $converter + */ + public function __construct( + Initial $initialConfig, + Website $website, + StoreManagerInterface $storeManager, + Converter $converter + ) { + $this->initialConfig = $initialConfig; + $this->websiteSource = $website; + $this->storeManager = $storeManager; + $this->converter = $converter; + } + + /** + * Retrieve config by store scope + * + * @param string|null $scopeCode + * @return array + */ + public function get($scopeCode = null) + { + try { + /** @var \Magento\Store\Model\Store $store */ + $store = $this->storeManager->getStore($scopeCode); + return $this->converter->convert(array_replace_recursive( + $this->websiteSource->get($store->getData('website_code')), + $this->initialConfig->getData("stores|{$scopeCode}") + )); + } catch (\Exception $e) { + return []; + } + } +} diff --git a/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Website.php b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Website.php new file mode 100644 index 0000000000000000000000000000000000000000..efd85e83a593e52b8886d903b8145903f33fe95d --- /dev/null +++ b/app/code/Magento/Store/Model/Config/Reader/Source/Initial/Website.php @@ -0,0 +1,60 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model\Config\Reader\Source\Initial; + +use Magento\Framework\App\Config\Initial; +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Framework\App\Config\Scope\Converter; + +/** + * Class for retrieving configuration from initial config by website scope + */ +class Website implements SourceInterface +{ + /** + * @var Initial + */ + private $initialConfig; + + /** + * @var DefaultScope + */ + private $defaultScope; + + /** + * @var Converter + */ + private $converter; + + /** + * @param Initial $initialConfig + * @param DefaultScope $defaultScope + * @param Converter $converter + */ + public function __construct( + Initial $initialConfig, + DefaultScope $defaultScope, + Converter $converter + ) { + $this->initialConfig = $initialConfig; + $this->defaultScope = $defaultScope; + $this->converter = $converter; + } + + /** + * Retrieve config by website scope + * + * @param string|null $scopeCode + * @return array + */ + public function get($scopeCode = null) + { + return $this->converter->convert(array_replace_recursive( + $this->defaultScope->get(), + $this->initialConfig->getData("websites|{$scopeCode}") + )); + } +} diff --git a/app/code/Magento/Store/Model/Config/Reader/Store.php b/app/code/Magento/Store/Model/Config/Reader/Store.php deleted file mode 100644 index 8b4eb2d67365158cfc242b83eda77970f2abf999..0000000000000000000000000000000000000000 --- a/app/code/Magento/Store/Model/Config/Reader/Store.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Store\Model\Config\Reader; - -use Magento\Framework\Exception\NoSuchEntityException; - -class Store implements \Magento\Framework\App\Config\Scope\ReaderInterface -{ - /** - * @var \Magento\Framework\App\Config\Initial - */ - protected $_initialConfig; - - /** - * @var \Magento\Framework\App\Config\ScopePool - */ - protected $_scopePool; - - /** - * @var \Magento\Store\Model\Config\Converter - */ - protected $_converter; - - /** - * @var \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory - */ - protected $_collectionFactory; - - /** - * @var \Magento\Store\Model\StoreManagerInterface - */ - protected $_storeManager; - - /** - * @param \Magento\Framework\App\Config\Initial $initialConfig - * @param \Magento\Framework\App\Config\ScopePool $scopePool - * @param \Magento\Store\Model\Config\Converter $converter - * @param \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory - * @param \Magento\Store\Model\StoreManagerInterface $storeManager - */ - public function __construct( - \Magento\Framework\App\Config\Initial $initialConfig, - \Magento\Framework\App\Config\ScopePool $scopePool, - \Magento\Store\Model\Config\Converter $converter, - \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory, - \Magento\Store\Model\StoreManagerInterface $storeManager - ) { - $this->_initialConfig = $initialConfig; - $this->_scopePool = $scopePool; - $this->_converter = $converter; - $this->_collectionFactory = $collectionFactory; - $this->_storeManager = $storeManager; - } - - /** - * Read configuration by code - * - * @param null|string $code - * @return array - * @throws NoSuchEntityException - */ - public function read($code = null) - { - $store = $this->_storeManager->getStore($code); - - $websiteConfig = $this->_scopePool->getScope( - \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITE, - $store->getWebsite()->getCode() - )->getSource(); - $config = array_replace_recursive($websiteConfig, $this->_initialConfig->getData("stores|{$code}")); - - $collection = $this->_collectionFactory->create( - ['scope' => \Magento\Store\Model\ScopeInterface::SCOPE_STORES, 'scopeId' => $store->getId()] - ); - $dbStoreConfig = []; - foreach ($collection as $item) { - $dbStoreConfig[$item->getPath()] = $item->getValue(); - } - return $this->_converter->convert($dbStoreConfig, $config); - } -} diff --git a/app/code/Magento/Store/Model/Config/Reader/Website.php b/app/code/Magento/Store/Model/Config/Reader/Website.php deleted file mode 100644 index 3ae30ea86a506afb22c1790d687efd2a835bd005..0000000000000000000000000000000000000000 --- a/app/code/Magento/Store/Model/Config/Reader/Website.php +++ /dev/null @@ -1,88 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Store\Model\Config\Reader; - -use Magento\Framework\App\Config\ScopeConfigInterface; - -class Website implements \Magento\Framework\App\Config\Scope\ReaderInterface -{ - /** - * @var \Magento\Framework\App\Config\Initial - */ - protected $_initialConfig; - - /** - * @var \Magento\Framework\App\Config\ScopePool - */ - protected $_scopePool; - - /** - * @var \Magento\Framework\App\Config\Scope\Converter - */ - protected $_converter; - - /** - * @var \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory - */ - protected $_collectionFactory; - - /** - * @var \Magento\Store\Model\WebsiteFactory - */ - protected $_websiteFactory; - - /** - * @param \Magento\Framework\App\Config\Initial $initialConfig - * @param \Magento\Framework\App\Config\ScopePool $scopePool - * @param \Magento\Framework\App\Config\Scope\Converter $converter - * @param \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory - * @param \Magento\Store\Model\WebsiteFactory $websiteFactory - */ - public function __construct( - \Magento\Framework\App\Config\Initial $initialConfig, - \Magento\Framework\App\Config\ScopePool $scopePool, - \Magento\Framework\App\Config\Scope\Converter $converter, - \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory $collectionFactory, - \Magento\Store\Model\WebsiteFactory $websiteFactory - ) { - $this->_initialConfig = $initialConfig; - $this->_scopePool = $scopePool; - $this->_converter = $converter; - $this->_collectionFactory = $collectionFactory; - $this->_websiteFactory = $websiteFactory; - } - - /** - * Read configuration by code - * - * @param string $code - * @return array - */ - public function read($code = null) - { - $config = array_replace_recursive( - $this->_scopePool->getScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT)->getSource(), - $this->_initialConfig->getData("websites|{$code}") - ); - - $website = $this->_websiteFactory->create(); - $website->load($code); - $collection = $this->_collectionFactory->create( - ['scope' => \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITES, 'scopeId' => $website->getId()] - ); - $dbWebsiteConfig = []; - foreach ($collection as $configValue) { - $dbWebsiteConfig[$configValue->getPath()] = $configValue->getValue(); - } - $dbWebsiteConfig = $this->_converter->convert($dbWebsiteConfig); - - if (count($dbWebsiteConfig)) { - $config = array_replace_recursive($config, $dbWebsiteConfig); - } - - return $config; - } -} diff --git a/app/code/Magento/Store/Model/Group.php b/app/code/Magento/Store/Model/Group.php index cd6044dd7f78632bbcc629c91bbef11ff7d612af..f95d0aaded312e0ce0355238f23c16033a9817fc 100644 --- a/app/code/Magento/Store/Model/Group.php +++ b/app/code/Magento/Store/Model/Group.php @@ -442,7 +442,7 @@ class Group extends \Magento\Framework\Model\AbstractExtensibleModel implements */ public function getIdentities() { - return [self::CACHE_TAG . '_' . $this->getId()]; + return [self::CACHE_TAG]; } /** diff --git a/app/code/Magento/Store/Model/GroupRepository.php b/app/code/Magento/Store/Model/GroupRepository.php index 3cc833138b241386413d2563306def2f9679d4ad..dadcc6fb24e68e9e474c0a3e992f01b77f07712f 100644 --- a/app/code/Magento/Store/Model/GroupRepository.php +++ b/app/code/Magento/Store/Model/GroupRepository.php @@ -5,8 +5,15 @@ */ namespace Magento\Store\Model; +use Magento\Framework\App\ObjectManager; use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Framework\App\Config; +/** + * Information Expert in store groups handling + * + * @package Magento\Store\Model + */ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface { /** @@ -29,6 +36,11 @@ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface */ protected $groupCollectionFactory; + /** + * @var Config + */ + private $appConfig; + /** * @param GroupFactory $groupFactory * @param \Magento\Store\Model\ResourceModel\Group\CollectionFactory $groupCollectionFactory @@ -49,8 +61,21 @@ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface if (isset($this->entities[$id])) { return $this->entities[$id]; } - $group = $this->groupFactory->create(); - $group->load($id); + + $groupData = []; + $groups = $this->getAppConfig()->get('scopes', 'groups', []); + if ($groups) { + foreach ($groups as $data) { + if (isset($data['group_id']) && $data['group_id'] == $id) { + $groupData = $data; + break; + } + } + } + $group = $this->groupFactory->create([ + 'data' => $groupData + ]); + if (null === $group->getId()) { throw new NoSuchEntityException(); } @@ -64,14 +89,16 @@ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface public function getList() { if (!$this->allLoaded) { - /** @var \Magento\Store\Model\ResourceModel\Group\Collection $groupCollection */ - $groupCollection = $this->groupCollectionFactory->create(); - $groupCollection->setLoadDefault(true); - foreach ($groupCollection as $item) { - $this->entities[$item->getId()] = $item; + $groups = $this->getAppConfig()->get('scopes', 'groups', []); + foreach ($groups as $data) { + $group = $this->groupFactory->create([ + 'data' => $data + ]); + $this->entities[$group->getId()] = $group; } $this->allLoaded = true; } + return $this->entities; } @@ -83,4 +110,18 @@ class GroupRepository implements \Magento\Store\Api\GroupRepositoryInterface $this->entities = []; $this->allLoaded = false; } + + /** + * Retrieve application config. + * + * @deprecated + * @return Config + */ + private function getAppConfig() + { + if (!$this->appConfig) { + $this->appConfig = ObjectManager::getInstance()->get(Config::class); + } + return $this->appConfig; + } } diff --git a/app/code/Magento/Store/Model/Store.php b/app/code/Magento/Store/Model/Store.php index 270b621407d4697c3612f54dc0059ecb16cb1903..ccd1aed947d787e37ee5126e227542856ed3d73d 100644 --- a/app/code/Magento/Store/Model/Store.php +++ b/app/code/Magento/Store/Model/Store.php @@ -1036,6 +1036,18 @@ class Store extends AbstractExtensibleModel implements return $this->_getData('website_id'); } + /** + * Reinit Stores on after save + * + * @deprecated + * @return $this + */ + public function afterSave() + { + $this->_storeManager->reinitStores(); + return parent::afterSave(); + } + /** * @inheritdoc */ @@ -1272,7 +1284,7 @@ class Store extends AbstractExtensibleModel implements */ public function getIdentities() { - return [self::CACHE_TAG . '_' . $this->getId()]; + return [self::CACHE_TAG]; } /** diff --git a/app/code/Magento/Store/Model/StoreManager.php b/app/code/Magento/Store/Model/StoreManager.php index c34f4e1bd2a58d370e92a34295ae4a60647133c1..13840b120636773dd108adcdf4a9f590e629383d 100644 --- a/app/code/Magento/Store/Model/StoreManager.php +++ b/app/code/Magento/Store/Model/StoreManager.php @@ -10,6 +10,8 @@ use Magento\Store\Api\StoreResolverInterface; use Magento\Store\Model\ResourceModel\StoreWebsiteRelation; /** + * Service contract, which manage scopes + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class StoreManager implements @@ -198,9 +200,12 @@ class StoreManager implements $website = $websiteId; } elseif ($websiteId === true) { $website = $this->websiteRepository->getDefault(); - } else { + } elseif (is_numeric($websiteId)) { $website = $this->websiteRepository->getById($websiteId); + } else { + $website = $this->websiteRepository->get($websiteId); } + return $website; } @@ -228,6 +233,7 @@ class StoreManager implements */ public function reinitStores() { + $this->scopeConfig->clean(); $this->currentStoreId = null; $this->storeRepository->clean(); $this->websiteRepository->clean(); diff --git a/app/code/Magento/Store/Model/StoreRepository.php b/app/code/Magento/Store/Model/StoreRepository.php index 47e185f48cc52532909d34dcb53a1ad66704765c..c9e7a0ebc9d313d0a3a0fcb8d29631105ff2371a 100644 --- a/app/code/Magento/Store/Model/StoreRepository.php +++ b/app/code/Magento/Store/Model/StoreRepository.php @@ -5,8 +5,15 @@ */ namespace Magento\Store\Model; +use Magento\Framework\App\ObjectManager; use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Framework\App\Config; +/** + * Information Expert in stores handling + * + * @package Magento\Store\Model + */ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface { /** @@ -34,6 +41,11 @@ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface */ protected $allLoaded = false; + /** + * @var Config + */ + private $appConfig; + /** * @param StoreFactory $storeFactory * @param \Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory @@ -54,8 +66,12 @@ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface if (isset($this->entities[$code])) { return $this->entities[$code]; } - $store = $this->storeFactory->create(); - $store->load($code, 'code'); + + $storeData = $this->getAppConfig()->get('scopes', "stores/$code", []); + $store = $this->storeFactory->create([ + 'data' => $storeData + ]); + if ($store->getId() === null) { throw new NoSuchEntityException(__('Requested store is not found')); } @@ -85,11 +101,23 @@ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface if (isset($this->entitiesById[$id])) { return $this->entitiesById[$id]; } - $store = $this->storeFactory->create(); - $store->load($id); + + $storeData = []; + $stores = $this->getAppConfig()->get('scopes', "stores", []); + foreach ($stores as $data) { + if (isset($data['store_id']) && $data['store_id'] == $id) { + $storeData = $data; + break; + } + } + $store = $this->storeFactory->create([ + 'data' => $storeData + ]); + if ($store->getId() === null) { throw new NoSuchEntityException(__('Requested store is not found')); } + $this->entitiesById[$id] = $store; $this->entities[$store->getCode()] = $store; return $store; @@ -113,19 +141,35 @@ class StoreRepository implements \Magento\Store\Api\StoreRepositoryInterface */ public function getList() { - if (!$this->allLoaded) { - /** @var $storeCollection \Magento\Store\Model\ResourceModel\Store\Collection */ - $storeCollection = $this->storeCollectionFactory->create(); - $storeCollection->setLoadDefault(true); - foreach ($storeCollection as $item) { - $this->entities[$item->getCode()] = $item; - $this->entitiesById[$item->getId()] = $item; - } - $this->allLoaded = true; + if ($this->allLoaded) { + return $this->entities; } + $stores = $this->getAppConfig()->get('scopes', "stores", []); + foreach ($stores as $data) { + $store = $this->storeFactory->create([ + 'data' => $data + ]); + $this->entities[$store->getCode()] = $store; + $this->entitiesById[$store->getId()] = $store; + } + $this->allLoaded = true; return $this->entities; } + /** + * Retrieve application config. + * + * @deprecated + * @return Config + */ + private function getAppConfig() + { + if (!$this->appConfig) { + $this->appConfig = ObjectManager::getInstance()->get(Config::class); + } + return $this->appConfig; + } + /** * {@inheritdoc} */ diff --git a/app/code/Magento/Store/Model/StoreResolver.php b/app/code/Magento/Store/Model/StoreResolver.php index a19d75d9f47e06364afe9d2aa1dd3dab950e2a60..cfb57849f25a83fd8c1f971e1b9bbf7870c2765c 100644 --- a/app/code/Magento/Store/Model/StoreResolver.php +++ b/app/code/Magento/Store/Model/StoreResolver.php @@ -5,8 +5,7 @@ */ namespace Magento\Store\Model; -use Magento\Framework\Exception\NoSuchEntityException; -use Magento\Store\Api\StoreCookieManagerInterface; +use Magento\Framework\Serialize\SerializerInterface; class StoreResolver implements \Magento\Store\Api\StoreResolverInterface { @@ -21,7 +20,7 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface protected $storeRepository; /** - * @var StoreCookieManagerInterface + * @var \Magento\Store\Api\StoreCookieManagerInterface */ protected $storeCookieManager; @@ -31,7 +30,7 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface protected $cache; /** - * @var StoreResolver\ReaderList + * @var \Magento\Store\Model\StoreResolver\ReaderList */ protected $readerList; @@ -50,21 +49,26 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface */ protected $request; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * @param \Magento\Store\Api\StoreRepositoryInterface $storeRepository - * @param StoreCookieManagerInterface $storeCookieManager + * @param \Magento\Store\Api\StoreCookieManagerInterface $storeCookieManager * @param \Magento\Framework\App\RequestInterface $request * @param \Magento\Framework\Cache\FrontendInterface $cache - * @param StoreResolver\ReaderList $readerList + * @param \Magento\Store\Model\StoreResolver\ReaderList $readerList * @param string $runMode * @param null $scopeCode */ public function __construct( \Magento\Store\Api\StoreRepositoryInterface $storeRepository, - StoreCookieManagerInterface $storeCookieManager, + \Magento\Store\Api\StoreCookieManagerInterface $storeCookieManager, \Magento\Framework\App\RequestInterface $request, \Magento\Framework\Cache\FrontendInterface $cache, - StoreResolver\ReaderList $readerList, + \Magento\Store\Model\StoreResolver\ReaderList $readerList, $runMode = ScopeInterface::SCOPE_STORE, $scopeCode = null ) { @@ -94,7 +98,7 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface if ($storeCode) { try { $store = $this->getRequestedStoreByCode($storeCode); - } catch (NoSuchEntityException $e) { + } catch (\Magento\Framework\Exception\NoSuchEntityException $e) { $store = $this->getDefaultStoreById($defaultStoreId); } @@ -117,10 +121,10 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface $cacheKey = 'resolved_stores_' . md5($this->runMode . $this->scopeCode); $cacheData = $this->cache->load($cacheKey); if ($cacheData) { - $storesData = unserialize($cacheData); + $storesData = $this->getSerializer()->unserialize($cacheData); } else { $storesData = $this->readStoresData(); - $this->cache->save(serialize($storesData), $cacheKey, [self::CACHE_TAG]); + $this->cache->save($this->getSerializer()->serialize($storesData), $cacheKey, [self::CACHE_TAG]); } return $storesData; } @@ -141,14 +145,14 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface * * @param string $storeCode * @return \Magento\Store\Api\Data\StoreInterface - * @throws NoSuchEntityException + * @throws \Magento\Framework\Exception\NoSuchEntityException */ protected function getRequestedStoreByCode($storeCode) { try { $store = $this->storeRepository->getActiveStoreByCode($storeCode); } catch (StoreIsInactiveException $e) { - throw new NoSuchEntityException(__('Requested store is inactive')); + throw new \Magento\Framework\Exception\NoSuchEntityException(__('Requested store is inactive')); } return $store; @@ -159,16 +163,31 @@ class StoreResolver implements \Magento\Store\Api\StoreResolverInterface * * @param int $id * @return \Magento\Store\Api\Data\StoreInterface - * @throws NoSuchEntityException + * @throws \Magento\Framework\Exception\NoSuchEntityException */ protected function getDefaultStoreById($id) { try { $store = $this->storeRepository->getActiveStoreById($id); } catch (StoreIsInactiveException $e) { - throw new NoSuchEntityException(__('Default store is inactive')); + throw new \Magento\Framework\Exception\NoSuchEntityException(__('Default store is inactive')); } return $store; } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/app/code/Magento/Store/Model/Website.php b/app/code/Magento/Store/Model/Website.php index 1370cea5cf42bf5217938d2769820f48e9b929c9..a3a6b6dbc3f7f425fc3527e8a27ef355cca74066 100644 --- a/app/code/Magento/Store/Model/Website.php +++ b/app/code/Magento/Store/Model/Website.php @@ -652,7 +652,7 @@ class Website extends \Magento\Framework\Model\AbstractExtensibleModel implement */ public function getIdentities() { - return [self::CACHE_TAG . '_' . $this->getId()]; + return [self::CACHE_TAG]; } /** diff --git a/app/code/Magento/Store/Model/WebsiteRepository.php b/app/code/Magento/Store/Model/WebsiteRepository.php index 0aeb65f47cdb4af0c464f2a00323c83560471b1d..dffcef921bc22194cd762eea74a96e1fb2d4b22c 100644 --- a/app/code/Magento/Store/Model/WebsiteRepository.php +++ b/app/code/Magento/Store/Model/WebsiteRepository.php @@ -5,9 +5,16 @@ */ namespace Magento\Store\Model; +use Magento\Framework\App\ObjectManager; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Store\Model\ResourceModel\Website\CollectionFactory; +use Magento\Framework\App\Config; +/** + * Information Expert in store websites handling + * + * @package Magento\Store\Model + */ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface { /** @@ -40,6 +47,11 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface */ protected $default; + /** + * @var Config + */ + private $appConfig; + /** * @param WebsiteFactory $factory * @param CollectionFactory $websiteCollectionFactory @@ -60,8 +72,12 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface if (isset($this->entities[$code])) { return $this->entities[$code]; } - $website = $this->factory->create(); - $website->load($code, 'code'); + + $websiteData = $this->getAppConfig()->get('scopes', "websites/$code", []); + $website = $this->factory->create([ + 'data' => $websiteData + ]); + if ($website->getId() === null) { throw new NoSuchEntityException(); } @@ -78,14 +94,23 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface if (isset($this->entitiesById[$id])) { return $this->entitiesById[$id]; } - /** @var Website $website */ - $website = $this->factory->create(); - $website->load($id); + $websiteData = []; + $websites = $this->getAppConfig()->get('scopes', 'websites', []); + foreach ($websites as $data) { + if (isset($data['website_id']) && $data['website_id'] == $id) { + $websiteData = $data; + break; + } + } + $website = $this->factory->create([ + 'data' => $websiteData + ]); + if ($website->getId() === null) { throw new NoSuchEntityException(); } - $this->entitiesById[$id] = $website; $this->entities[$website->getCode()] = $website; + $this->entitiesById[$id] = $website; return $website; } @@ -95,10 +120,13 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface public function getList() { if (!$this->allLoaded) { - $collection = $this->websiteCollectionFactory->create(); - $collection->setLoadDefault(true); - foreach ($collection as $item) { - $this->entities[$item->getCode()] = $item; + $websites = $this->getAppConfig()->get('scopes', 'websites', []); + foreach ($websites as $data) { + $website = $this->factory->create([ + 'data' => $data + ]); + $this->entities[$website->getCode()] = $website; + $this->entitiesById[$website->getId()] = $website; } $this->allLoaded = true; } @@ -118,23 +146,13 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface } } if (!$this->allLoaded) { - /** @var \Magento\Store\Model\ResourceModel\Website\Collection $collection */ - $collection = $this->websiteCollectionFactory->create(); - $collection->addFieldToFilter('is_default', 1); - $items = $collection->getItems(); - if (count($items) > 1) { - throw new \DomainException(__('More than one default website is defined')); - } - if (count($items) === 0) { - throw new \DomainException(__('Default website is not defined')); - } - $this->default = $collection->getFirstItem(); - $this->entities[$this->default->getCode()] = $this->default; - $this->entitiesById[$this->default->getId()] = $this->default; - } else { + $this->initDefaultWebsite(); + } + if (!$this->default) { throw new \DomainException(__('Default website is not defined')); } } + return $this->default; } @@ -148,4 +166,40 @@ class WebsiteRepository implements \Magento\Store\Api\WebsiteRepositoryInterface $this->default = null; $this->allLoaded = false; } + + /** + * Retrieve application config. + * + * @deprecated + * @return Config + */ + private function getAppConfig() + { + if (!$this->appConfig) { + $this->appConfig = ObjectManager::getInstance()->get(Config::class); + } + return $this->appConfig; + } + + /** + * Initialize default website. + * @return void + */ + private function initDefaultWebsite() + { + $websites = (array)$this->getAppConfig()->get('scopes', 'websites', []); + foreach ($websites as $data) { + if (isset($data['is_default']) && $data['is_default'] == 1) { + if ($this->default) { + throw new \DomainException(__('More than one default website is defined')); + } + $website = $this->factory->create([ + 'data' => $data + ]); + $this->default = $website; + $this->entities[$this->default->getCode()] = $this->default; + $this->entitiesById[$this->default->getId()] = $this->default; + } + } + } } diff --git a/app/code/Magento/Store/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php b/app/code/Magento/Store/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8b3ffeafd8b2b71d26e8e2d0b4db627726925680 --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/App/Config/Source/RuntimeConfigSourceTest.php @@ -0,0 +1,358 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Test\Unit\App\Config\Source; + +use Magento\Framework\App\DeploymentConfig; +use Magento\Store\App\Config\Source\RuntimeConfigSource; +use Magento\Store\Model\Group; +use Magento\Store\Model\GroupFactory; +use Magento\Store\Model\ResourceModel\Website\CollectionFactory; +use Magento\Store\Model\ResourceModel\Group\CollectionFactory as GroupCollectionFactory; +use Magento\Store\Model\ResourceModel\Store\CollectionFactory as StoreCollectionFactory; +use Magento\Store\Model\ResourceModel\Website\Collection as WebsiteCollection; +use Magento\Store\Model\ResourceModel\Group\Collection as GroupCollection; +use Magento\Store\Model\ResourceModel\Store\Collection as StoreCollection; +use Magento\Store\Model\Store; +use Magento\Store\Model\StoreFactory; +use Magento\Store\Model\Website; +use Magento\Store\Model\WebsiteFactory; + +/** + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class RuntimeConfigSourceTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var array + */ + private $data; + + /** + * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $websiteCollectionFactory; + + /** + * @var GroupCollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $groupCollectionFactory; + + /** + * @var StoreCollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $storeCollectionFactory; + + /** + * @var WebsiteCollection|\PHPUnit_Framework_MockObject_MockObject + */ + private $websiteCollection; + + /** + * @var GroupCollection|\PHPUnit_Framework_MockObject_MockObject + */ + private $groupCollection; + + /** + * @var StoreCollection|\PHPUnit_Framework_MockObject_MockObject + */ + private $storeCollection; + + /** + * @var WebsiteFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $websiteFactory; + + /** + * @var GroupFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $groupFactory; + + /** + * @var StoreFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $storeFactory; + + /** + * @var Website|\PHPUnit_Framework_MockObject_MockObject + */ + private $website; + + /** + * @var Group|\PHPUnit_Framework_MockObject_MockObject + */ + private $group; + + /** + * @var Store|\PHPUnit_Framework_MockObject_MockObject + */ + private $store; + + /** + * @var DeploymentConfig|\PHPUnit_Framework_MockObject_MockObject + */ + private $deploymentConfig; + + /** + * @var RuntimeConfigSource + */ + private $configSource; + + public function setUp() + { + $this->data = [ + 'group' => [ + 'code' => 'myGroup', + 'data' => [ + 'name' => 'My Group', + 'group_id' => $this->data['group']['code'] + ] + ], + 'website' => [ + 'code' => 'myWebsite', + 'data' => [ + 'name' => 'My Website', + 'website_code' => $this->data['website']['code'] + ] + ], + 'store' => [ + 'code' => 'myStore', + 'data' => [ + 'name' => 'My Store', + 'store_code' => $this->data['store']['code'] + ] + ], + ]; + $this->websiteCollectionFactory = $this->getMockBuilder(CollectionFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->groupCollectionFactory = $this->getMockBuilder(GroupCollectionFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->storeCollectionFactory = $this->getMockBuilder(StoreCollectionFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $this->websiteCollection = $this->getMockBuilder(WebsiteCollection::class) + ->disableOriginalConstructor() + ->setMethods(['setLoadDefault', 'getIterator']) + ->getMock(); + $this->groupCollection = $this->getMockBuilder(GroupCollection::class) + ->disableOriginalConstructor() + ->setMethods(['setLoadDefault', 'getIterator']) + ->getMock(); + $this->storeCollection = $this->getMockBuilder(StoreCollection::class) + ->disableOriginalConstructor() + ->setMethods(['setLoadDefault', 'getIterator']) + ->getMock(); + + $this->websiteFactory = $this->getMockBuilder(WebsiteFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->groupFactory = $this->getMockBuilder(GroupFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->storeFactory = $this->getMockBuilder(StoreFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->website = $this->getMockBuilder(Website::class) + ->disableOriginalConstructor() + ->getMock(); + $this->group = $this->getMockBuilder(Group::class) + ->disableOriginalConstructor() + ->getMock(); + $this->store = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->getMock(); + $this->deploymentConfig = $this->getMockBuilder(DeploymentConfig::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->configSource = new RuntimeConfigSource( + $this->websiteCollectionFactory, + $this->groupCollectionFactory, + $this->storeCollectionFactory, + $this->websiteFactory, + $this->groupFactory, + $this->storeFactory, + $this->deploymentConfig + ); + } + + /** + * @param string $path + * @dataProvider getDataProvider + * @return void + */ + public function testGet($path) + { + $this->deploymentConfig->expects($this->once()) + ->method('get') + ->with('db') + ->willReturn(true); + $this->prepareWebsites($path); + $this->prepareGroups($path); + $this->prepareStores($path); + $this->assertEquals($this->getExpectedResult($path), $this->configSource->get($path)); + } + + private function getExpectedResult($path) + { + switch ($this->getScope($path)) { + case 'websites': + $result = $this->data['website']['data']; + break; + case 'groups': + $result = $this->data['group']['data']; + break; + case 'stores': + $result = $this->data['store']['data']; + break; + default: + $result = [ + 'websites' => [ + $this->data['website']['code'] => $this->data['website']['data'] + ], + 'groups' => [ + $this->data['group']['code'] => $this->data['group']['data'] + ], + 'stores' => [ + $this->data['store']['code'] => $this->data['store']['data'] + ], + ]; + break; + } + return $result; + } + + private function prepareStores($path) + { + $scope = $this->getScope($path); + if ($scope == 'stores' || $scope == 'default') { + if ($this->getScopeCode($path)) { + $this->storeFactory->expects($this->once()) + ->method('create') + ->willReturn($this->store); + $this->store->expects($this->once()) + ->method('load') + ->with($this->data['store']['code'], 'code') + ->willReturnSelf(); + } else { + $this->storeCollectionFactory->expects($this->once()) + ->method('create') + ->willReturn($this->storeCollection); + $this->storeCollection->expects($this->once()) + ->method('setLoadDefault') + ->with(true) + ->willReturnSelf(); + $this->storeCollection->expects($this->once()) + ->method('getIterator') + ->willReturn(new \ArrayIterator([$this->store])); + $this->store->expects($this->once()) + ->method('getCode') + ->willReturn($this->data['store']['code']); + } + $this->store->expects($this->once()) + ->method('getData') + ->willReturn($this->data['store']['data']); + } + } + + private function prepareGroups($path) + { + $scope = $this->getScope($path); + if ($scope == 'groups' || $scope == 'default') { + if ($this->getScopeCode($path)) { + $this->groupFactory->expects($this->once()) + ->method('create') + ->willReturn($this->group); + $this->group->expects($this->once()) + ->method('load') + ->with($this->data['group']['code']) + ->willReturnSelf(); + } else { + $this->groupCollectionFactory->expects($this->once()) + ->method('create') + ->willReturn($this->groupCollection); + $this->groupCollection->expects($this->once()) + ->method('setLoadDefault') + ->with(true) + ->willReturnSelf(); + $this->groupCollection->expects($this->once()) + ->method('getIterator') + ->willReturn(new \ArrayIterator([$this->group])); + $this->group->expects($this->once()) + ->method('getId') + ->willReturn($this->data['group']['code']); + } + $this->group->expects($this->once()) + ->method('getData') + ->willReturn($this->data['group']['data']); + } + } + + private function prepareWebsites($path) + { + $scope = $this->getScope($path); + if ($scope == 'websites' || $scope == 'default') { + if ($this->getScopeCode($path)) { + $this->websiteFactory->expects($this->once()) + ->method('create') + ->willReturn($this->website); + $this->website->expects($this->once()) + ->method('load') + ->with($this->data['website']['code']) + ->willReturnSelf(); + } else { + $this->websiteCollectionFactory->expects($this->once()) + ->method('create') + ->willReturn($this->websiteCollection); + $this->websiteCollection->expects($this->once()) + ->method('setLoadDefault') + ->with(true) + ->willReturnSelf(); + $this->websiteCollection->expects($this->once()) + ->method('getIterator') + ->willReturn(new \ArrayIterator([$this->website])); + $this->website->expects($this->once()) + ->method('getCode') + ->willReturn($this->data['website']['code']); + } + $this->website->expects($this->once()) + ->method('getData') + ->willReturn($this->data['website']['data']); + } + } + + private function getScopeCode($path) + { + return implode('/', array_slice(explode('/', $path), 1, 1)); + } + + private function getScope($path) + { + return implode('/', array_slice(explode('/', $path), 0, 1)); + } + + /** + * @return array + */ + public function getDataProvider() + { + return [ + ['websites/myWebsite'], + ['groups/myGroup'], + ['stores/myStore'], + ['default'] + ]; + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/ConverterTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/ConverterTest.php index 7cd9fd91aedb842e5c79551d8d91c859abc751d8..2a154bcea3431afe026f08b7cd7662f0476e804e 100644 --- a/app/code/Magento/Store/Test/Unit/Model/Config/ConverterTest.php +++ b/app/code/Magento/Store/Test/Unit/Model/Config/ConverterTest.php @@ -10,19 +10,9 @@ class ConverterTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Store\Model\Config\Converter */ protected $_model; - /** @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_processorMock; - protected function setUp() { - $this->_processorMock = $this->getMock( - \Magento\Store\Model\Config\Processor\Placeholder::class, - [], - [], - '', - false - ); - $this->_model = new \Magento\Store\Model\Config\Converter($this->_processorMock); + $this->_model = new \Magento\Store\Model\Config\Converter(); } public function testConvert() @@ -34,17 +24,6 @@ class ConverterTest extends \PHPUnit_Framework_TestCase 'to' => ['save' => 'saved value', 'overwrite' => 'overwritten', 'added' => 'added value'], ], ]; - $processorResult = '123Value'; - $this->_processorMock->expects( - $this->once() - )->method( - 'process' - )->with( - $mergeResult - )->will( - $this->returnValue($processorResult) - ); - - $this->assertEquals($processorResult, $this->_model->convert($source, $initial)); + $this->assertEquals($mergeResult, $this->_model->convert($source, $initial)); } } diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/PlaceholderTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/PlaceholderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7b952dd84fb38d7f577716a40c9111c37b217ced --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/Model/Config/PlaceholderTest.php @@ -0,0 +1,64 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Test\Unit\Model\Config; + +use Magento\Store\Model\Store; + +class PlaceholderTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Store\Model\Config\Processor\Placeholder + */ + protected $_model; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $_requestMock; + + protected function setUp() + { + $this->_requestMock = $this->getMock(\Magento\Framework\App\Request\Http::class, [], [], '', false); + $this->_requestMock->expects( + $this->any() + )->method( + 'getDistroBaseUrl' + )->will( + $this->returnValue('http://localhost/') + ); + $this->_model = new \Magento\Store\Model\Config\Placeholder( + $this->_requestMock, + [ + 'unsecureBaseUrl' => Store::XML_PATH_UNSECURE_BASE_URL, + 'secureBaseUrl' => Store::XML_PATH_SECURE_BASE_URL + ], + \Magento\Store\Model\Store::BASE_URL_PLACEHOLDER + ); + } + + public function testProcess() + { + $data = [ + 'web' => [ + 'unsecure' => [ + 'base_url' => 'http://localhost/', + 'base_link_url' => '{{unsecure_base_url}}website/de', + ], + 'secure' => [ + 'base_url' => 'https://localhost/', + 'base_link_url' => '{{secure_base_url}}website/de', + ], + ], + 'path' => 'value', + 'some_url' => '{{base_url}}some', + ]; + $expectedResult = $data; + $expectedResult['web']['unsecure']['base_link_url'] = 'http://localhost/website/de'; + $expectedResult['web']['secure']['base_link_url'] = 'https://localhost/website/de'; + $expectedResult['some_url'] = 'http://localhost/some'; + $this->assertEquals($expectedResult, $this->_model->process($data)); + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Processor/PlaceholderTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Processor/PlaceholderTest.php index 493895ddabe74c12c81d7d3b90a3228b2a633f64..7a258fe41a51d351b653b78d87fe2ab17842a926 100644 --- a/app/code/Magento/Store/Test/Unit/Model/Config/Processor/PlaceholderTest.php +++ b/app/code/Magento/Store/Test/Unit/Model/Config/Processor/PlaceholderTest.php @@ -5,60 +5,61 @@ */ namespace Magento\Store\Test\Unit\Model\Config\Processor; -use Magento\Store\Model\Store; - +/** + * Class PlaceholderTest + */ class PlaceholderTest extends \PHPUnit_Framework_TestCase { /** * @var \Magento\Store\Model\Config\Processor\Placeholder */ - protected $_model; + private $model; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Store\Model\Config\Placeholder|\PHPUnit_Framework_MockObject_MockObject */ - protected $_requestMock; + private $configPlaceholderMock; protected function setUp() { - $this->_requestMock = $this->getMock(\Magento\Framework\App\Request\Http::class, [], [], '', false); - $this->_requestMock->expects( + $this->configPlaceholderMock = $this->getMock( + \Magento\Store\Model\Config\Placeholder::class, + [], + [], + '', + false + ); + + $this->configPlaceholderMock->expects( $this->any() )->method( - 'getDistroBaseUrl' - )->will( - $this->returnValue('http://localhost/') - ); - $this->_model = new \Magento\Store\Model\Config\Processor\Placeholder( - $this->_requestMock, - [ - 'unsecureBaseUrl' => Store::XML_PATH_UNSECURE_BASE_URL, - 'secureBaseUrl' => Store::XML_PATH_SECURE_BASE_URL - ], - \Magento\Store\Model\Store::BASE_URL_PLACEHOLDER + 'process' + )->withConsecutive( + [['key1' => 'value1']], + [['key2' => 'value2']] + )->willReturnOnConsecutiveCalls( + ['key1' => 'value1-processed'], + ['key2' => 'value2-processed'] ); + + $this->model = new \Magento\Store\Model\Config\Processor\Placeholder($this->configPlaceholderMock); } public function testProcess() { $data = [ - 'web' => [ - 'unsecure' => [ - 'base_url' => 'http://localhost/', - 'base_link_url' => '{{unsecure_base_url}}website/de', - ], - 'secure' => [ - 'base_url' => 'https://localhost/', - 'base_link_url' => '{{secure_base_url}}website/de', - ], - ], - 'path' => 'value', - 'some_url' => '{{base_url}}some', + 'default' => ['key1' => 'value1'], + 'websites' => [ + 'code' => ['key2' => 'value2'] + ] ]; - $expectedResult = $data; - $expectedResult['web']['unsecure']['base_link_url'] = 'http://localhost/website/de'; - $expectedResult['web']['secure']['base_link_url'] = 'https://localhost/website/de'; - $expectedResult['some_url'] = 'http://localhost/some'; - $this->assertEquals($expectedResult, $this->_model->process($data)); + $expected = [ + 'default' => ['key1' => 'value1-processed'], + 'websites' => [ + 'code' => ['key2' => 'value2-processed'] + ] + ]; + + $this->assertEquals($expected, $this->model->process($data)); } } diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/DefaultReaderTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/DefaultReaderTest.php deleted file mode 100644 index dccabb9048dd387fc1b6863877e3d4fc95ce4de6..0000000000000000000000000000000000000000 --- a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/DefaultReaderTest.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Store\Test\Unit\Model\Config\Reader; - -use Magento\Framework\App\Config\ScopeConfigInterface; - -class DefaultReaderTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \Magento\Store\Model\Config\Reader\DefaultReader - */ - protected $_model; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_initialConfigMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_collectionFactory; - - protected function setUp() - { - $this->_initialConfigMock = $this->getMock(\Magento\Framework\App\Config\Initial::class, [], [], '', false); - $this->_collectionFactory = $this->getMock( - \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory::class, - ['create'], - [], - '', - false - ); - $this->_model = new \Magento\Store\Model\Config\Reader\DefaultReader( - $this->_initialConfigMock, - new \Magento\Framework\App\Config\Scope\Converter(), - $this->_collectionFactory - ); - } - - public function testRead() - { - $this->_initialConfigMock->expects( - $this->any() - )->method( - 'getData' - )->with( - ScopeConfigInterface::SCOPE_TYPE_DEFAULT - )->will( - $this->returnValue(['config' => ['key1' => 'default_value1', 'key2' => 'default_value2']]) - ); - $this->_collectionFactory->expects( - $this->once() - )->method( - 'create' - )->with( - ['scope' => 'default'] - )->will( - $this->returnValue( - [ - new \Magento\Framework\DataObject(['path' => 'config/key1', 'value' => 'default_db_value1']), - new \Magento\Framework\DataObject(['path' => 'config/key3', 'value' => 'default_db_value3']), - ] - ) - ); - $expectedData = [ - 'config' => ['key1' => 'default_db_value1', 'key2' => 'default_value2', 'key3' => 'default_db_value3'], - ]; - $this->assertEquals($expectedData, $this->_model->read()); - } -} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/ReaderPoolTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/ReaderPoolTest.php deleted file mode 100644 index fb814415fd2dd34cc2a6028880ac0f0417519e9c..0000000000000000000000000000000000000000 --- a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/ReaderPoolTest.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -// @codingStandardsIgnoreFile - -namespace Magento\Store\Test\Unit\Model\Config\Reader; - -class ReaderPoolTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \Magento\Store\Model\Config\Reader\ReaderPool - */ - protected $_model; - - /** - * @var \Magento\Store\Model\Config\Reader\DefaultReader - */ - protected $_defaultReaderMock; - - /** - * @var \Magento\Store\Model\Config\Reader\Website - */ - protected $_websiteReaderMock; - - /** - * @var \Magento\Store\Model\Config\Reader\Store - */ - protected $_storeReaderMock; - - protected function setUp() - { - $this->_defaultReaderMock = $this->getMock( - \Magento\Store\Model\Config\Reader\DefaultReader::class, [], [], '', false - ); - $this->_websiteReaderMock = $this->getMock( - \Magento\Store\Model\Config\Reader\Website::class, [], [], '', false - ); - $this->_storeReaderMock = $this->getMock( - \Magento\Store\Model\Config\Reader\Store::class, [], [], '', false - ); - - $this->_model = new \Magento\Store\Model\Config\Reader\ReaderPool([ - 'default' => $this->_defaultReaderMock, - 'website' => $this->_websiteReaderMock, - 'store' => $this->_storeReaderMock, - ]); - } - - /** - * @covers \Magento\Store\Model\Config\Reader\ReaderPool::getReader - * @dataProvider getReaderDataProvider - * @param string $scope - * @param string $instanceType - */ - public function testGetReader($scope, $instanceType) - { - $this->assertInstanceOf($instanceType, $this->_model->getReader($scope)); - } - - /** - * @return array - */ - public function getReaderDataProvider() - { - return [ - [ - 'scope' => 'default', - 'expectedResult' => \Magento\Store\Model\Config\Reader\DefaultReader::class, - ], - [ - 'scope' => 'website', - 'expectedResult' => \Magento\Store\Model\Config\Reader\Website::class - ], - [ - 'scope' => 'store', - 'expectedResult' => \Magento\Store\Model\Config\Reader\Store::class - ], - ]; - } -} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/DefaultScopeTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/DefaultScopeTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2680bde4c00dcfa53a8c1ac63ebb8c4dd9fca340 --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/DefaultScopeTest.php @@ -0,0 +1,46 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Dynamic; + +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\DataObject; +use Magento\Store\Model\Config\Reader\Source\Dynamic\DefaultScope; +use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory; + +class DefaultScopeTest extends \PHPUnit_Framework_TestCase +{ + public function testGet() + { + $expectedResult = [ + 'config/key1' => 'default_db_value1', + 'config/key3' => 'default_db_value3', + ]; + $collectionFactory = $this->getMockBuilder(ScopedFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $collectionFactory->expects($this->once()) + ->method('create') + ->with(['scope' => ScopeConfigInterface::SCOPE_TYPE_DEFAULT]) + ->willReturn([ + new DataObject(['path' => 'config/key1', 'value' => 'default_db_value1']), + new DataObject(['path' => 'config/key3', 'value' => 'default_db_value3']), + ]); + $converter = $this->getMockBuilder(Converter::class) + ->disableOriginalConstructor() + ->getMock(); + $converter->expects($this->once()) + ->method('convert') + ->with($expectedResult) + ->willReturnArgument(0); + $source = new DefaultScope( + $collectionFactory, + $converter + ); + $this->assertEquals($expectedResult, $source->get()); + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/StoreTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/StoreTest.php new file mode 100644 index 0000000000000000000000000000000000000000..3fef89f4c22d4d258750b30847715160478a8fc5 --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/StoreTest.php @@ -0,0 +1,144 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Dynamic; + +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Store\Model\Config\Reader\Source\Dynamic\Store as StoreSource; +use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory; +use Magento\Store\Model\ScopeInterface; +use Magento\Store\Model\WebsiteFactory; +use Magento\Store\Model\Website; +use Magento\Store\Model\Config\Reader\Source\Dynamic\Website as WebsiteSource; +use Magento\Store\Model\StoreManagerInterface; +use Magento\Store\Api\Data\StoreInterface; +use Magento\Framework\DataObject; + +/** + * Class StoreTest + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class StoreTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ScopedFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $collectionFactory; + + /** + * @var Converter|\PHPUnit_Framework_MockObject_MockObject + */ + private $converter; + + /** + * @var WebsiteFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $websiteFactory; + + /** + * @var Website|\PHPUnit_Framework_MockObject_MockObject + */ + private $website; + + /** + * @var WebsiteSource|\PHPUnit_Framework_MockObject_MockObject + */ + private $websiteSource; + + /** + * @var StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $storeManager; + + /** + * @var StoreInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $store; + + /** + * @var StoreSource + */ + private $storeSource; + + public function setUp() + { + $this->collectionFactory = $this->getMockBuilder(ScopedFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMockForAbstractClass(); + $this->converter = $this->getMockBuilder(Converter::class) + ->disableOriginalConstructor() + ->getMock(); + $this->websiteFactory = $this->getMockBuilder(\Magento\Store\Model\WebsiteFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMockForAbstractClass(); + $this->website = $this->getMockBuilder(\Magento\Store\Model\Website::class) + ->disableOriginalConstructor() + ->getMock(); + $this->websiteSource = $this->getMockBuilder(WebsiteSource::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeManager = $this->getMockBuilder(StoreManagerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $this->store = $this->getMockBuilder(StoreInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeSource = new StoreSource( + $this->collectionFactory, + $this->converter, + $this->websiteFactory, + $this->websiteSource, + $this->storeManager + ); + } + + public function testGet() + { + $scopeCode = 'myStore'; + $expectedResult = [ + 'config/key1' => 'default_db_value1', + 'config/key3' => 'default_db_value3', + ]; + $this->storeManager->expects($this->once()) + ->method('getStore') + ->with($scopeCode) + ->willReturn($this->store); + $this->store->expects($this->once()) + ->method('getId') + ->willReturn(1); + $this->store->expects($this->once()) + ->method('getWebsiteId') + ->willReturn(1); + $this->collectionFactory->expects($this->once()) + ->method('create') + ->with(['scope' => ScopeInterface::SCOPE_STORES, 'scopeId' => 1]) + ->willReturn([ + new DataObject(['path' => 'config/key1', 'value' => 'default_db_value1']), + new DataObject(['path' => 'config/key3', 'value' => 'default_db_value3']), + ]); + $this->websiteSource->expects($this->once()) + ->method('get') + ->with(1) + ->willReturn([]); + + $this->converter->expects($this->at(0)) + ->method('convert') + ->with([ + 'config/key1' => 'default_db_value1', + 'config/key3' => 'default_db_value3' + ]) + ->willReturnArgument(0); + + $this->converter->expects($this->at(1)) + ->method('convert') + ->with($expectedResult) + ->willReturnArgument(0); + + $this->assertEquals($expectedResult, $this->storeSource->get($scopeCode)); + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/WebsiteTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/WebsiteTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b07dafd2fe67b52b9bae650a4ecf1ba198ead47c --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Dynamic/WebsiteTest.php @@ -0,0 +1,113 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Dynamic; + +use Magento\Framework\DataObject; +use Magento\Store\Model\Config\Reader\Source\Dynamic\Website as WebsiteSource; +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory; +use Magento\Store\Model\ScopeInterface; +use Magento\Store\Model\WebsiteFactory; +use Magento\Store\Model\Website; +use Magento\Store\Model\Config\Reader\Source\Dynamic\DefaultScope; + +/** + * Class WebsiteTest + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class WebsiteTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ScopedFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $collectionFactory; + + /** + * @var Converter|\PHPUnit_Framework_MockObject_MockObject + */ + private $converter; + + /** + * @var WebsiteFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $websiteFactory; + + /** + * @var Website|\PHPUnit_Framework_MockObject_MockObject + */ + private $website; + + /** + * @var DefaultScope|\PHPUnit_Framework_MockObject_MockObject + */ + private $defaultScopeReader; + + /** + * @var WebsiteSource + */ + private $websiteSource; + + public function setUp() + { + $this->collectionFactory = $this->getMockBuilder(ScopedFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMockForAbstractClass(); + $this->converter = $this->getMockBuilder(Converter::class) + ->disableOriginalConstructor() + ->getMock(); + $this->websiteFactory = $this->getMockBuilder(\Magento\Store\Model\WebsiteFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMockForAbstractClass(); + $this->website = $this->getMockBuilder(\Magento\Store\Model\Website::class) + ->disableOriginalConstructor() + ->getMock(); + $this->defaultScopeReader = $this->getMockBuilder(DefaultScope::class) + ->disableOriginalConstructor() + ->getMock(); + $this->websiteSource = new WebsiteSource( + $this->collectionFactory, + $this->converter, + $this->websiteFactory, + $this->defaultScopeReader + ); + } + + public function testGet() + { + $scopeCode = 'myWebsite'; + $expectedResult = [ + 'config/key1' => 'default_db_value1', + 'config/key3' => 'default_db_value3', + ]; + $this->websiteFactory->expects($this->once()) + ->method('create') + ->willReturn($this->website); + $this->website->expects($this->once()) + ->method('load') + ->with($scopeCode); + $this->website->expects($this->once()) + ->method('getId') + ->willReturn(1); + $this->collectionFactory->expects($this->once()) + ->method('create') + ->with(['scope' => ScopeInterface::SCOPE_WEBSITES, 'scopeId' => 1]) + ->willReturn([ + new DataObject(['path' => 'config/key1', 'value' => 'default_db_value1']), + new DataObject(['path' => 'config/key3', 'value' => 'default_db_value3']), + ]); + $this->defaultScopeReader->expects($this->once()) + ->method('get') + ->willReturn([]); + $this->converter->expects($this->once()) + ->method('convert') + ->with($expectedResult) + ->willReturnArgument(0); + $this->assertEquals($expectedResult, $this->websiteSource->get($scopeCode)); + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/DefaultScopeTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/DefaultScopeTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d0b68c59749f89b3bd2bf2e182678d39185750e9 --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/DefaultScopeTest.php @@ -0,0 +1,34 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Initial; + +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Store\Model\Config\Reader\Source\Initial\DefaultScope; +use Magento\Framework\App\Config\Scope\Converter; + +class DefaultScopeTest extends \PHPUnit_Framework_TestCase +{ + public function testGet() + { + $initialConfig = $this->getMockBuilder(\Magento\Framework\App\Config\Initial::class) + ->disableOriginalConstructor() + ->getMock(); + $initialConfig->expects($this->once()) + ->method('getData') + ->with(ScopeConfigInterface::SCOPE_TYPE_DEFAULT) + ->willReturn([]); + $converter = $this->getMockBuilder(Converter::class) + ->disableOriginalConstructor() + ->getMock(); + $converter->expects($this->once()) + ->method('convert') + ->with([]) + ->willReturnArgument(0); + + $defaultSource = new DefaultScope($initialConfig, $converter); + $this->assertEquals([], $defaultSource->get()); + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/StoreTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/StoreTest.php new file mode 100644 index 0000000000000000000000000000000000000000..14531490cf4d072eab19e00a138f995f1497f9df --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/StoreTest.php @@ -0,0 +1,81 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Initial; + +use Magento\Store\Model\Config\Reader\Source\Initial\Store; +use Magento\Framework\App\Config\Initial; +use Magento\Store\Model\Config\Reader\Source\Initial\Website; +use Magento\Store\Model\StoreManagerInterface; +use Magento\Framework\App\Config\Scope\Converter; + +class StoreTest extends \PHPUnit_Framework_TestCase +{ + public function testGet() + { + $scopeCode = 'myStore'; + $websiteCode = 'myWebsite'; + $initialConfig = $this->getMockBuilder(Initial::class) + ->disableOriginalConstructor() + ->getMock(); + $initialConfig->expects($this->once()) + ->method('getData') + ->with("stores|$scopeCode") + ->willReturn([ + 'general' => [ + 'locale' => [ + 'code'=> 'en_US' + ] + ] + ]); + $websiteSource = $this->getMockBuilder(Website::class) + ->disableOriginalConstructor() + ->getMock(); + $websiteSource->expects($this->once()) + ->method('get') + ->with($websiteCode) + ->willReturn([ + 'general' => [ + 'locale' => [ + 'code'=> 'ru_RU' + ] + ] + ]); + $storeManager = $this->getMockBuilder(StoreManagerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $store = $this->getMockBuilder(\Magento\Store\Model\Store::class) + ->disableOriginalConstructor() + ->getMock(); + $store->expects($this->once()) + ->method('getData') + ->with('website_code') + ->willReturn('myWebsite'); + + $storeManager->expects($this->once()) + ->method('getStore') + ->with($scopeCode) + ->willReturn($store); + + $converter = $this->getMockBuilder(Converter::class) + ->disableOriginalConstructor() + ->getMock(); + $converter->expects($this->once()) + ->method('convert') + ->willReturnArgument(0); + + $storeSource = new Store($initialConfig, $websiteSource, $storeManager, $converter); + $this->assertEquals( + [ + 'general' => [ + 'locale' => [ + 'code'=> 'en_US' + ] + ] + ], + $storeSource->get($scopeCode) + ); + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/WebsiteTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/WebsiteTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6a4f3dd189eacf14f98b2d365da48b59b105063b --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/Source/Initial/WebsiteTest.php @@ -0,0 +1,62 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Test\Unit\Model\Config\Reader\Source\Initial; + +use Magento\Framework\App\Config\Initial; +use Magento\Store\Model\Config\Reader\Source\Initial\DefaultScope; +use Magento\Store\Model\Config\Reader\Source\Initial\Website; +use Magento\Framework\App\Config\Scope\Converter; + +class WebsiteTest extends \PHPUnit_Framework_TestCase +{ + public function testGet() + { + $scopeCode = 'myWebsite'; + $initialConfig = $this->getMockBuilder(Initial::class) + ->disableOriginalConstructor() + ->getMock(); + $initialConfig->expects($this->once()) + ->method('getData') + ->with("websites|$scopeCode") + ->willReturn([ + 'general' => [ + 'locale' => [ + 'code'=> 'en_US' + ] + ] + ]); + $defaultScopeReader = $this->getMockBuilder(DefaultScope::class) + ->disableOriginalConstructor() + ->getMock(); + $defaultScopeReader->expects($this->once()) + ->method('get') + ->willReturn([ + 'general' => [ + 'locale' => [ + 'code'=> 'ru_RU' + ] + ] + ]); + $converter = $this->getMockBuilder(Converter::class) + ->disableOriginalConstructor() + ->getMock(); + $converter->expects($this->once()) + ->method('convert') + ->willReturnArgument(0); + + $websiteSource = new Website($initialConfig, $defaultScopeReader, $converter); + $this->assertEquals( + [ + 'general' => [ + 'locale' => [ + 'code'=> 'en_US' + ] + ] + ], + $websiteSource->get($scopeCode) + ); + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/StoreTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/StoreTest.php deleted file mode 100644 index a3db4f89c1b876d660805343302e72f4e333bdab..0000000000000000000000000000000000000000 --- a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/StoreTest.php +++ /dev/null @@ -1,159 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Store\Test\Unit\Model\Config\Reader; - -class StoreTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \Magento\Store\Model\Config\Reader\Store - */ - protected $_model; - - /** - * @var \Magento\Framework\App\Config\ScopePool|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_scopePullMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_initialConfigMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_collectionFactory; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_storeMock; - - /** - * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_storeManagerMock; - - protected function setUp() - { - $this->_scopePullMock = $this->getMock(\Magento\Framework\App\Config\ScopePool::class, [], [], '', false); - $this->_storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class); - $this->_initialConfigMock = $this->getMock(\Magento\Framework\App\Config\Initial::class, [], [], '', false); - $this->_collectionFactory = $this->getMock( - \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory::class, - ['create'], - [], - '', - false - ); - $this->_storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false); - $placeholderProcessor = $this->getMock( - \Magento\Store\Model\Config\Processor\Placeholder::class, - [], - [], - '', - false - ); - $placeholderProcessor->expects($this->any())->method('process')->will($this->returnArgument(0)); - $this->_model = new \Magento\Store\Model\Config\Reader\Store( - $this->_initialConfigMock, - $this->_scopePullMock, - new \Magento\Store\Model\Config\Converter($placeholderProcessor), - $this->_collectionFactory, - $this->_storeManagerMock - ); - } - - /** - * @dataProvider readDataProvider - * @param string|null $storeCode - */ - public function testRead($storeCode) - { - $websiteCode = 'default'; - $storeId = 1; - $websiteMock = $this->getMock(\Magento\Store\Model\Website::class, [], [], '', false); - $websiteMock->expects($this->any())->method('getCode')->will($this->returnValue($websiteCode)); - $this->_storeMock->expects($this->any())->method('getWebsite')->will($this->returnValue($websiteMock)); - $this->_storeMock->expects($this->any())->method('getId')->will($this->returnValue($storeId)); - $this->_storeMock->expects($this->any())->method('getCode')->will($this->returnValue($websiteCode)); - - $dataMock = $this->getMock(\Magento\Framework\App\Config\Data::class, [], [], '', false); - $dataMock->expects( - $this->any() - )->method( - 'getValue' - )->will( - $this->returnValue(['config' => ['key0' => 'website_value0', 'key1' => 'website_value1']]) - ); - - $dataMock->expects( - $this->once() - )->method( - 'getSource' - )->will( - $this->returnValue(['config' => ['key0' => 'website_value0', 'key1' => 'website_value1']]) - ); - $this->_scopePullMock->expects( - $this->once() - )->method( - 'getScope' - )->with( - 'website', - $websiteCode - )->will( - $this->returnValue($dataMock) - ); - - $this->_initialConfigMock->expects( - $this->once() - )->method( - 'getData' - )->with( - "stores|{$storeCode}" - )->will( - $this->returnValue(['config' => ['key1' => 'store_value1', 'key2' => 'store_value2']]) - ); - $this->_collectionFactory->expects( - $this->once() - )->method( - 'create' - )->with( - ['scope' => 'stores', 'scopeId' => $storeId] - )->will( - $this->returnValue( - [ - new \Magento\Framework\DataObject(['path' => 'config/key1', 'value' => 'store_db_value1']), - new \Magento\Framework\DataObject(['path' => 'config/key3', 'value' => 'store_db_value3']), - ] - ) - ); - - $this->_storeManagerMock - ->expects($this->any()) - ->method('getStore') - ->with($storeCode) - ->will($this->returnValue($this->_storeMock)); - $expectedData = [ - 'config' => [ - 'key0' => 'website_value0', - 'key1' => 'store_db_value1', - 'key2' => 'store_value2', - 'key3' => 'store_db_value3', - ], - ]; - $this->assertEquals($expectedData, $this->_model->read($storeCode)); - } - - public function readDataProvider() - { - return [ - ['default'], - [null], - ['code', ''] - ]; - } -} diff --git a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/WebsiteTest.php b/app/code/Magento/Store/Test/Unit/Model/Config/Reader/WebsiteTest.php deleted file mode 100644 index 8aed6de6dd235bbcbc86bd7b996562eb3a42017d..0000000000000000000000000000000000000000 --- a/app/code/Magento/Store/Test/Unit/Model/Config/Reader/WebsiteTest.php +++ /dev/null @@ -1,131 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Store\Test\Unit\Model\Config\Reader; - -class WebsiteTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \Magento\Store\Model\Config\Reader\Website - */ - protected $_model; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_initialConfigMock; - - /** - * @var \Magento\Framework\App\Config\ScopePool|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_scopePullMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_collectionFactory; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $_websiteMock; - - protected function setUp() - { - $this->_initialConfigMock = $this->getMock(\Magento\Framework\App\Config\Initial::class, [], [], '', false); - $this->_scopePullMock = $this->getMock(\Magento\Framework\App\Config\ScopePool::class, [], [], '', false); - $this->_collectionFactory = $this->getMock( - \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFactory::class, - ['create'], - [], - '', - false - ); - $websiteFactoryMock = $this->getMock( - \Magento\Store\Model\WebsiteFactory::class, - ['create'], - [], - '', - false - ); - $this->_websiteMock = $this->getMock(\Magento\Store\Model\Website::class, [], [], '', false); - $websiteFactoryMock->expects($this->any())->method('create')->will($this->returnValue($this->_websiteMock)); - - $this->_model = new \Magento\Store\Model\Config\Reader\Website( - $this->_initialConfigMock, - $this->_scopePullMock, - new \Magento\Framework\App\Config\Scope\Converter(), - $this->_collectionFactory, - $websiteFactoryMock - ); - } - - public function testRead() - { - $websiteCode = 'default'; - $websiteId = 1; - - $dataMock = $this->getMock(\Magento\Framework\App\Config\Data::class, [], [], '', false); - $dataMock->expects( - $this->any() - )->method( - 'getValue' - )->will( - $this->returnValue(['config' => ['key0' => 'default_value0', 'key1' => 'default_value1']]) - ); - $dataMock->expects( - $this->once() - )->method( - 'getSource' - )->will( - $this->returnValue(['config' => ['key0' => 'default_value0', 'key1' => 'default_value1']]) - ); - $this->_scopePullMock->expects( - $this->once() - )->method( - 'getScope' - )->with( - 'default', - null - )->will( - $this->returnValue($dataMock) - ); - - $this->_initialConfigMock->expects( - $this->any() - )->method( - 'getData' - )->with( - "websites|{$websiteCode}" - )->will( - $this->returnValue(['config' => ['key1' => 'website_value1', 'key2' => 'website_value2']]) - ); - $this->_websiteMock->expects($this->once())->method('load')->with($websiteCode); - $this->_websiteMock->expects($this->any())->method('getId')->will($this->returnValue($websiteId)); - $this->_collectionFactory->expects( - $this->once() - )->method( - 'create' - )->with( - ['scope' => 'websites', 'scopeId' => $websiteId] - )->will( - $this->returnValue( - [ - new \Magento\Framework\DataObject(['path' => 'config/key1', 'value' => 'website_db_value1']), - new \Magento\Framework\DataObject(['path' => 'config/key3', 'value' => 'website_db_value3']), - ] - ) - ); - $expectedData = [ - 'config' => [ - 'key0' => 'default_value0', - 'key1' => 'website_db_value1', - 'key2' => 'website_value2', - 'key3' => 'website_db_value3', - ], - ]; - $this->assertEquals($expectedData, $this->_model->read($websiteCode)); - } -} diff --git a/app/code/Magento/Store/Test/Unit/Model/StoreManagerTest.php b/app/code/Magento/Store/Test/Unit/Model/StoreManagerTest.php index 8e32ba2f989a90e4055d5186f2f11490b09dbfeb..f9d110359895ecd73c8c06f3cd0a438c98c5d090 100644 --- a/app/code/Magento/Store/Test/Unit/Model/StoreManagerTest.php +++ b/app/code/Magento/Store/Test/Unit/Model/StoreManagerTest.php @@ -6,6 +6,8 @@ namespace Magento\Store\Test\Unit\Model; +use Magento\Framework\App\DeploymentConfig; + class StoreManagerTest extends \PHPUnit_Framework_TestCase { /** diff --git a/app/code/Magento/Store/Test/Unit/Model/StoreRepositoryTest.php b/app/code/Magento/Store/Test/Unit/Model/StoreRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..43bb331c017b218bce651515b6933c3e917aafcd --- /dev/null +++ b/app/code/Magento/Store/Test/Unit/Model/StoreRepositoryTest.php @@ -0,0 +1,185 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Store\Test\Unit\Model; + +use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Store\Api\Data\StoreInterface; +use Magento\Store\Api\StoreRepositoryInterface; +use Magento\Store\Model\ResourceModel\Store\Collection; +use Magento\Store\Model\ResourceModel\Store\CollectionFactory; +use Magento\Store\Model\Store; +use Magento\Store\Model\StoreFactory; +use Magento\Store\Model\StoreRepository; +use Magento\Framework\App\Config; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class StoreRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var StoreFactory | \PHPUnit_Framework_MockObject_MockObject + */ + protected $storeFactory; + + /** + * @var CollectionFactory | \PHPUnit_Framework_MockObject_MockObject + */ + protected $storeCollectionFactory; + + /** + * @var bool + */ + protected $allLoaded = false; + + /** + * @var StoreRepositoryInterface + */ + private $storeRepository; + + /** + * @var Config | \PHPUnit_Framework_MockObject_MockObject + */ + private $appConfigMock; + + public function setUp() + { + $this->storeFactory = $this->getMockBuilder(StoreFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->storeCollectionFactory = $this->getMockBuilder(CollectionFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->storeRepository = new StoreRepository( + $this->storeFactory, + $this->storeCollectionFactory + ); + $this->appConfigMock = $this->getMockBuilder(Config::class) + ->disableOriginalConstructor() + ->getMock(); + $this->initDistroList(); + } + + private function initDistroList() + { + $repositoryReflection = new \ReflectionClass($this->storeRepository); + $deploymentProperty = $repositoryReflection->getProperty('appConfig'); + $deploymentProperty->setAccessible(true); + $deploymentProperty->setValue($this->storeRepository, $this->appConfigMock); + } + + /** + * @expectedException \Magento\Framework\Exception\NoSuchEntityException + * @expectedExceptionMessage Requested store is not found + */ + public function testGetWithException() + { + $storeMock = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeFactory->expects($this->once()) + ->method('create') + ->willReturn($storeMock); + + $this->storeRepository->get('some_code'); + } + + public function testGetWithAvailableStoreFromScope() + { + $storeMock = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->getMock(); + $storeMock->expects($this->exactly(2)) + ->method('getId') + ->willReturn(1); + $this->storeFactory->expects($this->once()) + ->method('create') + ->willReturn($storeMock); + + $this->assertEquals($storeMock, $this->storeRepository->get('some_code')); + } + + public function testGetByIdWithAvailableStoreFromScope() + { + $storeMock = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->getMock(); + $storeMock->expects($this->once()) + ->method('getId') + ->willReturn(1); + $storeMock->expects($this->once()) + ->method('getCode') + ->willReturn('some_code'); + $this->storeFactory->expects($this->once()) + ->method('create') + ->willReturn($storeMock); + $this->appConfigMock->expects($this->once()) + ->method('get') + ->willReturn([]); + + $this->assertEquals($storeMock, $this->storeRepository->getById(1)); + } + + /** + * @expectedException \Magento\Framework\Exception\NoSuchEntityException + * @expectedExceptionMessage Requested store is not found + */ + public function testGetByIdWithException() + { + $storeMock = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeFactory->expects($this->once()) + ->method('create') + ->willReturn($storeMock); + $this->appConfigMock->expects($this->once()) + ->method('get') + ->willReturn([]); + $this->storeRepository->getById(1); + } + + public function testGetList() + { + $storeMock1 = $this->getMock(StoreInterface::class); + $storeMock1->expects($this->once()) + ->method('getCode') + ->willReturn('some_code'); + $storeMock1->expects($this->once()) + ->method('getId') + ->willReturn(1); + $storeMock2 = $this->getMock(StoreInterface::class); + $storeMock2->expects($this->once()) + ->method('getCode') + ->willReturn('some_code_2'); + $storeMock2->expects($this->once()) + ->method('getId') + ->willReturn(2); + $this->appConfigMock->expects($this->once()) + ->method('get') + ->willReturn([ + [ + 'code' => 'some_code' + ], + [ + 'code' => 'some_code_2' + ] + ]); + $this->storeFactory->expects($this->at(0)) + ->method('create') + ->willReturn($storeMock1); + $this->storeFactory->expects($this->at(1)) + ->method('create') + ->willReturn($storeMock2); + + $this->assertEquals( + ['some_code' => $storeMock1, 'some_code_2' => $storeMock2], + $this->storeRepository->getList() + ); + } +} diff --git a/app/code/Magento/Store/Test/Unit/Model/WebsiteRepositoryTest.php b/app/code/Magento/Store/Test/Unit/Model/WebsiteRepositoryTest.php index 3cc8b646f75d438cda892bb7c228b64a70514778..fdb2e4530bfdb096563bb8a02b8ef9554df26a2a 100644 --- a/app/code/Magento/Store/Test/Unit/Model/WebsiteRepositoryTest.php +++ b/app/code/Magento/Store/Test/Unit/Model/WebsiteRepositoryTest.php @@ -6,6 +6,8 @@ namespace Magento\Store\Test\Unit\Model; +use Magento\Framework\App\Config; + class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase { /** @@ -13,14 +15,29 @@ class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase */ protected $model; + /** + * @var \Magento\Store\Model\WebsiteFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $websiteFactoryMock; + /** * @var \Magento\Store\Model\ResourceModel\Website\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $websiteCollectionFactoryMock; + /** + * @var Config | \PHPUnit_Framework_MockObject_MockObject + */ + private $appConfigMock; + protected function setUp() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->websiteFactoryMock = + $this->getMockBuilder('Magento\Store\Model\WebsiteFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); $this->websiteCollectionFactoryMock = $this->getMockBuilder(\Magento\Store\Model\ResourceModel\Website\CollectionFactory::class) ->disableOriginalConstructor() @@ -29,26 +46,46 @@ class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase $this->model = $objectManager->getObject( \Magento\Store\Model\WebsiteRepository::class, [ + 'factory' => $this->websiteFactoryMock, 'websiteCollectionFactory' => $this->websiteCollectionFactoryMock ] ); + $this->appConfigMock = $this->getMockBuilder(Config::class) + ->disableOriginalConstructor() + ->getMock(); + $this->initDistroList(); + } + private function initDistroList() + { + $repositoryReflection = new \ReflectionClass($this->model); + $deploymentProperty = $repositoryReflection->getProperty('appConfig'); + $deploymentProperty->setAccessible(true); + $deploymentProperty->setValue($this->model, $this->appConfigMock); } public function testGetDefault() { - $collectionMock = $this->getMockBuilder(\Magento\Store\Model\ResourceModel\Website\Collection::class) - ->disableOriginalConstructor() - ->setMethods([]) - ->getMock(); $websiteMock = $this->getMockBuilder(\Magento\Store\Api\Data\WebsiteInterface::class) ->disableOriginalConstructor() ->setMethods([]) ->getMock(); - $this->websiteCollectionFactoryMock->expects($this->any())->method('create')->willReturn($collectionMock); - $collectionMock->expects($this->any())->method('addFieldToFilter'); - $collectionMock->expects($this->any())->method('getItems')->willReturn([1]); - $collectionMock->expects($this->any())->method('getFirstItem')->willReturn($websiteMock); + $this->appConfigMock->expects($this->once()) + ->method('get') + ->with('scopes', 'websites') + ->willReturn([ + 'some_code' => [ + 'code' => 'some_code', + 'is_default' => 1 + ], + 'some_code_2' => [ + 'code' => 'some_code_2', + 'is_default' => 0 + ] + ]); + $this->websiteFactoryMock->expects($this->at(0)) + ->method('create') + ->willReturn($websiteMock); $website = $this->model->getDefault(); $this->assertInstanceOf(\Magento\Store\Api\Data\WebsiteInterface::class, $website); @@ -61,13 +98,24 @@ class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase */ public function testGetDefaultIsSeveral() { - $collectionMock = $this->getMockBuilder(\Magento\Store\Model\ResourceModel\Website\Collection::class) + $websiteMock = $this->getMockBuilder(\Magento\Store\Api\Data\WebsiteInterface::class) ->disableOriginalConstructor() ->setMethods([]) ->getMock(); - $this->websiteCollectionFactoryMock->expects($this->any())->method('create')->willReturn($collectionMock); - $collectionMock->expects($this->any())->method('addFieldToFilter'); - $collectionMock->expects($this->any())->method('getItems')->willReturn([1, 2]); + $this->appConfigMock->expects($this->once()) + ->method('get') + ->with('scopes', 'websites') + ->willReturn([ + 'some_code' => [ + 'code' => 'some_code', + 'is_default' => 1 + ], + 'some_code_2' => [ + 'code' => 'some_code_2', + 'is_default' => 1 + ] + ]); + $this->websiteFactoryMock->expects($this->any())->method('create')->willReturn($websiteMock); $this->model->getDefault(); } @@ -78,13 +126,24 @@ class WebsiteRepositoryTest extends \PHPUnit_Framework_TestCase */ public function testGetDefaultIsZero() { - $collectionMock = $this->getMockBuilder(\Magento\Store\Model\ResourceModel\Website\Collection::class) + $websiteMock = $this->getMockBuilder(\Magento\Store\Api\Data\WebsiteInterface::class) ->disableOriginalConstructor() ->setMethods([]) ->getMock(); - $this->websiteCollectionFactoryMock->expects($this->any())->method('create')->willReturn($collectionMock); - $collectionMock->expects($this->any())->method('addFieldToFilter'); - $collectionMock->expects($this->any())->method('getItems')->willReturn([]); + $this->appConfigMock->expects($this->once()) + ->method('get') + ->with('scopes', 'websites') + ->willReturn([ + 'some_code' => [ + 'code' => 'some_code', + 'is_default' => 0 + ], + 'some_code_2' => [ + 'code' => 'some_code_2', + 'is_default' => 0 + ] + ]); + $this->websiteFactoryMock->expects($this->any())->method('create')->willReturn($websiteMock); $this->model->getDefault(); } diff --git a/app/code/Magento/Store/composer.json b/app/code/Magento/Store/composer.json index d5b8a2b4b980b58648c04cfed916b5bd390db048..1c74c46cdf89f3aaa0bf5efc3143556d610e518b 100644 --- a/app/code/Magento/Store/composer.json +++ b/app/code/Magento/Store/composer.json @@ -10,6 +10,9 @@ "magento/module-media-storage": "100.2.*", "magento/framework": "100.2.*" }, + "suggest": { + "magento/module-deploy": "100.2.*" + }, "type": "magento2-module", "version": "100.2.0-dev", "license": [ diff --git a/app/code/Magento/Store/etc/di.xml b/app/code/Magento/Store/etc/di.xml index 57bf057af2724c220d3e7d1bda152351a8b9de88..7307493cefb4cca65eb81eacaec265e9a381f6f1 100644 --- a/app/code/Magento/Store/etc/di.xml +++ b/app/code/Magento/Store/etc/di.xml @@ -33,28 +33,11 @@ <argument name="xFrameOpt" xsi:type="init_parameter">Magento\Framework\App\Response\HeaderProvider\XFrameOptions::DEPLOYMENT_CONFIG_X_FRAME_OPT</argument> </arguments> </type> - <type name="Magento\Framework\App\Config\ScopePool"> - <arguments> - <argument name="readerPool" xsi:type="object">Magento\Store\Model\Config\Reader\ReaderPool\Proxy</argument> - <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument> - </arguments> - </type> <type name="Magento\Framework\View\Element\Template\File\Validator"> <arguments> <argument name="scope" xsi:type="string">store</argument> </arguments> </type> - <type name="Magento\Store\Model\Config\Reader\Website"> - <arguments> - <argument name="scopePool" xsi:type="object">Magento\Framework\App\Config\ScopePool\Proxy</argument> - </arguments> - </type> - <type name="Magento\Store\Model\Config\Reader\Store"> - <arguments> - <argument name="scopePool" xsi:type="object">Magento\Framework\App\Config\ScopePool\Proxy</argument> - <argument name="storeManager" xsi:type="object">Magento\Store\Model\StoreManagerInterface\Proxy</argument> - </arguments> - </type> <type name="Magento\Store\Model\Resolver\Store"> <arguments> <argument name="storeManager" xsi:type="object">Magento\Store\Model\StoreManagerInterface\Proxy</argument> @@ -70,18 +53,6 @@ <argument name="storeManager" xsi:type="object">Magento\Store\Model\StoreManagerInterface\Proxy</argument> </arguments> </type> - <type name="Magento\Store\Model\Config\Reader\ReaderPool"> - <arguments> - <argument name="readers" xsi:type="array"> - <item name="default" xsi:type="object">Magento\Store\Model\Config\Reader\DefaultReader</item> - <item name="website" xsi:type="object">Magento\Store\Model\Config\Reader\Website</item> - <item name="websites" xsi:type="object">Magento\Store\Model\Config\Reader\Website</item> - <item name="store" xsi:type="object">Magento\Store\Model\Config\Reader\Store</item> - <item name="stores" xsi:type="object">Magento\Store\Model\Config\Reader\Store</item> - </argument> - </arguments> - </type> - <preference for="Magento\Framework\App\Config\Scope\ReaderPoolInterface" type="Magento\Store\Model\Config\Reader\ReaderPool"/> <preference for="Magento\Framework\App\ScopeResolverInterface" type="Magento\Store\Model\Resolver\Store" /> <preference for="Magento\Framework\App\Router\PathConfigInterface" type="Magento\Store\Model\PathConfig" /> <type name="\Magento\Framework\App\Action\AbstractAction"> @@ -164,7 +135,7 @@ <argument name="cacheLifetime" xsi:type="boolean">false</argument> </arguments> </virtualType> - <type name="Magento\Store\Model\Config\Processor\Placeholder"> + <type name="Magento\Store\Model\Config\Placeholder"> <arguments> <argument name="request" xsi:type="object">Magento\Framework\App\Request\Http\Proxy</argument> <argument name="urlPaths" xsi:type="array"> @@ -344,4 +315,59 @@ </argument> </arguments> </type> + <virtualType name="systemConfigPostProcessorComposite" type="Magento\Framework\App\Config\PostProcessorComposite"> + <arguments> + <argument name="processors" xsi:type="array"> + <item name="placeholder" xsi:type="object">Magento\Store\Model\Config\Processor\Placeholder</item> + </argument> + </arguments> + </virtualType> + <type name="Magento\Framework\App\Config"> + <arguments> + <argument name="types" xsi:type="array"> + <item name="scopes" xsi:type="object">Magento\Store\App\Config\Type\Scopes</item> + </argument> + </arguments> + </type> + <type name="Magento\Store\App\Config\Type\Scopes"> + <arguments> + <argument name="source" xsi:type="object">scopesConfigSourceAggregatedProxy</argument> + </arguments> + </type> + <virtualType name="scopesConfigSourceAggregatedProxy" type="Magento\Framework\App\Config\ConfigSourceAggregated\Proxy"> + <arguments> + <argument name="instanceName" xsi:type="string">scopesConfigSourceAggregated</argument> + </arguments> + </virtualType> + <virtualType name="scopesConfigSourceAggregated" type="Magento\Framework\App\Config\ConfigSourceAggregated"> + <arguments> + <argument name="sources" xsi:type="array"> + <item name="initial" xsi:type="array"> + <item name="source" xsi:type="object">scopesConfigInitialDataProvider</item> + <item name="sortOrder" xsi:type="string">10</item> + </item> + <item name="runtime" xsi:type="array"> + <item name="source" xsi:type="object">Magento\Store\App\Config\Source\RuntimeConfigSource</item> + <item name="sortOrder" xsi:type="string">10</item> + </item> + </argument> + </arguments> + </virtualType> + <virtualType name="scopesConfigInitialDataProvider" type="Magento\Framework\App\Config\InitialConfigSource"> + <arguments> + <argument name="reader" xsi:type="object">Magento\Framework\App\DeploymentConfig\Reader</argument> + <argument name="configType" xsi:type="const">Magento\Store\App\Config\Type\Scopes::CONFIG_TYPE</argument> + <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument> + </arguments> + </virtualType> + <type name="Magento\Deploy\Console\Command\App\ApplicationDumpCommand"> + <arguments> + <argument name="sources" xsi:type="array"> + <item name="scopes" xsi:type="array"> + <item name="source" xsi:type="object">scopesConfigSourceAggregated</item> + <item name="namespace" xsi:type="const">Magento\Store\App\Config\Type\Scopes::CONFIG_TYPE</item> + </item> + </argument> + </arguments> + </type> </config> diff --git a/app/code/Magento/Theme/Model/Design.php b/app/code/Magento/Theme/Model/Design.php index 39527afc0250d77e0e9ac6d8f9a2941e76e07398..55941cfbcacb6003ef1f03a5a834c1272d40dda8 100644 --- a/app/code/Magento/Theme/Model/Design.php +++ b/app/code/Magento/Theme/Model/Design.php @@ -6,9 +6,11 @@ namespace Magento\Theme\Model; use Magento\Framework\App\DesignInterface; +use Magento\Framework\App\ObjectManager; use Magento\Framework\Model\AbstractModel; use Magento\Framework\Model\ResourceModel\AbstractResource; use Magento\Framework\DataObject\IdentityInterface; +use Magento\Framework\Serialize\SerializerInterface; /** * Design settings change model @@ -55,6 +57,11 @@ class Design extends AbstractModel implements IdentityInterface, DesignInterface */ protected $_dateTime; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -63,6 +70,7 @@ class Design extends AbstractModel implements IdentityInterface, DesignInterface * @param AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data + * @param SerializerInterface $serializer */ public function __construct( \Magento\Framework\Model\Context $context, @@ -71,10 +79,12 @@ class Design extends AbstractModel implements IdentityInterface, DesignInterface \Magento\Framework\Stdlib\DateTime $dateTime, AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, - array $data = [] + array $data = [], + SerializerInterface $serializer = null ) { $this->_localeDate = $localeDate; $this->_dateTime = $dateTime; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); parent::__construct($context, $registry, $resource, $resourceCollection, $data); } @@ -108,9 +118,9 @@ class Design extends AbstractModel implements IdentityInterface, DesignInterface if (!$result) { $result = []; } - $this->_cacheManager->save(serialize($result), $changeCacheId, [self::CACHE_TAG], 86400); + $this->_cacheManager->save($this->serializer->serialize($result), $changeCacheId, [self::CACHE_TAG], 86400); } else { - $result = unserialize($result); + $result = $this->serializer->unserialize($result); } if ($result) { diff --git a/app/code/Magento/Theme/Model/Theme/ThemeProvider.php b/app/code/Magento/Theme/Model/Theme/ThemeProvider.php index 9fd3ce94dac45888687cbe6bff26f86a2ac9d2e7..89d7bfc18d30c27026777f7864b562354277dfee 100644 --- a/app/code/Magento/Theme/Model/Theme/ThemeProvider.php +++ b/app/code/Magento/Theme/Model/Theme/ThemeProvider.php @@ -5,6 +5,13 @@ */ namespace Magento\Theme\Model\Theme; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\View\Design\Theme\ListInterface; +use Magento\Framework\App\DeploymentConfig; + +/** + * Provide data for theme grid and for theme edit page + */ class ThemeProvider implements \Magento\Framework\View\Design\Theme\ThemeProviderInterface { /** @@ -27,6 +34,16 @@ class ThemeProvider implements \Magento\Framework\View\Design\Theme\ThemeProvide */ private $themes; + /** + * @var ListInterface + */ + private $themeList; + + /** + * @var DeploymentConfig + */ + private $deploymentConfig; + /** * ThemeProvider constructor. * @@ -52,6 +69,11 @@ class ThemeProvider implements \Magento\Framework\View\Design\Theme\ThemeProvide if (isset($this->themes[$fullPath])) { return $this->themes[$fullPath]; } + + if (! $this->getDeploymentConfig()->isDbAvailable()) { + return $this->getThemeList()->getThemeByFullPath($fullPath); + } + /** @var $themeCollection \Magento\Theme\Model\ResourceModel\Theme\Collection */ $theme = $this->cache->load('theme'. $fullPath); if ($theme) { @@ -105,4 +127,28 @@ class ThemeProvider implements \Magento\Framework\View\Design\Theme\ThemeProvide } return $themeModel; } + + /** + * @deprecated + * @return ListInterface + */ + private function getThemeList() + { + if ($this->themeList === null) { + $this->themeList = ObjectManager::getInstance()->get(ListInterface::class); + } + return $this->themeList; + } + + /** + * @deprecated + * @return DeploymentConfig + */ + private function getDeploymentConfig() + { + if ($this->deploymentConfig === null) { + $this->deploymentConfig = ObjectManager::getInstance()->get(DeploymentConfig::class); + } + return $this->deploymentConfig; + } } diff --git a/app/code/Magento/Theme/Test/Unit/Model/DesignTest.php b/app/code/Magento/Theme/Test/Unit/Model/DesignTest.php index dc11a4c46eda53a9fad92048f1c65d583ddcb607..67f86575a8afdb4143d5ebc5a213b472553bc463 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/DesignTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/DesignTest.php @@ -9,6 +9,7 @@ */ namespace Magento\Theme\Test\Unit\Model; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Theme\Model\Design; class DesignTest extends \PHPUnit_Framework_TestCase @@ -23,11 +24,6 @@ class DesignTest extends \PHPUnit_Framework_TestCase */ protected $cacheManager; - /** - * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject - */ - protected $registry; - /** * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject */ @@ -44,18 +40,15 @@ class DesignTest extends \PHPUnit_Framework_TestCase protected $resource; /** - * @var \Magento\Framework\Data\Collection\AbstractDb|\PHPUnit_Framework_MockObject_MockObject + * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $resourceCollection; + private $serializerMock; protected function setUp() { $context = $this->getMockBuilder(\Magento\Framework\Model\Context::class) ->disableOriginalConstructor() ->getMock(); - $this->registry = $this->getMockBuilder( - \Magento\Framework\Registry::class - )->disableOriginalConstructor()->getMock(); $this->localeDate = $this->getMockBuilder( \Magento\Framework\Stdlib\DateTime\TimezoneInterface::class )->getMock(); @@ -65,25 +58,24 @@ class DesignTest extends \PHPUnit_Framework_TestCase $this->resource = $this->getMockBuilder(\Magento\Theme\Model\ResourceModel\Design::class) ->disableOriginalConstructor() ->getMock(); - $this->resourceCollection = $this->getMockBuilder(\Magento\Theme\Model\ResourceModel\Design\Collection::class) - ->disableOriginalConstructor() - ->getMock(); $this->cacheManager = $this->getMockBuilder(\Magento\Framework\App\CacheInterface::class)->getMock(); $context->expects($this->any()) ->method('getCacheManager') ->willReturn($this->cacheManager); - /** - * @var $context \Magento\Framework\Model\Context - */ - $this->model = new Design( - $context, - $this->registry, - $this->localeDate, - $this->dateTime, - $this->resource, - $this->resourceCollection + $this->serializerMock = $this->getMock(SerializerInterface::class); + + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->model = $objectManager->getObject( + Design::class, + [ + 'context' => $context, + 'localeDate' => $this->localeDate, + 'dateTime' => $this->dateTime, + 'resource' => $this->resource, + 'serializer' => $this->serializerMock, + ] ); } @@ -119,9 +111,12 @@ class DesignTest extends \PHPUnit_Framework_TestCase ->method('loadChange') ->with($storeId, $date) ->willReturn(false); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->willReturn('serializedData'); $this->cacheManager->expects($this->once()) ->method('save') - ->with(serialize([]), $cacheId, [Design::CACHE_TAG], 86400) + ->with('serializedData', $cacheId, [Design::CACHE_TAG], 86400) ->willReturnSelf(); $this->assertInstanceOf(get_class($this->model), $this->model->loadChange($storeId)); @@ -151,9 +146,16 @@ class DesignTest extends \PHPUnit_Framework_TestCase $this->cacheManager->expects($this->once()) ->method('load') ->with($cacheId) - ->willReturn(serialize(['test' => 'data'])); - - $this->assertInstanceOf(get_class($this->model), $this->model->loadChange($storeId)); + ->willReturn('serializedData'); + $data = ['test' => 'data']; + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with('serializedData') + ->willReturn($data); + + $change = $this->model->loadChange($storeId); + $this->assertInstanceOf(get_class($this->model), $change); + $this->assertEquals($data, $change->getData()); } /** diff --git a/app/code/Magento/Theme/Test/Unit/Model/Theme/ThemeProviderTest.php b/app/code/Magento/Theme/Test/Unit/Model/Theme/ThemeProviderTest.php index 54120d23699835954283b2768403e07d63dcc66c..fb0e1f9897587ad706301f91f621d31991fca838 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/Theme/ThemeProviderTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/Theme/ThemeProviderTest.php @@ -10,6 +10,10 @@ use Magento\Framework\View\Design\ThemeInterface; use Magento\Theme\Model\Theme\ThemeProvider; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +/** + * Class ThemeProviderTest + * @covers \Magento\Theme\Model\Theme\ThemeProvider + */ class ThemeProviderTest extends \PHPUnit_Framework_TestCase { /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ @@ -52,6 +56,21 @@ class ThemeProviderTest extends \PHPUnit_Framework_TestCase ] ); + $deploymentConfig = $this->getMockBuilder(\Magento\Framework\App\DeploymentConfig::class) + ->disableOriginalConstructor() + ->getMock(); + $deploymentConfig->expects($this->once()) + ->method('isDbAvailable') + ->willReturn(true); + + $objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); + $objectManagerMock->expects($this->any()) + ->method('get') + ->willReturnMap([ + [\Magento\Framework\App\DeploymentConfig::class, $deploymentConfig], + ]); + \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock); + $this->assertSame($theme, $themeProvider->getThemeByFullPath($path)); } @@ -66,6 +85,9 @@ class ThemeProviderTest extends \PHPUnit_Framework_TestCase false ); $theme = $this->getMock(\Magento\Theme\Model\Theme::class, [], [], '', false); + $theme->expects($this->once()) + ->method('getId') + ->willReturn(1); $theme->expects($this->once())->method('load')->with($themeId)->will($this->returnSelf()); $theme->expects($this->once())->method('getId')->will($this->returnValue(1)); $theme->expects($this->once())->method('__sleep')->will($this->returnValue([])); diff --git a/app/code/Magento/Translation/App/Config/Type/Translation.php b/app/code/Magento/Translation/App/Config/Type/Translation.php new file mode 100644 index 0000000000000000000000000000000000000000..9a5090f3f5486d3b082ed82279487d27db7748bf --- /dev/null +++ b/app/code/Magento/Translation/App/Config/Type/Translation.php @@ -0,0 +1,62 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Translation\App\Config\Type; + +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\App\Config\ConfigTypeInterface; +use Magento\Framework\DataObject; + +/** + * Class which hold all translation sources and merge them + * + * @package Magento\Translation\App\Config\Type + */ +class Translation implements ConfigTypeInterface +{ + const CONFIG_TYPE = "i18n"; + + /** + * @var DataObject[] + */ + private $data; + + /** + * @var ConfigSourceInterface + */ + private $source; + + /** + * Translation constructor. + * @param ConfigSourceInterface $source + */ + public function __construct( + ConfigSourceInterface $source + ) { + $this->source = $source; + } + + /** + * @inheritDoc + */ + public function get($path = '') + { + if (!$this->data) { + $this->data = new DataObject($this->source->get()); + } + + return $this->data->getData($path); + } + + /** + * Clean cache + * + * @return void + */ + public function clean() + { + $this->data = null; + } +} diff --git a/app/code/Magento/Translation/Model/ResourceModel/Translate.php b/app/code/Magento/Translation/Model/ResourceModel/Translate.php index 0d40a7254eba1e1840e6c1ac7209a09263f9249f..49a8bcdbb43a862700d0e6da11a7f179935d4d67 100644 --- a/app/code/Magento/Translation/Model/ResourceModel/Translate.php +++ b/app/code/Magento/Translation/Model/ResourceModel/Translate.php @@ -5,6 +5,11 @@ */ namespace Magento\Translation\Model\ResourceModel; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\App\DeploymentConfig; +use Magento\Framework\App\Config; +use Magento\Translation\App\Config\Type\Translation; + class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb implements \Magento\Framework\Translate\ResourceInterface { @@ -18,6 +23,16 @@ class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb imp */ protected $scope; + /** + * @var Config + */ + private $appConfig; + + /** + * @var DeploymentConfig + */ + private $deployedConfig; + /** * @param \Magento\Framework\Model\ResourceModel\Db\Context $context * @param \Magento\Framework\App\ScopeResolverInterface $scopeResolver @@ -57,21 +72,25 @@ class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb imp if ($storeId === null) { $storeId = $this->getStoreId(); } + $locale = (string) $locale; + $data = $this->getAppConfig()->get( + Translation::CONFIG_TYPE, + $locale . '/' . $this->getStoreCode($storeId), + [] + ); $connection = $this->getConnection(); - if (!$connection) { - return []; + if ($connection) { + $select = $connection->select() + ->from($this->getMainTable(), ['string', 'translate']) + ->where('store_id IN (0 , :store_id)') + ->where('locale = :locale') + ->order('store_id'); + $bind = [':locale' => $locale, ':store_id' => $storeId]; + $dbData = $connection->fetchPairs($select, $bind); + $data = array_replace($data, $dbData); } - - $select = $connection->select() - ->from($this->getMainTable(), ['string', 'translate']) - ->where('store_id IN (0 , :store_id)') - ->where('locale = :locale') - ->order('store_id'); - - $bind = [':locale' => (string)$locale, ':store_id' => $storeId]; - - return $connection->fetchPairs($select, $bind); + return $data; } /** @@ -115,6 +134,19 @@ class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb imp return $this->getChecksum($this->getMainTable()); } + /** + * Get connection + * + * @return \Magento\Framework\DB\Adapter\AdapterInterface|false + */ + public function getConnection() + { + if (!$this->getDeployedConfig()->isDbAvailable()) { + return false; + } + return parent::getConnection(); + } + /** * Retrieve current store identifier * @@ -124,4 +156,39 @@ class Translate extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb imp { return $this->scopeResolver->getScope($this->scope)->getId(); } + + /** + * Retrieve store code by store id + * + * @param int $storeId + * @return string + */ + private function getStoreCode($storeId) + { + return $this->scopeResolver->getScope($storeId)->getCode(); + } + + /** + * @deprecated + * @return DeploymentConfig + */ + private function getDeployedConfig() + { + if ($this->deployedConfig === null) { + $this->deployedConfig = ObjectManager::getInstance()->get(DeploymentConfig::class); + } + return $this->deployedConfig; + } + + /** + * @deprecated + * @return Config + */ + private function getAppConfig() + { + if ($this->appConfig === null) { + $this->appConfig = ObjectManager::getInstance()->get(Config::class); + } + return $this->appConfig; + } } diff --git a/app/code/Magento/Translation/Model/Source/InitialTranslationSource.php b/app/code/Magento/Translation/Model/Source/InitialTranslationSource.php new file mode 100644 index 0000000000000000000000000000000000000000..22828cfb1be05eb8609eb9ebdcb1d99667d06391 --- /dev/null +++ b/app/code/Magento/Translation/Model/Source/InitialTranslationSource.php @@ -0,0 +1,82 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Translation\Model\Source; + +use Magento\Framework\App\DeploymentConfig; +use Magento\Store\Model\StoreManager; +use Magento\Translation\Model\ResourceModel\TranslateFactory; +use Magento\Translation\Model\ResourceModel\Translate; +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\DataObject; + +/** + * Class for reading translations from DB + */ +class InitialTranslationSource implements ConfigSourceInterface +{ + /** + * @var TranslateFactory + */ + private $translateFactory; + + /** + * @var StoreManager + */ + private $storeManager; + + /** + * @var array + */ + private $data; + + /** + * @var DeploymentConfig + */ + private $deploymentConfig; + + /** + * @param TranslateFactory $translateFactory + * @param StoreManager $storeManager + * @param DeploymentConfig $deploymentConfig + */ + public function __construct( + TranslateFactory $translateFactory, + StoreManager $storeManager, + DeploymentConfig $deploymentConfig + ) { + $this->translateFactory = $translateFactory; + $this->storeManager = $storeManager; + $this->deploymentConfig = $deploymentConfig; + } + + /** + * Read translations for the given 'path' from application initial configuration. + * + * @param string $path + * @return mixed + */ + public function get($path = '') + { + if (!$this->deploymentConfig->isDbAvailable()) { + return []; + } + + if (!$this->data) { + /** @var Translate $translate */ + $translate = $this->translateFactory->create(); + $select = $translate->getConnection()->select() + ->from($translate->getMainTable(), ['string', 'translate', 'store_id', 'locale']) + ->order('store_id'); + $translations = []; + foreach ($translate->getConnection()->fetchAll($select) as $item) { + $store = $this->storeManager->getStore($item['store_id']); + $translations[$item['locale']][$store->getCode()][$item['string']] = $item['translate']; + } + $this->data = new DataObject($translations); + } + return $this->data->getData($path) ?: []; + } +} diff --git a/app/code/Magento/Translation/Test/Unit/App/Config/Type/TranslationTest.php b/app/code/Magento/Translation/Test/Unit/App/Config/Type/TranslationTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8f2c1efdf515b51bf6985318cfc7f11c0fa0ca65 --- /dev/null +++ b/app/code/Magento/Translation/Test/Unit/App/Config/Type/TranslationTest.php @@ -0,0 +1,55 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Translation\Test\Unit\App\Config\Type; + +use Magento\Authorizenet\Helper\Backend\Data; +use Magento\Framework\App\Cache\Type\Translate; +use Magento\Framework\App\Config\ConfigSourceInterface; +use Magento\Framework\Cache\FrontendInterface; +use Magento\Translation\App\Config\Type\Translation; +use Magento\Framework\DataObject; + +/** + * @covers \Magento\Translation\App\Config\Type\Translation + */ +class TranslationTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $source; + + /** + * @var Translation + */ + private $configType; + + public function setUp() + { + $this->source = $this->getMockBuilder(ConfigSourceInterface::class) + ->getMockForAbstractClass(); + $this->configType = new Translation($this->source); + } + + public function testGet() + { + $path = 'en_US/default'; + $data = [ + 'en_US' => [ + 'default' => [ + 'hello' => 'bonjour' + ] + ] + ]; + + $this->source->expects($this->once()) + ->method('get') + ->with() + ->willReturn($data); + + $this->assertEquals(['hello' => 'bonjour'], $this->configType->get($path)); + } +} diff --git a/app/code/Magento/Translation/Test/Unit/Model/Source/InitialTranslationSourceTest.php b/app/code/Magento/Translation/Test/Unit/Model/Source/InitialTranslationSourceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f6b3a39dcbf424131a0bef5012e62f8e3356bad6 --- /dev/null +++ b/app/code/Magento/Translation/Test/Unit/Model/Source/InitialTranslationSourceTest.php @@ -0,0 +1,159 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Translation\Test\Unit\Model\Source; + +use Magento\Framework\App\DeploymentConfig; +use Magento\Framework\DB\Adapter\AdapterInterface; +use Magento\Framework\DB\Select; +use Magento\Store\Model\Store; +use Magento\Store\Model\StoreManager; +use Magento\Translation\Model\ResourceModel\Translate; +use Magento\Translation\Model\ResourceModel\TranslateFactory; +use Magento\Translation\Model\Source\InitialTranslationSource; + +/** + * @covers \Magento\Translation\Model\Source\InitialTranslationSource + * @package Magento\Translation\Test\Unit\Model\Source + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class InitialTranslationSourceTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var TranslateFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $translationFactory; + + /** + * @var Translate|\PHPUnit_Framework_MockObject_MockObject + */ + private $translation; + + /** + * @var StoreManager|\PHPUnit_Framework_MockObject_MockObject + */ + private $storeManager; + + /** + * @var Store|\PHPUnit_Framework_MockObject_MockObject + */ + private $store; + + /** + * @var AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $connection; + + /** + * @var Select|\PHPUnit_Framework_MockObject_MockObject + */ + private $select; + + /** + * @var DeploymentConfig | \PHPUnit_Framework_MockObject_MockObject + */ + private $deploymentConfigMock; + + /** + * @var InitialTranslationSource + */ + private $source; + + public function setUp() + { + $this->translationFactory = $this->getMockBuilder(TranslateFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->translation = $this->getMockBuilder(Translate::class) + ->disableOriginalConstructor() + ->getMock(); + $this->storeManager = $this->getMockBuilder(StoreManager::class) + ->disableOriginalConstructor() + ->getMock(); + $this->store = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->getMock(); + $this->connection = $this->getMockBuilder(AdapterInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $this->select = $this->getMockBuilder(Select::class) + ->disableOriginalConstructor() + ->getMock(); + $this->deploymentConfigMock = $this->getMockBuilder(DeploymentConfig::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->source = new InitialTranslationSource( + $this->translationFactory, + $this->storeManager, + $this->deploymentConfigMock + ); + } + + public function testGet() + { + $this->deploymentConfigMock->expects($this->once()) + ->method('isDbAvailable') + ->willReturn(true); + $this->translationFactory->expects($this->once()) + ->method('create') + ->willReturn($this->translation); + $this->translation->expects($this->atLeastOnce()) + ->method('getConnection') + ->willReturn($this->connection); + $this->connection->expects($this->once()) + ->method('select') + ->willReturn($this->select); + $this->translation->expects($this->once()) + ->method('getMainTable') + ->willReturn('main_table.translate'); + $this->select->expects($this->once()) + ->method('from') + ->with('main_table.translate', ['string', 'translate', 'store_id', 'locale']) + ->willReturnSelf(); + $this->select->expects($this->once()) + ->method('order') + ->with('store_id') + ->willReturnSelf(); + $this->connection->expects($this->once()) + ->method('fetchAll') + ->with($this->select) + ->willReturn([ + [ + 'store_id' => 2, + 'locale' => 'en_US', + 'string' => 'hello', + 'translate' => 'bonjour' + ] + ]); + $this->storeManager->expects($this->once()) + ->method('getStore') + ->with(2) + ->willReturn($this->store); + $this->store->expects($this->once()) + ->method('getCode') + ->willReturn('myStore'); + + $this->assertEquals( + [ + 'en_US' => [ + 'myStore' => [ + 'hello' => 'bonjour' + ] + ] + ], + $this->source->get() + ); + } + + public function testGetWithoutAvailableDb() + { + $this->deploymentConfigMock->expects($this->once()) + ->method('isDbAvailable') + ->willReturn(false); + $this->assertEquals([], $this->source->get()); + } +} diff --git a/app/code/Magento/Translation/composer.json b/app/code/Magento/Translation/composer.json index b9ed830c9053ea492d76a2402ec8f523fb03a46a..6c6c5fad3e7b9abcab6211e1c2326f9a31054088 100644 --- a/app/code/Magento/Translation/composer.json +++ b/app/code/Magento/Translation/composer.json @@ -9,6 +9,9 @@ "magento/module-theme": "100.2.*", "magento/framework": "100.2.*" }, + "suggest": { + "magento/module-deploy": "100.2.*" + }, "type": "magento2-module", "version": "100.2.0-dev", "license": [ diff --git a/app/code/Magento/Translation/etc/di.xml b/app/code/Magento/Translation/etc/di.xml index 8e29e941499129a546ded22c3532c198f00d9838..3e76f80fff261299484704e3b66a294839cfff42 100644 --- a/app/code/Magento/Translation/etc/di.xml +++ b/app/code/Magento/Translation/etc/di.xml @@ -70,7 +70,6 @@ </argument> </arguments> </type> - <virtualType name="AssetPreProcessorPool"> <arguments> <argument name="preprocessors" xsi:type="array"> @@ -87,7 +86,6 @@ </argument> </arguments> </virtualType> - <type name="Magento\Framework\Console\CommandListInterface"> <arguments> <argument name="commands" xsi:type="array"> @@ -95,4 +93,47 @@ </argument> </arguments> </type> + <virtualType name="translationConfigInitialDataProvider" type="Magento\Framework\App\Config\InitialConfigSource"> + <arguments> + <argument name="reader" xsi:type="object">Magento\Framework\App\DeploymentConfig\Reader</argument> + <argument name="configType" xsi:type="const">Magento\Translation\App\Config\Type\Translation::CONFIG_TYPE</argument> + <argument name="fileKey" xsi:type="const">Magento\Framework\Config\File\ConfigFilePool::APP_CONFIG</argument> + </arguments> + </virtualType> + <virtualType name="translationConfigSourceAggregated" type="Magento\Framework\App\Config\ConfigSourceAggregated"> + <arguments> + <argument name="sources" xsi:type="array"> + <item name="dynamic" xsi:type="array"> + <item name="source" xsi:type="object">Magento\Translation\Model\Source\InitialTranslationSource\Proxy</item> + <item name="sortOrder" xsi:type="string">100</item> + </item> + <item name="initial" xsi:type="array"> + <item name="source" xsi:type="object">translationConfigInitialDataProvider</item> + <item name="sortOrder" xsi:type="string">1000</item> + </item> + </argument> + </arguments> + </virtualType> + <type name="Magento\Translation\App\Config\Type\Translation"> + <arguments> + <argument name="source" xsi:type="object">translationConfigSourceAggregated</argument> + </arguments> + </type> + <type name="Magento\Framework\App\Config"> + <arguments> + <argument name="types" xsi:type="array"> + <item name="i18n" xsi:type="object">Magento\Translation\App\Config\Type\Translation</item> + </argument> + </arguments> + </type> + <type name="Magento\Deploy\Console\Command\App\ApplicationDumpCommand"> + <arguments> + <argument name="sources" xsi:type="array"> + <item name="i18n" xsi:type="array"> + <item name="source" xsi:type="object">Magento\Translation\Model\Source\InitialTranslationSource</item> + <item name="namespace" xsi:type="const">Magento\Translation\App\Config\Type\Translation::CONFIG_TYPE</item> + </item> + </argument> + </arguments> + </type> </config> diff --git a/app/code/Magento/Ui/Component/MassAction/Filter.php b/app/code/Magento/Ui/Component/MassAction/Filter.php index c24b77198030d7ebe1889ed3586b01becf6677ad..c23466ef0844e5237e2ae577cada08dd19086390 100644 --- a/app/code/Magento/Ui/Component/MassAction/Filter.php +++ b/app/code/Magento/Ui/Component/MassAction/Filter.php @@ -11,6 +11,7 @@ use Magento\Framework\View\Element\UiComponentFactory; use Magento\Framework\App\RequestInterface; use Magento\Framework\View\Element\UiComponentInterface; use Magento\Framework\Data\Collection\AbstractDb; +use Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderInterface; /** * Class Filter @@ -43,6 +44,11 @@ class Filter */ protected $filterBuilder; + /** + * @var DataProviderInterface + */ + private $dataProvider; + /** * @param UiComponentFactory $factory * @param RequestInterface $request @@ -74,23 +80,33 @@ class Filter } /** + * Adds filters to collection using DataProvider filter results + * * @param AbstractDb $collection * @return AbstractDb * @throws LocalizedException */ public function getCollection(AbstractDb $collection) { - $component = $this->getComponent(); - $this->prepareComponent($component); - $dataProvider = $component->getContext()->getDataProvider(); - $dataProvider->setLimit(0, false); - $ids = []; - foreach ($dataProvider->getSearchResult()->getItems() as $document) { - $ids[] = $document->getId(); - } + $selected = $this->request->getParam(static::SELECTED_PARAM); + $excluded = $this->request->getParam(static::EXCLUDED_PARAM); - $collection->addFieldToFilter($collection->getIdFieldName(), ['in' => $ids]); - return $this->applySelection($collection); + $isExcludedIdsValid = (is_array($excluded) && !empty($excluded)); + $isSelectedIdsValid = (is_array($selected) && !empty($selected)); + + if ('false' !== $excluded) { + if (!$isExcludedIdsValid && !$isSelectedIdsValid) { + throw new LocalizedException(__('Please select item(s).')); + } + } + $idsArray = $this->getFilterIds(); + if (!empty($idsArray)) { + $collection->addFieldToFilter( + $collection->getIdFieldName(), + ['in' => $idsArray] + ); + } + return $collection; } /** @@ -106,9 +122,7 @@ class Filter if ('false' === $excluded) { return; } - $component = $this->getComponent(); - $this->prepareComponent($component); - $dataProvider = $component->getContext()->getDataProvider(); + $dataProvider = $this->getDataProvider(); try { if (is_array($excluded) && !empty($excluded)) { $this->filterBuilder->setConditionType('nin') @@ -127,6 +141,8 @@ class Filter } /** + * Applies selection to collection from POST parameters + * * @param AbstractDb $collection * @return AbstractDb * @throws LocalizedException @@ -169,7 +185,7 @@ class Filter } /** - * Returns RefererUrl + * Returns Referrer Url * * @return string|null */ @@ -178,4 +194,33 @@ class Filter $data = $this->getComponent()->getContext()->getDataProvider()->getConfigData(); return (isset($data['referer_url'])) ? $data['referer_url'] : null; } + + /** + * Get data provider + * + * @return DataProviderInterface + */ + private function getDataProvider() + { + if (!$this->dataProvider) { + $component = $this->getComponent(); + $this->prepareComponent($component); + $this->dataProvider = $component->getContext()->getDataProvider(); + } + return $this->dataProvider; + } + + /** + * Get filter ids as array + * + * @return int[] + */ + private function getFilterIds() + { + $this->applySelectionOnTargetProvider(); + if ($this->getDataProvider()->getSearchResult()) { + return $this->getDataProvider()->getSearchResult()->getAllIds(); + } + return []; + } } diff --git a/app/code/Magento/Ui/Test/Unit/Component/MassAction/FilterTest.php b/app/code/Magento/Ui/Test/Unit/Component/MassAction/FilterTest.php new file mode 100644 index 0000000000000000000000000000000000000000..604febecde041df3e62aeae3cf135bb5e57e5398 --- /dev/null +++ b/app/code/Magento/Ui/Test/Unit/Component/MassAction/FilterTest.php @@ -0,0 +1,289 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Ui\Test\Unit\Component\MassAction; + +use Magento\Ui\Component\MassAction\Filter; +use Magento\Framework\Api\Filter as ApiFilter; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\Data\Collection\AbstractDb; +use Magento\Framework\Api\FilterBuilder; +use Magento\Framework\View\Element\UiComponentFactory; +use Magento\Framework\App\RequestInterface; +use Magento\Framework\View\Element\UiComponentInterface; +use Magento\Framework\Api\Search\SearchResultInterface; +use Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderInterface; +use Magento\Framework\View\Element\UiComponent\ContextInterface; + +class FilterTest extends \PHPUnit_Framework_TestCase +{ + /** + *\PHPUnit_Framework_MockObject_MockObject + */ + private $requestMock; + + /** + * \PHPUnit_Framework_MockObject_MockObject + */ + private $uiComponentFactoryMock; + + /** + * \PHPUnit_Framework_MockObject_MockObject + */ + private $filterBuilderMock; + + /** @var \Magento\Ui\Component\MassAction\Filter */ + private $filter; + + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + + /** + *\PHPUnit_Framework_MockObject_MockObject + */ + private $dataProviderMock; + + /** + *\PHPUnit_Framework_MockObject_MockObject + */ + private $abstractDbMock; + + /** + * \PHPUnit_Framework_MockObject_MockObject + */ + private $searchResultMock; + + /** + * \PHPUnit_Framework_MockObject_MockObject + */ + private $uiComponentMock; + + /** + * Set up + */ + protected function setUp() + { + $this->objectManager = new ObjectManager($this); + $this->uiComponentFactoryMock = $this->getMock(UiComponentFactory::class, [], [], '', false); + $this->filterBuilderMock = $this->getMock(FilterBuilder::class, [], [], '', false); + $this->requestMock = $this->getMock(RequestInterface::class); + $this->dataProviderMock = $this->getMock(DataProviderInterface::class); + $this->uiComponentMock = $this->getMock(UiComponentInterface::class); + $this->abstractDbMock = $this->getMock(AbstractDb::class, [], [], '', false); + $contextMock = $this->getMock(ContextInterface::class); + $this->searchResultMock = $this->getMock(SearchResultInterface::class); + $uiComponentMockTwo = $this->getMock(UiComponentInterface::class); + $this->filter = $this->objectManager->getObject( + Filter::class, + [ + 'factory' => $this->uiComponentFactoryMock, + 'request' => $this->requestMock, + 'filterBuilder' => $this->filterBuilderMock + ] + ); + $this->uiComponentFactoryMock->expects($this->any()) + ->method('create') + ->willReturn($this->uiComponentMock); + $this->uiComponentMock->expects($this->any()) + ->method('getChildComponents') + ->willReturn([$uiComponentMockTwo]); + $uiComponentMockTwo->expects($this->any()) + ->method('getChildComponents') + ->willReturn([]); + $this->uiComponentMock->expects($this->any()) + ->method('getContext') + ->willReturn($contextMock); + $contextMock->expects($this->any()) + ->method('getDataProvider') + ->willReturn($this->dataProviderMock); + $this->dataProviderMock->expects($this->any()) + ->method('setLimit'); + $this->dataProviderMock->expects($this->any()) + ->method('searchResultMock') + ->willReturn($this->searchResultMock); + $this->searchResultMock->expects($this->any()) + ->method('getAllIds') + ->willReturn([]); + } + + /** + * Run test for applySelectionOnTargetProvider method + * + * @param int[]|bool $selectedIds + * @param int[]|bool $excludedIds + * @param int $filterExpected + * @param string $conditionExpected + * @dataProvider applySelectionOnTargetProviderDataProvider + */ + public function testApplySelectionOnTargetProvider($selectedIds, $excludedIds, $filterExpected, $conditionExpected) + { + $this->setUpApplySelection($selectedIds, $excludedIds, $filterExpected, $conditionExpected); + $this->filter->applySelectionOnTargetProvider(); + } + + /** + * Data provider for testApplySelectionOnTargetProvider + */ + public function applySelectionOnTargetProviderDataProvider() + { + return [ + [[1, 2, 3], 'false' , 0, 'in'], + [[1, 2, 3], [1, 2, 3] , 1, 'nin'], + ['false', [1, 2, 3] , 1, 'nin'], + ['false', 'false' , 0, ''] + ]; + } + + /** + * @throws \Exception + * @expectedException \Magento\Framework\Exception\LocalizedException + */ + public function testApplySelectionOnTargetProviderException() + { + $filterMock = $this->getMock(ApiFilter::class, [], [], '', false); + $this->filterBuilderMock->expects($this->any()) + ->method('setConditionType') + ->willReturn($this->filterBuilderMock); + $this->filterBuilderMock->expects($this->any()) + ->method('create') + ->willReturn($filterMock); + $this->filterBuilderMock->expects($this->any()) + ->method('setField') + ->willReturn($this->filterBuilderMock); + $this->requestMock->expects($this->at(0)) + ->method('getParam') + ->with(Filter::SELECTED_PARAM) + ->willReturn([1]); + $this->requestMock->expects($this->at(1)) + ->method('getParam') + ->with(Filter::EXCLUDED_PARAM) + ->willReturn([]); + $this->dataProviderMock->expects($this->any()) + ->method('addFilter') + ->with($filterMock) + ->willThrowException(new \Exception('exception')); + $this->filter->applySelectionOnTargetProvider(); + } + + /** + * Run test for getCollection method + * + * @param int[]|bool $selectedIds + * @param int[]|bool $excludedIds + * @param int $filterExpected + * @param string $conditionExpected + * @dataProvider applySelectionOnTargetProviderDataProvider + */ + public function testGetCollection($selectedIds, $excludedIds, $filterExpected, $conditionExpected) + { + $this->setUpApplySelection($selectedIds, $excludedIds, $filterExpected, $conditionExpected); + $this->requestMock->expects($this->at(4)) + ->method('getParam') + ->with('namespace') + ->willReturn(''); + $this->requestMock->expects($this->at(2)) + ->method('getParam') + ->with(Filter::SELECTED_PARAM) + ->willReturn($selectedIds); + $this->requestMock->expects($this->at(3)) + ->method('getParam') + ->with(Filter::EXCLUDED_PARAM) + ->willReturn($excludedIds); + $this->assertEquals($this->abstractDbMock, $this->filter->getCollection($this->abstractDbMock)); + } + + /** + * This tests the method prepareComponent() + */ + public function testPrepareComponent() + { + $this->filter->prepareComponent($this->uiComponentMock); + } + + /** + * This tests the method getComponent() + */ + public function testGetComponent() + { + $this->requestMock->expects($this->at(0)) + ->method('getParam') + ->with('namespace') + ->willReturn(''); + $this->assertEquals($this->uiComponentMock, $this->filter->getComponent()); + } + + /** + * This tests the method getComponentRefererUrl() + */ + public function testGetComponentRefererUrlIsNotNull() + { + $returnArray = [ + 'referer_url' => 'referer_url' + ]; + $this->dataProviderMock->expects($this->once()) + ->method('getConfigData') + ->willReturn($returnArray); + $this->assertEquals('referer_url', $this->filter->getComponentRefererUrl()); + } + + /** + * This tests the method getComponentRefererUrl() + */ + public function testGetComponentRefererUrlIsNull() + { + $this->assertNull($this->filter->getComponentRefererUrl()); + } + + /** + * Apply mocks for current parameters from datasource + * + * @param int[]|bool $selectedIds + * @param int[]|bool $excludedIds + * @param int $filterExpected + * @param string $conditionExpected + */ + private function setUpApplySelection($selectedIds, $excludedIds, $filterExpected, $conditionExpected) + { + $filterMock = $this->getMock(ApiFilter::class, [], [], '', false); + $this->requestMock->expects($this->at(0)) + ->method('getParam') + ->with(Filter::SELECTED_PARAM) + ->willReturn($selectedIds); + $this->requestMock->expects($this->at(1)) + ->method('getParam') + ->with(Filter::EXCLUDED_PARAM) + ->willReturn($excludedIds); + $this->dataProviderMock->expects($this->exactly($filterExpected)) + ->method('addFilter') + ->with($filterMock); + $this->filterBuilderMock->expects($this->exactly($filterExpected)) + ->method('setConditionType') + ->with($conditionExpected) + ->willReturnSelf(); + $this->filterBuilderMock->expects($this->any()) + ->method('setField') + ->willReturnSelf(); + $this->filterBuilderMock->expects($this->any()) + ->method('value') + ->willReturnSelf(); + $this->filterBuilderMock->expects($this->any()) + ->method('create') + ->willReturn($filterMock); + $this->filterBuilderMock->expects($this->any()) + ->method('setConditionType') + ->willReturnSelf(); + $this->filterBuilderMock->expects($this->any()) + ->method('setField') + ->willReturnSelf(); + $this->filterBuilderMock->expects($this->any()) + ->method('value') + ->willReturnSelf(); + $this->filterBuilderMock->expects($this->any()) + ->method('create') + ->willReturn($filterMock); + } +} diff --git a/app/code/Magento/User/Model/ResourceModel/User.php b/app/code/Magento/User/Model/ResourceModel/User.php index b35deb6c5c6f147dfba617705c3877a771494f10..d3e228d44358136c748258c47da3f7f2b2bba76b 100644 --- a/app/code/Magento/User/Model/ResourceModel/User.php +++ b/app/code/Magento/User/Model/ResourceModel/User.php @@ -34,13 +34,6 @@ class User extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb */ protected $dateTime; - /** - * Users table - * - * @var string - */ - protected $_usersTable; - /** * Construct * @@ -61,7 +54,6 @@ class User extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb $this->_aclCache = $aclCache; $this->_roleFactory = $roleFactory; $this->dateTime = $dateTime; - $this->_usersTable = $this->getTable('admin_user'); } /** @@ -473,7 +465,7 @@ class User extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb if (sizeof($users) > 0) { $bind = ['reload_acl_flag' => 1]; $where = ['user_id IN(?)' => $users]; - $rowsCount = $connection->update($this->_usersTable, $bind, $where); + $rowsCount = $connection->update($this->getTable('admin_user'), $bind, $where); } return $rowsCount > 0; diff --git a/app/code/Magento/Vault/Setup/UpgradeData.php b/app/code/Magento/Vault/Setup/UpgradeData.php index 757b5f4d3167cb00254e8f2ef20fad3addc1cb27..1c3f113ba9831de6123cbf0c0af361a0f520a1fb 100644 --- a/app/code/Magento/Vault/Setup/UpgradeData.php +++ b/app/code/Magento/Vault/Setup/UpgradeData.php @@ -20,9 +20,11 @@ use Magento\Vault\Model\CreditCardTokenFactory; class UpgradeData implements UpgradeDataInterface { /** - * @var AdapterInterface + * Predefined name for sales connection + * + * @var string */ - private $connection; + private static $salesConnectionName = 'sales'; /** * @inheritdoc @@ -30,12 +32,11 @@ class UpgradeData implements UpgradeDataInterface public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); - $connection = $this->getConnection(); // data update for Vault module < 2.0.1 if (version_compare($context->getVersion(), '2.0.1', '<')) { // update sets credit card as default token type - $connection->update($setup->getTable(InstallSchema::PAYMENT_TOKEN_TABLE), [ + $setup->getConnection()->update($setup->getTable(InstallSchema::PAYMENT_TOKEN_TABLE), [ PaymentTokenInterface::TYPE => CreditCardTokenFactory::TOKEN_TYPE_CREDIT_CARD ], PaymentTokenInterface::TYPE . ' = ""'); } @@ -43,12 +44,13 @@ class UpgradeData implements UpgradeDataInterface // data update for Vault module < 2.0.2 if (version_compare($context->getVersion(), '2.0.2', '<')) { // update converts additional info with token metadata to single dimensional array - $select = $connection->select() + $salesConnection = $setup->getConnection(self::$salesConnectionName); + $select = $salesConnection->select() ->from($setup->getTable('sales_order_payment'), 'entity_id') ->columns(['additional_information']) ->where('additional_information LIKE ?', '%token_metadata%'); - $items = $connection->fetchAll($select); + $items = $salesConnection->fetchAll($select); foreach ($items as $item) { $additionalInfo = unserialize($item['additional_information']); $additionalInfo[PaymentTokenInterface::CUSTOMER_ID] = @@ -57,7 +59,7 @@ class UpgradeData implements UpgradeDataInterface $additionalInfo['token_metadata'][PaymentTokenInterface::PUBLIC_HASH]; unset($additionalInfo['token_metadata']); - $connection->update( + $salesConnection->update( $setup->getTable('sales_order_payment'), ['additional_information' => serialize($additionalInfo)], ['entity_id = ?' => $item['entity_id']] @@ -67,23 +69,4 @@ class UpgradeData implements UpgradeDataInterface $setup->endSetup(); } - - /** - * Tries to get connection for scalable sales DB, otherwise returns default connection - * @return AdapterInterface - */ - private function getConnection() - { - if ($this->connection === null) { - /** @var ResourceConnection $conn */ - $conn = ObjectManager::getInstance()->get(ResourceConnection::class); - try { - $this->connection = $conn->getConnectionByName('sales'); - } catch (\DomainException $e) { - $this->connection = $conn->getConnection(); - } - } - - return $this->connection; - } } diff --git a/app/code/Magento/Vault/view/adminhtml/web/js/vault.js b/app/code/Magento/Vault/view/adminhtml/web/js/vault.js index 560e65c007f8ab22c2b5b1e76bac0c9062e2af78..66c17801ec02edb262434bc807988bed1bece940 100644 --- a/app/code/Magento/Vault/view/adminhtml/web/js/vault.js +++ b/app/code/Magento/Vault/view/adminhtml/web/js/vault.js @@ -33,8 +33,8 @@ define([ .observe(['active']); // re-init payment method events - self.$selector.off('changePaymentMethod.' + this.code) - .on('changePaymentMethod.' + this.code, this.changePaymentMethod.bind(this)); + self.$selector.off('changePaymentMethod.' + this.getCode()) + .on('changePaymentMethod.' + this.getCode(), this.changePaymentMethod.bind(this)); if (this.active()) { $('#' + this.fieldset + ' input:radio:first').trigger('click'); @@ -50,7 +50,7 @@ define([ * @returns {exports.changePaymentMethod} */ changePaymentMethod: function (event, method) { - this.active(method === this.code); + this.active(method === this.getCode()); return this; }, @@ -61,13 +61,21 @@ define([ */ onActiveChange: function (isActive) { if (!isActive) { - this.$selector.trigger('setVaultNotActive'); + this.$selector.trigger('setVaultNotActive.' + this.getCode()); return; } $('#' + this.fieldset + ' input:radio:first').trigger('click'); - window.order.addExcludedPaymentMethod(this.code); + window.order.addExcludedPaymentMethod(this.getCode()); + }, + + /** + * Get payment method code + * @returns {String} + */ + getCode: function () { + return this.code; } }); }); diff --git a/app/code/Magento/Webapi/Test/Unit/Model/DataObjectProcessorTest.php b/app/code/Magento/Webapi/Test/Unit/Model/DataObjectProcessorTest.php index 4ab16098163328f1b49abe6b478b3fb06ae51adb..0565832932a3fcd9bcfacf491759a27370bbc1dd 100644 --- a/app/code/Magento/Webapi/Test/Unit/Model/DataObjectProcessorTest.php +++ b/app/code/Magento/Webapi/Test/Unit/Model/DataObjectProcessorTest.php @@ -6,6 +6,8 @@ namespace Magento\Webapi\Test\Unit\Model; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Reflection\DataObjectProcessor; use Magento\Webapi\Model\Config as ModelConfig; class DataObjectProcessorTest extends \PHPUnit_Framework_TestCase @@ -30,6 +32,17 @@ class DataObjectProcessorTest extends \PHPUnit_Framework_TestCase 'typeProcessor' => $objectManager->getObject(\Magento\Framework\Reflection\TypeProcessor::class), ] ); + $serializerMock = $this->getMock(SerializerInterface::class); + $serializerMock->method('serialize') + ->willReturn('serializedData'); + $serializerMock->method('unserialize') + ->willReturn(['unserializedData']); + + $objectManager->setBackwardCompatibleProperty( + $methodsMapProcessor, + 'serializer', + $serializerMock + ); $this->dataObjectProcessor = $objectManager->getObject( \Magento\Framework\Reflection\DataObjectProcessor::class, [ diff --git a/app/etc/di.xml b/app/etc/di.xml index e430c15729d3d0cced20bf2b326d40f152b174e6..e9767eccb28114ffa66bc8bc84829d92b1620e99 100755 --- a/app/etc/di.xml +++ b/app/etc/di.xml @@ -956,11 +956,6 @@ <argument name="uploader" xsi:type="object">Magento\Framework\View\Design\Theme\Image\Uploader\Proxy</argument> </arguments> </type> - <type name="Magento\Framework\App\Config\ScopePool"> - <arguments> - <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument> - </arguments> - </type> <type name="Magento\Framework\App\Config\Initial"> <arguments> <argument name="reader" xsi:type="object">Magento\Framework\App\Config\Initial\Reader\Proxy</argument> diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartManagementTest.php index 43134e838c9c7845ddc1648210b1d5e956b64c56..2cb9aa3bbc9a13ef08244eef48686c88de3fe417 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartManagementTest.php @@ -6,8 +6,14 @@ namespace Magento\Quote\Api; +use Magento\Framework\App\Config; use Magento\TestFramework\TestCase\WebapiAbstract; +/** + * Class CartManagementTest + * @package Magento\Quote\Api + * @magentoAppIsolation enabled + */ class CartManagementTest extends WebapiAbstract { const SERVICE_VERSION = 'V1'; @@ -25,6 +31,8 @@ class CartManagementTest extends WebapiAbstract protected function setUp() { $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $appConfig = $this->objectManager->get(Config::class); + $appConfig->clean(); } public function tearDown() diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml index 66d912d77bba7836ab2f747757f32f2a82cf02ec..5f5e2f50594bf8d0473b65ee584e50f47bc852a4 100644 --- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml +++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml @@ -7,7 +7,7 @@ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Vault\Test\TestCase\ReorderUsingVaultTest" summary="Reorder from Admin with saved within Braintree credit card"> - <variation name="ReorderUsingVaultBraintreeTestVariation1" summary="Reorder from Admin with saved within Braintree credit card for Guest Customer" ticketId="MAGETWO-54870"> + <variation name="ReorderUsingVaultBraintreeTestVariation1" summary="Reorder from Admin with saved within Braintree credit card for Guest Customer" ticketId="MAGETWO-54869, MAGETWO-54870"> <data name="description" xsi:type="string">Reorder from Admin with saved within Braintree credit card for Guest Customer</data> <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data> <data name="customer/dataset" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View.php index a688ffac5ac019627c137fcb678c56f374599c8b..071604e9cde32e5c8c83484a582ab95099256203 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View.php +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View.php @@ -95,6 +95,7 @@ class View extends \Magento\Catalog\Test\Block\Product\View ); $this->_rootElement->find($this->customizeButton)->click(); $this->waitForElementVisible($this->addToCart); + $this->waitForElementVisible($this->visibleOptions, Locator::SELECTOR_XPATH); } /** diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View/Type/Option/Hidden.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View/Type/Option/Hidden.xml index 356f6a52d6b0c296abc0eb857fe2d8b3dccc4b84..ecced21254cdc113b5f0d5d3d46be1dbd3a4386e 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View/Type/Option/Hidden.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Block/Catalog/Product/View/Type/Option/Hidden.xml @@ -8,8 +8,7 @@ <mapping strict="1"> <fields> <qty> - <selector>//input[contains(@class,"qty")]</selector> - <strategy>xpath</strategy> + <selector>input.qty</selector> <class>Magento\Bundle\Test\Block\Catalog\Product\View\Type\Option\Element\Qty</class> </qty> </fields> diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertBundleProductForm.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertBundleProductForm.php index d9b843cc37a0f2ac109ac662183b93119d3e1edc..9a2304c876f89ca8598e47b720154642f9b96ca0 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertBundleProductForm.php +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertBundleProductForm.php @@ -52,6 +52,7 @@ class AssertBundleProductForm extends AssertProductForm protected function prepareBundleOptions(array $bundleSelections) { foreach ($bundleSelections as &$item) { + unset($item['frontend_type']); foreach ($item['assigned_products'] as &$selection) { $selection['data']['getProductName'] = $selection['search_data']['name']; $selection = $selection['data']; diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/CheckoutData.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/CheckoutData.xml index 3bf2e7b7f2ad1387c89752282148fc582d65a0e1..e694b65110e89cd1840ad1249e6c14a61302a877 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/CheckoutData.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Repository/BundleProduct/CheckoutData.xml @@ -353,6 +353,7 @@ <item name="3" xsi:type="array"> <item name="title" xsi:type="string">Multiple Select Option</item> <item name="type" xsi:type="string">Multiple</item> + <item name="frontend_type" xsi:type="string">Multiple</item> <item name="value" xsi:type="array"> <item name="name" xsi:type="string">product_100_dollar</item> </item> @@ -367,6 +368,7 @@ <item name="0" xsi:type="array"> <item name="title" xsi:type="string">Drop-down Option</item> <item name="type" xsi:type="string">Drop-down</item> + <item name="frontend_type" xsi:type="string">Drop-down</item> <item name="value" xsi:type="array"> <item name="name" xsi:type="string">Test simple product</item> </item> diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..a34bf44d38cae01f46f711fd6181c1ae8895ae68 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> + <testCase name="Magento\Sales\Test\TestCase\MoveRecentlyComparedProductsOnOrderPageTest"> + <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariationWithBundleProduct1"> + <data name="products/0" xsi:type="string">bundleProduct::bundle_dynamic_product</data> + <data name="products/1" xsi:type="string">bundleProduct::bundle_dynamic_product</data> + <data name="productsIsConfigured" xsi:type="boolean">true</data> + <constraint name="Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid" /> + </variation> + </testCase> +</config> diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/etc/di.xml index 402dcca44c9485a46d9c40b5103f1cac50b86122..61eac871df9722550fff8735930febc339e4ea4d 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/etc/di.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/etc/di.xml @@ -11,4 +11,17 @@ <argument name="severity" xsi:type="string">S2</argument> </arguments> </type> + <type name="Magento\Sales\Test\Block\Adminhtml\Order\Create\CustomerActivities\Sidebar\RecentlyComparedProducts"> + <arguments> + <argument name="config" xsi:type="array"> + <item name="renders" xsi:type="array"> + <item name="bundle" xsi:type="array"> + <item name="class" xsi:type="string">\Magento\Bundle\Test\Block\Adminhtml\Product\Composite\Configure</item> + <item name="locator" xsi:type="string">//ancestor::body//*[contains(@class, "modal-slide") and contains(@class, "_show")]</item> + <item name="strategy" xsi:type="string">xpath</item> + </item> + </item> + </argument> + </arguments> + </type> </config> diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Page/Adminhtml/OrderCreateIndex.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Page/Adminhtml/OrderCreateIndex.xml index a67119cbf19aa5ac5aa1541672a30242edd29a93..97809af4bff7875f1bb4c90fe0f3a9c05d037b24 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Page/Adminhtml/OrderCreateIndex.xml +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Page/Adminhtml/OrderCreateIndex.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="OrderCreateIndex" area="Adminhtml" mca="sales/order_create/index"> - <block name="configureProductBlock"> - <render name="configurable" class="Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Composite\Configure"/> - </block> - </page> + <page name="OrderCreateIndex" area="Adminhtml" mca="sales/order_create/index"> + <block name="configureProductBlock"> + <render name="configurable" class="Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Composite\Configure" /> + </block> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateCreditMemoEntityTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateCreditMemoEntityTest.xml index dd92edc82b3310ad9610c70138578a220e4358cd..8a8195db638d565564ae0e2bdf20ad46fbb05bbd 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateCreditMemoEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/CreateCreditMemoEntityTest.xml @@ -14,6 +14,7 @@ <data name="order/dataset" xsi:type="string">default</data> <data name="order/data/entity_id/products" xsi:type="string">configurableProduct::configurable_with_qty_1</data> <data name="order/data/price/dataset" xsi:type="string">full_refund</data> + <data name="configData" xsi:type="string"/> <constraint name="Magento\Sales\Test\Constraint\AssertRefundSuccessCreateMessage" /> <constraint name="Magento\ConfigurableProduct\Test\Constraint\AssertProductQtyDecreasedAfterCreditmemo" /> </variation> diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..aaa9b3e1f88f918aa63f852b28a5ac653f94cdef --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> + <testCase name="Magento\Sales\Test\TestCase\MoveRecentlyComparedProductsOnOrderPageTest"> + <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariationWithConfigurableProduct1"> + <data name="products/0" xsi:type="string">configurableProduct::configurable_with_qty_1</data> + <data name="products/1" xsi:type="string">configurableProduct::configurable_with_qty_1</data> + <constraint name="Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid" /> + </variation> + </testCase> +</config> diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/etc/di.xml index 002ccfc4ed80ca48fb1b851558efa909b2e1c503..8bdf098cea58341cf83b081fca7bc946281e4884 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/etc/di.xml +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/etc/di.xml @@ -26,4 +26,17 @@ <argument name="severity" xsi:type="string">high</argument> </arguments> </type> + <type name="Magento\Sales\Test\Block\Adminhtml\Order\Create\CustomerActivities\Sidebar\RecentlyComparedProducts"> + <arguments> + <argument name="config" xsi:type="array"> + <item name="renders" xsi:type="array"> + <item name="configurable" xsi:type="array"> + <item name="class" xsi:type="string">Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Composite\Configure</item> + <item name="locator" xsi:type="string">//ancestor::body//*[contains(@class, "modal-slide") and contains(@class, "_show")]</item> + <item name="strategy" xsi:type="string">xpath</item> + </item> + </item> + </argument> + </arguments> + </type> </config> diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Composite/Configure.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Composite/Configure.xml index 04a918c3bf8d9598b74b0f53ebd41b9f477e778f..676ae6a64f3d820b4d65d821053d6d0ab7971542 100644 --- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Composite/Configure.xml +++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Composite/Configure.xml @@ -8,7 +8,7 @@ <mapping strict="0"> <fields> <qty> - <selector>//tr[contains(.,"%product_name%")]//input[contains(@class,"qty")]</selector> + <selector>.//tr[contains(.,"%product_name%")]//input[contains(@class,"qty")]</selector> <strategy>xpath</strategy> </qty> </fields> diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertProductInItemsOrderedGrid.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertProductInItemsOrderedGrid.php new file mode 100644 index 0000000000000000000000000000000000000000..918c86f93340730e19ac576c1cda37255d86f0b3 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Constraint/AssertProductInItemsOrderedGrid.php @@ -0,0 +1,57 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\GroupedProduct\Test\Constraint; + +/** + * Assert product was added to Items Ordered grid in customer account on Order creation page backend. + */ +class AssertProductInItemsOrderedGrid extends \Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid +{ + /** + * Prepare data. + * + * @param array $data + * @param \Magento\Sales\Test\Block\Adminhtml\Order\Create\Items $itemsBlock + * @return array + */ + protected function prepareData(array $data, \Magento\Sales\Test\Block\Adminhtml\Order\Create\Items $itemsBlock) + { + $fixtureData = []; + foreach ($data as $product) { + $fixtureData = array_merge($fixtureData, $this->getOptionsDetails($product)); + } + $pageData = $itemsBlock->getProductsDataByFields($this->fields); + $preparePageData = $this->arraySort($fixtureData, $pageData); + return ['fixtureData' => $fixtureData, 'pageData' => $preparePageData]; + } + + /** + * Get product options details. + * + * @param \Magento\Mtf\Fixture\FixtureInterface $product + * @return array + */ + private function getOptionsDetails(\Magento\Mtf\Fixture\FixtureInterface $product) + { + /** @var \Magento\GroupedProduct\Test\Fixture\GroupedProduct $product */ + $fixtureProducts = []; + $optionsPrices = $this->getProductPrice($product); + $optionsQtys = $product->getCheckoutData()['cartItem']['qty']; + $assignedProducts = $product->getAssociated()['assigned_products']; + + foreach ($assignedProducts as $key => $assignedProduct) { + $fixtureProducts[] = [ + 'name' => $assignedProduct['name'], + 'price' => number_format($optionsPrices['product_key_' . $key], 2), + 'checkout_data' => [ + 'qty' => $this->productsIsConfigured ? $optionsQtys['product_key_' . $key] : 1 + ] + ]; + } + return $fixtureProducts; + } +} diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..1de8aeda4e9a4415b476d73c8b454b17ad4f5824 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> + <testCase name="Magento\Sales\Test\TestCase\MoveRecentlyComparedProductsOnOrderPageTest"> + <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariationWithGroupedProduct1"> + <data name="products/0" xsi:type="string">groupedProduct::three_simple_products</data> + <data name="products/1" xsi:type="string">groupedProduct::three_simple_products</data> + <data name="productsIsConfigured" xsi:type="boolean">true</data> + <constraint name="Magento\GroupedProduct\Test\Constraint\AssertProductInItemsOrderedGrid" /> + </variation> + </testCase> +</config> diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/etc/di.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b12a012749fb6feb0e90b1910d964a19394ca8d --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/etc/di.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> + <type name="Magento\Sales\Test\Block\Adminhtml\Order\Create\CustomerActivities\Sidebar\RecentlyComparedProducts"> + <arguments> + <argument name="config" xsi:type="array"> + <item name="renders" xsi:type="array"> + <item name="grouped" xsi:type="array"> + <item name="class" xsi:type="string">\Magento\GroupedProduct\Test\Block\Adminhtml\Product\Composite\Configure</item> + <item name="locator" xsi:type="string">//ancestor::body//*[contains(@class, "modal-slide") and contains(@class, "_show")]</item> + <item name="strategy" xsi:type="string">xpath</item> + </item> + </item> + </argument> + </arguments> + </type> +</config> diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml index b1da43e473bc5d78d4bfaf0fbcbb718dac6acd3e..ad937cf472de7145429b16983288df69bb851134 100644 --- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml +++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml @@ -7,7 +7,7 @@ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Vault\Test\TestCase\ReorderUsingVaultTest" summary="Reorder from Admin with saved within PayPal Payflow Pro credit card"> - <variation name="ReorderUsingVaultPayflowProTestVariation1" summary="Reorder from Admin with saved within PayPal Payflow Pro credit card for Guest Customer" ticketId="MAGETWO-54872"> + <variation name="ReorderUsingVaultPayflowProTestVariation1" summary="Reorder from Admin with saved within PayPal Payflow Pro credit card for Guest Customer" ticketId="MAGETWO-34217, MAGETWO-54872"> <data name="description" xsi:type="string">Reorder from Admin with saved within PayPal Payflow Pro credit card for Guest Customer</data> <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data> <data name="customer/dataset" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/CustomerActivities/Sidebar.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/CustomerActivities/Sidebar.php index 050f797d83825e99eaf08728c2dc69149f8faaae..3fc41e0db1785d06eb29bd58b7343b02a274ee00 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/CustomerActivities/Sidebar.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/CustomerActivities/Sidebar.php @@ -21,6 +21,13 @@ abstract class Sidebar extends Block */ protected $addToOrder = './/tr[td[.="%s"]]//input[contains(@name,"add")]'; + /** + * 'Add to order' configure. + * + * @var string + */ + protected $addToOrderConfigure = './/tr[td[contains(.,"%s")]]//a[contains(@class, "icon-configure")]'; + /** * 'Add to order' checkbox. * @@ -39,9 +46,18 @@ abstract class Sidebar extends Block foreach ($products as $product) { $name = $product->getName(); $this->_rootElement->find(sprintf($this->addToOrderProductName, $name), Locator::SELECTOR_XPATH)->click(); - $this->_rootElement->click(); - $this->_rootElement->find(sprintf($this->addToOrder, $name), Locator::SELECTOR_XPATH, 'checkbox') - ->setValue('Yes'); + + $dataConfig = $product->getDataConfig(); + $typeId = isset($dataConfig['type_id']) ? $dataConfig['type_id'] : null; + + if ($this->hasRender($typeId)) { + $this->_rootElement->find(sprintf($this->addToOrderConfigure, $name), Locator::SELECTOR_XPATH)->click(); + $this->callRender($typeId, 'configProduct', ['product' => $product]); + } else { + $this->_rootElement->click(); + $this->_rootElement->find(sprintf($this->addToOrder, $name), Locator::SELECTOR_XPATH, 'checkbox') + ->setValue('Yes'); + } } } } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.php b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.php index 49487ff1b2e8ea9b9e23543a44a2878b797c4f2c..a501ec3cd228d8c60a5225027719e463dbf6c688 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.php @@ -142,9 +142,10 @@ class MoveRecentlyComparedProductsOnOrderPageTest extends Injectable * * @param Customer $customer * @param string $products + * @param bool $productsIsConfigured * @return array */ - public function test(Customer $customer, $products) + public function test(Customer $customer, $products, $productsIsConfigured = false) { // Preconditions // Create product @@ -168,6 +169,6 @@ class MoveRecentlyComparedProductsOnOrderPageTest extends Injectable $activitiesBlock->getRecentlyComparedProductsBlock()->addProductsToOrder($products); $activitiesBlock->updateChanges(); - return ['products' => $products, 'productsIsConfigured' => false]; + return ['products' => $products, 'productsIsConfigured' => $productsIsConfigured]; } } diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml index 601f550e4588bfd3c613ef8a50e8615174b298ae..76282ff3eec53867d257029f5184b941899ac2db 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/MoveRecentlyComparedProductsOnOrderPageTest.xml @@ -7,17 +7,10 @@ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Sales\Test\TestCase\MoveRecentlyComparedProductsOnOrderPageTest" summary="Add Products to Order from Recently Compared Products Section" ticketId="MAGETWO-28109"> - <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariation1"> - <data name="tag" xsi:type="string">stable:no</data> + <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariationWithSimpleProduct1"> <data name="products/0" xsi:type="string">catalogProductSimple::default</data> <data name="products/1" xsi:type="string">catalogProductSimple::default</data> <constraint name="Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid" /> </variation> - <variation name="MoveRecentlyComparedProductsOnOrderPageTestVariation2"> - <data name="tag" xsi:type="string">to_maintain:yes</data> - <data name="products/0" xsi:type="string">configurableProduct::configurable_with_qty_1</data> - <data name="products/1" xsi:type="string">configurableProduct::configurable_with_qty_1</data> - <constraint name="Magento\Sales\Test\Constraint\AssertProductInItemsOrderedGrid" /> - </variation> </testCase> </config> diff --git a/dev/tests/integration/etc/di/preferences/ce.php b/dev/tests/integration/etc/di/preferences/ce.php index cec08b1d91da7ec77ce81d00dcdf8fd09addfd9c..f1654cba97d74faedd12797d19a967afb410d500 100644 --- a/dev/tests/integration/etc/di/preferences/ce.php +++ b/dev/tests/integration/etc/di/preferences/ce.php @@ -1,5 +1,7 @@ <?php /** + * Preferences for classes like in di.xml (for integration tests) + * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ @@ -19,5 +21,6 @@ return [ \Magento\Framework\View\LayoutInterface::class => \Magento\TestFramework\View\Layout::class, \Magento\Framework\App\ResourceConnection\ConnectionAdapterInterface::class => \Magento\TestFramework\Db\ConnectionAdapter::class, - \Magento\Framework\Filesystem\DriverInterface::class => \Magento\Framework\Filesystem\Driver\File::class + \Magento\Framework\Filesystem\DriverInterface::class => \Magento\Framework\Filesystem\Driver\File::class, + \Magento\Framework\App\Config\ScopeConfigInterface::class => \Magento\TestFramework\App\Config::class, ]; diff --git a/dev/tests/integration/framework/Magento/TestFramework/Annotation/AdminConfigFixture.php b/dev/tests/integration/framework/Magento/TestFramework/Annotation/AdminConfigFixture.php index 780beaef7cc44715cebb722d02382cd602ab1f75..5b687d4d5a4660cecfe276f59fe4ed92a30441e6 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/Annotation/AdminConfigFixture.php +++ b/dev/tests/integration/framework/Magento/TestFramework/Annotation/AdminConfigFixture.php @@ -9,6 +9,11 @@ */ namespace Magento\TestFramework\Annotation; +/** + * Handler for applying magentoAdminConfig annotation + * + * @package Magento\TestFramework\Annotation + */ class AdminConfigFixture { /** @@ -34,7 +39,7 @@ class AdminConfigFixture protected function _getConfigValue($configPath) { return \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( - \Magento\Backend\App\ConfigInterface::class + \Magento\Framework\App\Config\MutableScopeConfigInterface::class )->getValue( $configPath ); @@ -49,7 +54,7 @@ class AdminConfigFixture protected function _setConfigValue($configPath, $value) { \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( - \Magento\Backend\App\ConfigInterface::class + \Magento\Framework\App\Config\MutableScopeConfigInterface::class )->setValue( $configPath, $value diff --git a/dev/tests/integration/framework/Magento/TestFramework/Annotation/ConfigFixture.php b/dev/tests/integration/framework/Magento/TestFramework/Annotation/ConfigFixture.php index 25863089bd6308d2c990c249ba427723d1ccdf1b..d9df69b7b76e5aed096d74e727f6c4ae9de0022d 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/Annotation/ConfigFixture.php +++ b/dev/tests/integration/framework/Magento/TestFramework/Annotation/ConfigFixture.php @@ -11,6 +11,11 @@ namespace Magento\TestFramework\Annotation; use Magento\Framework\App\Config\ScopeConfigInterface; +/** + * Handler which works with magentoConfigFixture annotations + * + * @package Magento\TestFramework\Annotation + */ class ConfigFixture { /** diff --git a/dev/tests/integration/framework/Magento/TestFramework/App/Config.php b/dev/tests/integration/framework/Magento/TestFramework/App/Config.php new file mode 100644 index 0000000000000000000000000000000000000000..43a47debf9064abacd7ca1ddf7c081561c4e6ec9 --- /dev/null +++ b/dev/tests/integration/framework/Magento/TestFramework/App/Config.php @@ -0,0 +1,137 @@ +<?php +/** + * Application configuration object. Used to access configuration when application is initialized and installed. + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestFramework\App; + +use Magento\Framework\App\Config\ScopeCodeResolver; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\DataObject; +use Magento\TestFramework\ObjectManager; + +/** + * @inheritdoc + */ +class Config extends \Magento\Framework\App\Config +{ + /** + * @var DataObject[] + */ + private $data; + + /** + * @var ScopeCodeResolver + */ + private $scopeCodeResolver; + + /** + * Initialize data object with all settings data + * + * @param array $data + * @param string $configType + * @return void + */ + private function setData(array $data, $configType) + { + $this->data[$configType] = new DataObject($data); + } + + /** + * Retrieve Scope Code Resolver + * + * @return ScopeCodeResolver + */ + private function getScopeCodeResolver() + { + if (!$this->scopeCodeResolver) { + $this->scopeCodeResolver = ObjectManager::getInstance()->get(ScopeCodeResolver::class); + } + + return $this->scopeCodeResolver; + } + + /** + * Set config value in the corresponding config scope + * + * @param string $path + * @param mixed $value + * @param string $scope + * @param null|string $scopeCode + * @return void + */ + public function setValue( + $path, + $value, + $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, + $scopeCode = null + ) { + $result = $this->get('system'); + + if ($scope === 'store') { + $scope = 'stores'; + } elseif ($scope === 'website') { + $scope = 'websites'; + } + + if (empty($scopeCode)) { + $scopeCode = $this->getScopeCodeResolver()->resolve($scope, $scopeCode); + } + + $keys = explode('/', $path); + if ($scope !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT) { + $searchKeys = array_merge([$scope, $scopeCode], $keys); + } else { + $searchKeys = array_merge([$scope], $keys); + } + + $this->updateResult($searchKeys, $result, $value); + $this->setData($result, 'system'); + } + + /** + * Recursively update results in global variable, which hold configs + * + * @param array $keys + * @param array $result + * @param mixed $value + * @return void + */ + private function updateResult(array $keys, & $result, $value) + { + $key = array_shift($keys); + + if (empty($keys)) { + $result[$key] = $value; + } else { + $this->updateResult($keys, $result[$key], $value); + } + } + + /** + * Flush all muted settings + * + * @return void + */ + public function clean() + { + $this->data = null; + $this->scopeCodeResolver = null; + parent::clean(); + } + + /** + * @inheritdoc + */ + public function get($configType, $path = null, $default = null) + { + $path = $path === null ? '' : $path; + if (!isset($this->data[$configType]) || $this->data[$configType]->getData($path) === null) { + return parent::get($configType, $path, $default); + } + + return $this->data[$configType]->getData($path); + } +} diff --git a/dev/tests/integration/framework/Magento/TestFramework/App/MutableScopeConfig.php b/dev/tests/integration/framework/Magento/TestFramework/App/MutableScopeConfig.php new file mode 100644 index 0000000000000000000000000000000000000000..3af325bab0ec18e674ada29ab6d236d4970fe274 --- /dev/null +++ b/dev/tests/integration/framework/Magento/TestFramework/App/MutableScopeConfig.php @@ -0,0 +1,80 @@ +<?php +/** + * Application configuration object. Used to access configuration when application is installed. + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\TestFramework\App; + +use Magento\Framework\App\Config\MutableScopeConfigInterface; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\TestFramework\ObjectManager; + +/** + * @inheritdoc + */ +class MutableScopeConfig implements MutableScopeConfigInterface +{ + /** + * @var Config + */ + private $testAppConfig; + + /** + * @param string $path + * @param string $scopeType + * @param null $scopeCode + * @return bool + */ + public function isSetFlag($path, $scopeType = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null) + { + return $this->getTestAppConfig()->isSetFlag($path, $scopeType, $scopeCode); + } + + /** + * @inheritdoc + */ + public function getValue($path, $scopeType = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null) + { + return $this->getTestAppConfig()->getValue($path, $scopeType, $scopeCode); + } + + /** + * @inheritdoc + */ + public function setValue( + $path, + $value, + $scopeType = \Magento\Framework\App\Config\ScopeConfigInterface::SCOPE_TYPE_DEFAULT, + $scopeCode = null + ) { + return $this->getTestAppConfig()->setValue($path, $value, $scopeType, $scopeCode); + } + + /** + * Clean app config cache + * + * @param string|null $type + * @return void + */ + public function clean() + { + $this->getTestAppConfig()->clean(); + } + + /** + * Retrieve test app config instance + * + * @return \Magento\TestFramework\App\Config + */ + private function getTestAppConfig() + { + if (!$this->testAppConfig) { + $this->testAppConfig = ObjectManager::getInstance()->get(ScopeConfigInterface::class); + } + + return $this->testAppConfig; + } +} diff --git a/dev/tests/integration/framework/Magento/TestFramework/App/ReinitableConfig.php b/dev/tests/integration/framework/Magento/TestFramework/App/ReinitableConfig.php new file mode 100644 index 0000000000000000000000000000000000000000..6d0b52555a395e398823e9d5ec1dd1d7aba59042 --- /dev/null +++ b/dev/tests/integration/framework/Magento/TestFramework/App/ReinitableConfig.php @@ -0,0 +1,43 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestFramework\App; + +use Magento\Framework\App\Config\ReinitableConfigInterface; +use Magento\TestFramework\ObjectManager; + +/** + * @inheritdoc + */ +class ReinitableConfig extends MutableScopeConfig implements ReinitableConfigInterface +{ + /** + * @var Config + */ + private $testAppConfig; + + /** + * {@inheritdoc} + */ + public function reinit() + { + $this->getTestScopeConfig()->clean(); + return $this; + } + + /** + * Retrieve Test Scope Config + * + * @return Config + */ + public function getTestScopeConfig() + { + if (!$this->testAppConfig) { + $this->testAppConfig = ObjectManager::getInstance()->get(Config::class); + } + + return $this->testAppConfig; + } +} diff --git a/dev/tests/integration/framework/Magento/TestFramework/Application.php b/dev/tests/integration/framework/Magento/TestFramework/Application.php index 3ae2c994511c7ed64038826399dc00cd9af62817..15407f2cd572f32b143d82bad9b59e6e382dc9fe 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/Application.php +++ b/dev/tests/integration/framework/Magento/TestFramework/Application.php @@ -6,8 +6,6 @@ namespace Magento\TestFramework; use Magento\Framework\Autoload\AutoloaderInterface; -use Magento\Framework\Filesystem; -use Magento\Framework\Filesystem\DriverInterface; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\App\DeploymentConfig; use Magento\Framework\Config\ConfigOptionsListConstants; @@ -561,7 +559,6 @@ class Application /** @var $objectManager \Magento\TestFramework\ObjectManager */ $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); $objectManager->clearCache(); - \Magento\Framework\Data\Form::setElementRenderer(null); \Magento\Framework\Data\Form::setFieldsetRenderer(null); \Magento\Framework\Data\Form::setFieldsetElementRenderer(null); diff --git a/dev/tests/integration/framework/Magento/TestFramework/Backend/App/Config.php b/dev/tests/integration/framework/Magento/TestFramework/Backend/App/Config.php new file mode 100644 index 0000000000000000000000000000000000000000..7907cf5a82d2e01d1814497879a49fcbccd3d229 --- /dev/null +++ b/dev/tests/integration/framework/Magento/TestFramework/Backend/App/Config.php @@ -0,0 +1,46 @@ +<?php +/** + * Default application path for backend area + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +namespace Magento\TestFramework\Backend\App; +use Magento\Framework\App\Config\ScopeConfigInterface; + +/** + * Backend config accessor. + */ +class Config extends \Magento\Backend\App\Config +{ + /** + * @var \Magento\TestFramework\App\MutableScopeConfig + */ + private $mutableScopeConfig; + + /** + * Config constructor. + * @param \Magento\TestFramework\App\Config $appConfig + * @param \Magento\TestFramework\App\MutableScopeConfig $mutableScopeConfig + */ + public function __construct(\Magento\TestFramework\App\Config $appConfig, \Magento\TestFramework\App\MutableScopeConfig $mutableScopeConfig) + { + parent::__construct($appConfig); + $this->mutableScopeConfig = $mutableScopeConfig; + } + + /** + * @inheritdoc + */ + public function setValue( + $path, + $value, + $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, + $scopeCode = null + ) { + $this->mutableScopeConfig->setValue($path, $value, $scope, $scopeCode); + } +} diff --git a/dev/tests/integration/framework/Magento/TestFramework/Bootstrap/DocBlock.php b/dev/tests/integration/framework/Magento/TestFramework/Bootstrap/DocBlock.php index 2349ae949876eff6cdbe29c47ac44c846fb8ba4b..bf890b2448e23f7a134574b9fb2fb2d7eca1151e 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/Bootstrap/DocBlock.php +++ b/dev/tests/integration/framework/Magento/TestFramework/Bootstrap/DocBlock.php @@ -53,6 +53,7 @@ class DocBlock new \Magento\TestFramework\Isolation\WorkingDirectory(), new \Magento\TestFramework\Isolation\DeploymentConfig(), new \Magento\TestFramework\Annotation\AppIsolation($application), + new \Magento\TestFramework\Isolation\AppConfig(), new \Magento\TestFramework\Annotation\ConfigFixture(), new \Magento\TestFramework\Annotation\DataFixtureBeforeTransaction($this->_fixturesBaseDir), new \Magento\TestFramework\Event\Transaction( @@ -66,7 +67,7 @@ class DocBlock new \Magento\TestFramework\Annotation\ComponentRegistrarFixture($this->_fixturesBaseDir), new \Magento\TestFramework\Annotation\AppArea($application), new \Magento\TestFramework\Annotation\Cache($application), - new \Magento\TestFramework\Annotation\AdminConfigFixture() + new \Magento\TestFramework\Annotation\AdminConfigFixture(), ]; } } diff --git a/dev/tests/integration/framework/Magento/TestFramework/Helper/CacheCleaner.php b/dev/tests/integration/framework/Magento/TestFramework/Helper/CacheCleaner.php new file mode 100644 index 0000000000000000000000000000000000000000..5d7748f0b1fd91db302a33b5ff84086f8fb11b23 --- /dev/null +++ b/dev/tests/integration/framework/Magento/TestFramework/Helper/CacheCleaner.php @@ -0,0 +1,50 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\TestFramework\Helper; + +use Magento\Framework\App\Cache\Frontend\Pool; + +/** + * Helper for cleaning cache + */ +class CacheCleaner +{ + /** + * Clean cache by specified types + * + * @param array $cacheTypes + */ + public static function clean(array $cacheTypes = []) + { + $cachePool = self::getCachePool(); + foreach ($cacheTypes as $cacheType) { + $cachePool->get($cacheType)->getBackend()->clean(); + } + } + + /** + * Clean all cache + */ + public static function cleanAll() + { + $cachePool = self::getCachePool(); + foreach ($cachePool as $cacheType) { + $cacheType->getBackend()->clean(); + } + } + + /** + * Get cache pool + * + * @return Pool + */ + private static function getCachePool() + { + return Bootstrap::getObjectManager() + ->get(Pool::class); + } +} diff --git a/dev/tests/integration/framework/Magento/TestFramework/Interception/PluginList.php b/dev/tests/integration/framework/Magento/TestFramework/Interception/PluginList.php index 9e8901c91fd7587378713afd7abea020cb82fa83..18cdc66cb3f2ea28436692cf55c5bfae1df42ac4 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/Interception/PluginList.php +++ b/dev/tests/integration/framework/Magento/TestFramework/Interception/PluginList.php @@ -5,6 +5,11 @@ */ namespace Magento\TestFramework\Interception; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides plugin list configuration + */ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList { /** @@ -13,6 +18,8 @@ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList protected $_originScopeScheme = []; /** + * Constructor + * * @param \Magento\Framework\Config\ReaderInterface $reader * @param \Magento\Framework\Config\ScopeInterface $configScope * @param \Magento\Framework\Config\CacheInterface $cache @@ -22,8 +29,8 @@ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList * @param \Magento\Framework\ObjectManagerInterface $objectManager * @param \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions * @param array $scopePriorityScheme - * @param string $cacheId - * + * @param string|null $cacheId + * @param SerializerInterface|null $serializer * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -36,7 +43,8 @@ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList \Magento\Framework\ObjectManagerInterface $objectManager, \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions, array $scopePriorityScheme, - $cacheId = 'plugins' + $cacheId = 'plugins', + SerializerInterface $serializer = null ) { parent::__construct( $reader, @@ -48,7 +56,8 @@ class PluginList extends \Magento\Framework\Interception\PluginList\PluginList $objectManager, $classDefinitions, $scopePriorityScheme, - $cacheId + $cacheId, + $serializer ); $this->_originScopeScheme = $this->_scopePriorityScheme; } diff --git a/dev/tests/integration/framework/Magento/TestFramework/Isolation/AppConfig.php b/dev/tests/integration/framework/Magento/TestFramework/Isolation/AppConfig.php new file mode 100644 index 0000000000000000000000000000000000000000..514b074d23366b25f6427f2d1e50da35e7641e0b --- /dev/null +++ b/dev/tests/integration/framework/Magento/TestFramework/Isolation/AppConfig.php @@ -0,0 +1,50 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\TestFramework\Isolation; + +use Magento\TestFramework\App\Config; +use Magento\TestFramework\ObjectManager; + +/** + * A listener that watches for integrity of app configuration + */ +class AppConfig +{ + /** + * @var Config + */ + private $testAppConfig; + + /** + * Clean memorized and cached setting values + * + * Assumption: this is done once right before executing very first test suite. + * It is assumed that deployment configuration is valid at this point + * + * @param \PHPUnit_Framework_TestCase $test + * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function startTest(\PHPUnit_Framework_TestCase $test) + { + $this->getTestAppConfig()->clean(); + } + + /** + * Retrieve Test App Config + * + * @return Config + */ + private function getTestAppConfig() + { + if (!$this->testAppConfig) { + $this->testAppConfig = ObjectManager::getInstance()->get(Config::class); + } + + return $this->testAppConfig; + } +} diff --git a/dev/tests/integration/framework/Magento/TestFramework/ObjectManager.php b/dev/tests/integration/framework/Magento/TestFramework/ObjectManager.php index c65ce0907912834027f929432be7f62dc01330a4..ad685845cde004bd54c8499671e9e22faa72d0e5 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/ObjectManager.php +++ b/dev/tests/integration/framework/Magento/TestFramework/ObjectManager.php @@ -5,6 +5,7 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ + namespace Magento\TestFramework; class ObjectManager extends \Magento\Framework\App\ObjectManager @@ -23,6 +24,8 @@ class ObjectManager extends \Magento\Framework\App\ObjectManager * @var array */ protected $persistedInstances = [ + \Magento\TestFramework\App\Config::class, + \Magento\Framework\App\Config\ScopeConfigInterface::class, \Magento\Framework\App\ResourceConnection::class, \Magento\Framework\Config\Scope::class, \Magento\Framework\ObjectManager\RelationsInterface::class, diff --git a/dev/tests/integration/framework/Magento/TestFramework/ObjectManager/Configurator.php b/dev/tests/integration/framework/Magento/TestFramework/ObjectManager/Configurator.php index b4a9819228e5fc653530a8ab3d28351e2538f2f6..afab0eca6edf051ff710b229ac114845f160e998 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/ObjectManager/Configurator.php +++ b/dev/tests/integration/framework/Magento/TestFramework/ObjectManager/Configurator.php @@ -5,10 +5,23 @@ */ namespace Magento\TestFramework\ObjectManager; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\Stdlib\CookieManagerInterface; +use Magento\Store\Model\StoreManagerInterface; +use Magento\Framework\App\MutableScopeConfig; +use Magento\Framework\App\ReinitableConfig; +use Magento\Framework\App\Config as AppConfig; +use Magento\Backend\App\Config as BackendConfig; + +/** + * Class which hold configurations (preferences, etc...) of integration test framework + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class Configurator implements \Magento\Framework\ObjectManager\DynamicConfigInterface { /** - * Map application initialization params to Object Manager configuration format + * Map application initialization params to Object Manager configuration format. * * @return array */ @@ -16,8 +29,13 @@ class Configurator implements \Magento\Framework\ObjectManager\DynamicConfigInte { return [ 'preferences' => [ - \Magento\Framework\Stdlib\CookieManagerInterface::class => \Magento\TestFramework\CookieManager::class, - \Magento\Store\Model\StoreManagerInterface::class => \Magento\TestFramework\Store\StoreManager::class, + CookieManagerInterface::class => \Magento\TestFramework\CookieManager::class, + StoreManagerInterface::class => \Magento\TestFramework\Store\StoreManager::class, + ScopeConfigInterface::class => \Magento\TestFramework\App\Config::class, + \Magento\Framework\App\Config::class => \Magento\TestFramework\App\Config::class, + BackendConfig::class => \Magento\TestFramework\Backend\App\Config::class, + ReinitableConfig::class => \Magento\TestFramework\App\ReinitableConfig::class, + MutableScopeConfig::class => \Magento\TestFramework\App\MutableScopeConfig::class, ] ]; } diff --git a/dev/tests/integration/framework/Magento/TestFramework/Store/StoreManager.php b/dev/tests/integration/framework/Magento/TestFramework/Store/StoreManager.php index 9f0124593ac1eff7892dabbb3e4b94a69150f831..5b2546765a132d35cd451fff449c80d06f31c06f 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/Store/StoreManager.php +++ b/dev/tests/integration/framework/Magento/TestFramework/Store/StoreManager.php @@ -5,6 +5,14 @@ */ namespace Magento\TestFramework\Store; +use Magento\TestFramework\App\Config; +use Magento\TestFramework\ObjectManager; + +/** + * Integration tests decoration of store manager + * + * @package Magento\TestFramework\Store + */ class StoreManager implements \Magento\Store\Model\StoreManagerInterface { /** @@ -117,7 +125,16 @@ class StoreManager implements \Magento\Store\Model\StoreManagerInterface */ public function reinitStores() { + //In order to restore configFixture values + $testAppConfig = ObjectManager::getInstance()->get(Config::class); + $reflection = new \ReflectionClass($testAppConfig); + $dataProperty = $reflection->getProperty('data'); + $dataProperty->setAccessible(true); + $savedConfig = $dataProperty->getValue($testAppConfig); + $this->decoratedStoreManager->reinitStores(); + + $dataProperty->setValue($testAppConfig, $savedConfig); $this->dispatchInitCurrentStoreAfterEvent(); } diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/ConfigTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/ConfigTest.php new file mode 100644 index 0000000000000000000000000000000000000000..508550fc1385ac47e75c7e63be982f6e9f1b57ca --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/ConfigTest.php @@ -0,0 +1,50 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** + * Test class for \Magento\TestFramework\App\Config. + */ +namespace Magento\Test\App; + +use Magento\Framework\App\Config\ScopeCodeResolver; +use Magento\TestFramework\App\Config; + +class ConfigTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Config + */ + private $model; + + public function setUp() + { + $scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class) + ->disableOriginalConstructor() + ->getMock(); + $this->model = new Config($scopeCodeResolver); + } + + public function testGet() + { + $configType = "system"; + $path = "stores/one"; + $value = 1; + $this->model->setValue($path, $value, 'default', 'one'); + + $this->assertEquals($value, $this->model->get($configType, 'default/stores/one')); + } + + public function testClean() + { + $configType = "system"; + $path = "stores/one"; + $value = 1; + $this->model->setValue($path, $value, 'default', 'one'); + $this->assertEquals($value, $this->model->get($configType, 'default/stores/one')); + $this->model->clean(); + $this->assertNull($this->model->get($configType, 'default/stores/one')); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/AppConfigTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/AppConfigTest.php new file mode 100644 index 0000000000000000000000000000000000000000..34cf654dcf5c0669cd16532d8960215565a92dde --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/AppConfigTest.php @@ -0,0 +1,48 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** + * Test class for \Magento\TestFramework\Isolation\WorkingDirectory. + */ +namespace Magento\Test\Isolation; + +use Magento\Framework\ObjectManagerInterface; +use Magento\TestFramework\ObjectManager; + +class AppConfigTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\TestFramework\Isolation\WorkingDirectory + */ + private $model; + + protected function setUp() + { + $this->model = new \Magento\TestFramework\Isolation\AppConfig(); + } + + protected function tearDown() + { + $this->model = null; + } + + public function testStartTestEndTest() + { + $test = $this->getMockBuilder(\PHPUnit_Framework_TestCase::class) + ->disableOriginalConstructor() + ->getMock(); + $modelReflection = new \ReflectionClass($this->model); + $testAppConfigProperty = $modelReflection->getProperty('testAppConfig'); + $testAppConfigProperty->setAccessible(true); + $testAppConfigMock = $this->getMockBuilder(\Magento\TestFramework\App\Config::class) + ->disableOriginalConstructor() + ->getMock(); + $testAppConfigProperty->setValue($this->model, $testAppConfigMock); + $testAppConfigMock->expects($this->once()) + ->method('clean'); + $this->model->startTest($test); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Authorizenet/Model/Directpost/RequestTest.php b/dev/tests/integration/testsuite/Magento/Authorizenet/Model/Directpost/RequestTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ab35c27985da8f13fb2fd4362c719fe0d3267315 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Authorizenet/Model/Directpost/RequestTest.php @@ -0,0 +1,102 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Authorizenet\Model\Directpost; + +use Magento\Authorizenet\Model\Directpost; +use Magento\Framework\Api\FilterBuilder; +use Magento\Framework\Api\SearchCriteriaBuilder; +use Magento\Framework\App\ObjectManager; +use Magento\Sales\Api\Data\OrderInterface; +use Magento\Sales\Api\OrderRepositoryInterface; +use Magento\Sales\Model\Order; +use Magento\TestFramework\Helper\Bootstrap; +use PHPUnit_Framework_MockObject_MockObject as MockObject; + +/** + * Class contains tests for Authorize.net Direct Post request handler + */ +class RequestTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Order + */ + private $order; + + /** + * @var Request + */ + private $request; + + /** + * @var ObjectManager + */ + private $objectManager; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + + $this->order = $this->getOrder(); + $this->request = $this->objectManager->get(Request::class); + } + + /** + * @covers \Magento\Authorizenet\Model\Directpost\Request::setDataFromOrder + * @magentoDataFixture Magento/Authorizenet/_files/order.php + */ + public function testSetDataFromOrder() + { + $customerEmail = 'john.doe@example.com'; + $merchantEmail = 'merchant@example.com'; + + /** @var Directpost|MockObject $payment */ + $payment = $this->getMockBuilder(Directpost::class) + ->disableOriginalConstructor() + ->setMethods(['getConfigData']) + ->getMock(); + + $payment->expects(static::exactly(2)) + ->method('getConfigData') + ->willReturnMap([ + ['email_customer', null, $customerEmail], + ['merchant_email', null, $merchantEmail] + ]); + + $result = $this->request->setDataFromOrder($this->order, $payment); + + static::assertEquals('US', $result->getXCountry()); + static::assertEquals('UK', $result->getXShipToCountry()); + static::assertEquals($customerEmail, $result->getXEmailCustomer()); + static::assertEquals($merchantEmail, $result->getXMerchantEmail()); + } + + /** + * Get stored order + * @return Order + */ + private function getOrder() + { + /** @var FilterBuilder $filterBuilder */ + $filterBuilder = $this->objectManager->get(FilterBuilder::class); + $filters = [ + $filterBuilder->setField(OrderInterface::INCREMENT_ID) + ->setValue('100000002') + ->create() + ]; + + /** @var SearchCriteriaBuilder $searchCriteriaBuilder */ + $searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class); + $searchCriteria = $searchCriteriaBuilder->addFilters($filters) + ->create(); + + $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class); + $orders = $orderRepository->getList($searchCriteria) + ->getItems(); + + /** @var OrderInterface $order */ + return array_pop($orders); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Authorizenet/Model/DirectpostTest.php b/dev/tests/integration/testsuite/Magento/Authorizenet/Model/DirectpostTest.php new file mode 100644 index 0000000000000000000000000000000000000000..c20db43c127b4a9c058cb206cde14822f9aafd84 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Authorizenet/Model/DirectpostTest.php @@ -0,0 +1,129 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Authorizenet\Model; + +use Magento\Framework\Api\FilterBuilder; +use Magento\Framework\Api\SearchCriteriaBuilder; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\HTTP\ZendClient; +use Magento\Framework\HTTP\ZendClientFactory; +use Magento\Sales\Api\Data\OrderInterface; +use Magento\Sales\Api\OrderRepositoryInterface; +use Magento\Sales\Model\Order\Payment; +use Magento\TestFramework\Helper\Bootstrap; +use PHPUnit_Framework_MockObject_MockObject as MockObject; +use Zend_Http_Response; + +/** + * Class contains tests for Direct Post integration + */ +class DirectpostTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var ZendClientFactory|MockObject + */ + private $httpClientFactory; + + /** + * @var Directpost + */ + private $directPost; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + + $this->httpClientFactory = $this->getMockBuilder(ZendClientFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $this->directPost = $this->objectManager->create(Directpost::class, [ + 'httpClientFactory' => $this->httpClientFactory + ]); + } + + /** + * @covers \Magento\Authorizenet\Model\Directpost::capture + * @magentoDataFixture Magento/Authorizenet/_files/order.php + */ + public function testCapture() + { + $amount = 120.15; + /** @var Payment $payment */ + $payment = $this->getPayment(); + $transactionId = '106235225'; + + /** @var ZendClient|MockObject $httpClient */ + $httpClient = $this->getMockBuilder(ZendClient::class) + ->disableOriginalConstructor() + ->setMethods(['setUri', 'setConfig', 'setParameterPost', 'setMethod', 'request']) + ->getMock(); + + $this->httpClientFactory->expects(static::once()) + ->method('create') + ->willReturn($httpClient); + + $response = $this->getMockBuilder(Zend_Http_Response::class) + ->disableOriginalConstructor() + ->setMethods(['getBody']) + ->getMock(); + $response->expects(static::once()) + ->method('getBody') + ->willReturn( + "1(~)1(~)1(~)This transaction has been approved.(~)AWZFTG(~)P(~){$transactionId}(~)100000002(~) + (~)120.15(~)CC(~)prior_auth_capture(~)(~)Anthony(~)Nealy(~)(~)Pearl St(~)Los Angeles(~)California + (~)10020(~)US(~)22-333-44(~)(~)customer@example.com(~)John(~)Doe(~) + (~)Bourne St(~)London(~)(~)DW23W(~)UK(~)0.00(~)(~){$amount}(~)(~) + (~)74B5D54ADFE98093A0FF6446(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)XXXX1111(~)Visa(~)(~)(~)(~)(~) + (~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)(~)" + ); + + $httpClient->expects(static::once()) + ->method('request') + ->willReturn($response); + + $this->directPost->capture($payment, $amount); + + static::assertEquals($transactionId, $payment->getTransactionId()); + static::assertFalse($payment->getIsTransactionClosed()); + static::assertEquals('US', $payment->getOrder()->getBillingAddress()->getCountryId()); + static::assertEquals('UK', $payment->getOrder()->getShippingAddress()->getCountryId()); + } + + /** + * Get order payment + * @return Payment + */ + private function getPayment() + { + /** @var FilterBuilder $filterBuilder */ + $filterBuilder = $this->objectManager->get(FilterBuilder::class); + $filters = [ + $filterBuilder->setField(OrderInterface::INCREMENT_ID) + ->setValue('100000002') + ->create() + ]; + + /** @var SearchCriteriaBuilder $searchCriteriaBuilder */ + $searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class); + $searchCriteria = $searchCriteriaBuilder->addFilters($filters) + ->create(); + + $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class); + $orders = $orderRepository->getList($searchCriteria) + ->getItems(); + + /** @var OrderInterface $order */ + $order = array_pop($orders); + return $order->getPayment(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Authorizenet/_files/order.php b/dev/tests/integration/testsuite/Magento/Authorizenet/_files/order.php new file mode 100644 index 0000000000000000000000000000000000000000..564ab84a8f8527c61bf8e79f7a57ad53b971089f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Authorizenet/_files/order.php @@ -0,0 +1,70 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +use Magento\Sales\Api\OrderRepositoryInterface; +use Magento\Sales\Model\Order; +use Magento\Sales\Model\Order\Address; +use Magento\Sales\Model\Order\Payment; +use Magento\TestFramework\Helper\Bootstrap; + +$objectManager = Bootstrap::getObjectManager(); + +$amount = 120.15; + +/** @var Payment $payment */ +$payment = $objectManager->get(Payment::class); +$payment + ->setMethod('authorizenet_directpost') + ->setAnetTransType('AUTH_ONLY') + ->setBaseAmountAuthorized($amount) + ->setPoNumber('10101200'); + +/** @var Address\ $billingAddress */ +$billingAddress = $objectManager->create(Address::class, [ + 'data' => [ + 'firstname' => 'John', + 'lastname' => 'Doe', + 'email' => 'customer@example.com', + 'street' => 'Pearl St', + 'city' => 'Los Angeles', + 'region' => 'CA', + 'postcode' => '10020', + 'country_id' => 'US', + 'telephone' => '22-333-44', + 'address_type' => 'billing' + ] +]); + +$shippingAddress = $objectManager->create(Address::class, [ + 'data' => [ + 'firstname' => 'John', + 'lastname' => 'Doe', + 'email' => 'customer@example.com', + 'street' => 'Bourne St', + 'city' => 'London', + 'postcode' => 'DW23W', + 'country_id' => 'UK', + 'telephone' => '22-333-44', + 'address_type' => 'billing' + ] +]); + +/** @var Order $order */ +$order = $objectManager->create(Order::class); +$order->setIncrementId('100000002') + ->setQuoteId(2) + ->setIncrementId('100000002') + ->setBaseGrandTotal($amount) + ->setBaseCurrencyCode('USD') + ->setBaseTaxAmount($amount) + ->setBaseShippingAmount($amount) + ->setCustomerEmail('customer@example.com') + ->setBillingAddress($billingAddress) + ->setShippingAddress($shippingAddress) + ->setPayment($payment); + +/** @var OrderRepositoryInterface $orderRepository */ +$orderRepository = $objectManager->get(OrderRepositoryInterface::class); +$orderRepository->save($order); diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/TextTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/TextTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9d2875716156e83b48502be84a4ef1a86ef46772 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/TextTest.php @@ -0,0 +1,142 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Backend\Block\Widget\Grid\Column\Renderer; + +use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\ObjectManager; +use Magento\Backend\Block\Widget\Grid\Column; +use Magento\Framework\DataObject; +use Magento\Framework\Phrase; +use Magento\Framework\Phrase\RendererInterface; + +class TextTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var RendererInterface + */ + private $origRenderer; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + $this->origRenderer = Phrase::getRenderer(); + /** @var RendererInterface|PHPUnit_Framework_MockObject_MockObject $rendererMock */ + $rendererMock = $this->getMock(RendererInterface::class); + $rendererMock->expects($this->any()) + ->method('render') + ->willReturnCallback( + function ($input) { + return end($input) . ' translated'; + } + ); + Phrase::setRenderer($rendererMock); + } + + protected function tearDown() + { + Phrase::setRenderer($this->origRenderer); + } + + /** + * @param array $columnData + * @param array $rowData + * @param string $expected + * @dataProvider renderDataProvider + */ + public function testRender($columnData, $rowData, $expected) + { + /** @var Text $renderer */ + $renderer = $this->objectManager->create(Text::class); + /** @var Column $column */ + $column = $this->objectManager->create( + Column::class, + [ + 'data' => $columnData + ] + ); + /** @var DataObject $row */ + $row = $this->objectManager->create( + DataObject::class, + [ + 'data' => $rowData + ] + ); + $this->assertEquals( + $expected, + $renderer->setColumn($column)->render($row) + ); + } + + /** + * @return array + */ + public function renderDataProvider() + { + return [ + [ + [ + 'index' => 'title', + 'translate' => true + ], + [ + 'title' => 'String' + ], + 'String translated' + ], + [ + [ + 'index' => 'title' + ], + [ + 'title' => 'Doesn\'t need to be translated' + ], + 'Doesn't need to be translated' + ], + [ + [ + 'format' => '#$subscriber_id $customer_name ($subscriber_email)' + ], + [ + 'subscriber_id' => '10', + 'customer_name' => 'John Doe', + 'subscriber_email' => 'john@doe.com' + ], + '#10 John Doe (john@doe.com)' + ], + [ + [ + 'format' => '$customer_name, email: $subscriber_email', + 'translate' => true + ], + [ + 'customer_name' => 'John Doe', + 'subscriber_email' => 'john@doe.com' + ], + 'John Doe, email: john@doe.com translated' + ], + [ + [ + 'format' => 'String', + 'translate' => true + ], + [], + 'String translated' + ], + [ + [ + 'format' => 'Doesn\'t need to be translated' + ], + [], + 'Doesn't need to be translated' + ] + ]; + } +} diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/DataTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/DataTest.php index 650c84f17a36624b39df6ccd6bef5094ec021123..071c2499bb33262f1f1df9a6bcbd1f37340516ed 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/DataTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/DataTest.php @@ -397,7 +397,7 @@ class DataTest extends \PHPUnit_Framework_TestCase ], 'price include tax, display excluding tax, high rate product tax class, round' => [ (new \Magento\Framework\DataObject())->setPrice(3.256)->setRoundPrice(true), - '2.67', + '2.97', [ [ 'path' => Config::CONFIG_XML_PATH_PRICE_INCLUDES_TAX, diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php index 0d6f18dbacbc837485b20751d9f840ee252db284..9252f87079fa501960e274789d394bd577137ceb 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php @@ -27,11 +27,6 @@ class FlatTest extends \PHPUnit_Framework_TestCase ); } - public function testIsEnabledDefault() - { - $this->assertFalse($this->_state->isFlatEnabled()); - } - /** * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1 */ diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ConfigTest.php new file mode 100644 index 0000000000000000000000000000000000000000..178107e487e9292b90226e838e5767deef47d1d8 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ConfigTest.php @@ -0,0 +1,61 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Catalog\Model; + +use Magento\Catalog\Model\Config; +use Magento\TestFramework\ObjectManager; +use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\Helper\CacheCleaner; + +class ConfigTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Config + */ + private $config; + + /** + * @var ObjectManager + */ + private $objectManager; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + $this->config = $this->objectManager->get(Config::class); + } + + public function testGetEntityAttributeCodes() + { + $entityType = 'catalog_product'; + CacheCleaner::cleanAll(); + $this->assertEquals( + $this->config->getEntityAttributeCodes($entityType), + $this->config->getEntityAttributeCodes($entityType) + ); + } + + public function testGetAttribute() + { + $entityType = 'catalog_product'; + $attributeCode = 'color'; + CacheCleaner::cleanAll(); + $this->assertEquals( + $this->config->getAttribute($entityType, $attributeCode), + $this->config->getAttribute($entityType, $attributeCode) + ); + } + + public function testGetEntityType() + { + $entityType = 'catalog_product'; + CacheCleaner::cleanAll(); + $this->assertEquals( + $this->config->getEntityType($entityType), + $this->config->getEntityType($entityType) + ); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Source/CountryofmanufactureTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Source/CountryofmanufactureTest.php new file mode 100644 index 0000000000000000000000000000000000000000..34fd3b678a0866af7ce5bcec53cf6d6fe496bbfc --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Source/CountryofmanufactureTest.php @@ -0,0 +1,32 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Catalog\Model\Product\Attribute\Source; + +use Magento\TestFramework\Helper\CacheCleaner; + +class CountryofmanufactureTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture + */ + private $model; + + protected function setUp() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->model = $objectManager->create( + \Magento\Catalog\Model\Product\Attribute\Source\Countryofmanufacture::class + ); + } + + public function testGetAllOptions() + { + CacheCleaner::cleanAll(); + $allOptions = $this->model->getAllOptions(); + $cachedAllOptions = $this->model->getAllOptions(); + $this->assertEquals($allOptions, $cachedAllOptions); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/SourceTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/SourceTest.php index ed8f12020a977192d94c866e81110a167d7a3587..2d811ea59bfa95eedb56f48635ed4dd0d95a0c87 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/SourceTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ResourceModel/Product/Indexer/Eav/SourceTest.php @@ -11,6 +11,7 @@ use Magento\TestFramework\Helper\Bootstrap; /** * Class SourceTest + * @magentoAppIsolation enabled */ class SourceTest extends \PHPUnit_Framework_TestCase { diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b01d1e6d38655fac502d16e4be7f6d117202078d --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php @@ -0,0 +1,50 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Catalog\Ui\DataProvider\Product\Form\Modifier; + +use Magento\TestFramework\Helper\CacheCleaner; + +/** + * @magentoAppArea adminhtml + * @magentoDataFixture Magento/Catalog/_files/categories.php + * @magentoDbIsolation enabled + * @magentoAppIsolation enabled + */ +class CategoriesTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Categories + */ + private $object; + + protected function setUp() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $registry = $objectManager->get(\Magento\Framework\Registry::class); + /** @var $store \Magento\Store\Model\Store */ + $store = $objectManager->create(\Magento\Store\Model\Store::class); + $store->load('admin'); + $registry->register('current_store', $store); + $this->object = $objectManager->create(Categories::class); + } + + public function testModifyMeta() + { + $inputMeta = include __DIR__ . '/_files/input_meta_for_categories.php'; + $expectedCategories = include __DIR__ . '/_files/expected_categories.php'; + CacheCleaner::cleanAll(); + $this->assertCategoriesInMeta($expectedCategories, $this->object->modifyMeta($inputMeta)); + // Verify cached data + $this->assertCategoriesInMeta($expectedCategories, $this->object->modifyMeta($inputMeta)); + } + + private function assertCategoriesInMeta(array $expectedCategories, array $meta) + { + $categoriesElement = $meta['product-details']['children']['container_category_ids']['children']['category_ids']; + $this->assertEquals($expectedCategories, $categoriesElement['arguments']['data']['config']['options']); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/expected_categories.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/expected_categories.php new file mode 100644 index 0000000000000000000000000000000000000000..ed30676e16b07dd54cae708b2f7942511fe8fb6c --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/expected_categories.php @@ -0,0 +1,89 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +return [ + 0 => + [ + 'value' => '2', + 'is_active' => '1', + 'label' => 'Default Category', + 'optgroup' => + [ + 0 => + [ + 'value' => '3', + 'is_active' => '1', + 'label' => 'Category 1', + 'optgroup' => + [ + 0 => + [ + 'value' => '4', + 'is_active' => '1', + 'label' => 'Category 1.1', + 'optgroup' => + [ + 0 => + [ + 'value' => '5', + 'is_active' => '1', + 'label' => 'Category 1.1.1', + ], + ], + ], + 1 => + [ + 'value' => '13', + 'is_active' => '1', + 'label' => 'Category 1.2', + ], + ], + ], + 1 => + [ + 'value' => '6', + 'is_active' => '1', + 'label' => 'Category 2', + ], + 2 => + [ + 'value' => '7', + 'is_active' => '1', + 'label' => 'Movable', + ], + 3 => + [ + 'value' => '8', + 'is_active' => '0', + 'label' => 'Inactive', + ], + 4 => + [ + 'value' => '9', + 'is_active' => '1', + 'label' => 'Movable Position 1', + ], + 5 => + [ + 'value' => '10', + 'is_active' => '1', + 'label' => 'Movable Position 2', + ], + 6 => + [ + 'value' => '11', + 'is_active' => '1', + 'label' => 'Movable Position 3', + ], + 7 => + [ + 'value' => '12', + 'is_active' => '1', + 'label' => 'Category 12', + ], + ], + ], +]; diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/input_meta_for_categories.php b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/input_meta_for_categories.php new file mode 100644 index 0000000000000000000000000000000000000000..f43e9c916fcd25723a65f9dd6fde0018f026cd66 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/_files/input_meta_for_categories.php @@ -0,0 +1,56 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +return [ + 'product-details' => + [ + 'children' => + ['container_category_ids' => + [ + 'arguments' => + [ + 'data' => + [ + 'config' => + [ + 'formElement' => 'container', + 'componentType' => 'container', + 'breakLine' => false, + 'label' => 'Categories', + 'required' => '0', + 'sortOrder' => 70, + ], + ], + ], + 'children' => + [ + 'category_ids' => + [ + 'arguments' => + [ + 'data' => + [ + 'config' => + [ + 'dataType' => 'text', + 'formElement' => 'input', + 'visible' => '1', + 'required' => '0', + 'notice' => null, + 'default' => null, + 'label' => 'Categories', + 'code' => 'category_ids', + 'source' => 'product-details', + 'scopeLabel' => '[GLOBAL]', + 'globalScope' => true, + 'sortOrder' => 70, + 'componentType' => 'field', + ], + ], + ], + ], + ], + ]]]]; diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute.php index 963de3e46fea69c821902b8d4266681adc0d5ea8..6b1e53242cb3dcf412525eb1334e398c55a58d8b 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute.php @@ -3,7 +3,6 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - /* Create attribute */ /** @var $installer \Magento\Catalog\Setup\CategorySetup */ $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..6fe9f0d2b4898fd3cf3a09208272ae87133036f5 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiselect_attribute_rollback.php @@ -0,0 +1,18 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/* Delete attribute with multiselect_attribute code */ +$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry'); +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', true); +/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */ +$attribute = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( + 'Magento\Catalog\Model\ResourceModel\Eav\Attribute' +); +$attribute->load('multiselect_attribute', 'attribute_code'); +$attribute->delete(); + +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', false); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute.php index f252447a1586d363be145a74e4e7c9fab00d63a6..259b7a9166c32b6a19071ab9a6358fe2494d84c3 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute.php @@ -3,8 +3,14 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ + +/** + * Create multiselect attribute + */ require __DIR__ . '/multiselect_attribute.php'; +/** Create product with options and multiselect attribute */ + /** @var $installer \Magento\Catalog\Setup\CategorySetup */ $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( \Magento\Catalog\Setup\CategorySetup::class diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..97937bc3509ea10220c013118449be0e869d47c7 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute_rollback.php @@ -0,0 +1,23 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/** + * Remove all products as strategy of isolation process + */ +$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry'); +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', true); + +/** @var $productCollection \Magento\Catalog\Model\ResourceModel\Product */ +$productCollection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Catalog\Model\Product') + ->getCollection(); + +foreach ($productCollection as $product) { + $product->delete(); +} + +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', false); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/text_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/text_attribute_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..c81afcaf95d2ea6dbd712229bce891a2cd17d50f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/text_attribute_rollback.php @@ -0,0 +1,18 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/* Delete attribute with text_attribute code */ +$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry'); +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', true); +/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */ +$attribute = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( + 'Magento\Catalog\Model\ResourceModel\Eav\Attribute' +); +$attribute->load('text_attribute', 'attribute_code'); +$attribute->delete(); + +$registry->unregister('isSecureArea'); +$registry->register('isSecureArea', false); diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/AbstractProductExportImportTestCase.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/AbstractProductExportImportTestCase.php index 3f566bda2d3525d4375ec58477e9a7cb20d50e7f..c5ebf80c6a060681947e920a686997c48c07b3d2 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/AbstractProductExportImportTestCase.php +++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/AbstractProductExportImportTestCase.php @@ -6,9 +6,12 @@ namespace Magento\CatalogImportExport\Model; use Magento\Framework\App\Bootstrap; +use Magento\Framework\App\Config; use Magento\Framework\App\Filesystem\DirectoryList; /** + * Abstract class for testing product export and import scenarios + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ abstract class AbstractProductExportImportTestCase extends \PHPUnit_Framework_TestCase @@ -64,6 +67,7 @@ abstract class AbstractProductExportImportTestCase extends \PHPUnit_Framework_Te $this->productResource = $this->objectManager->create( \Magento\Catalog\Model\ResourceModel\Product::class ); + \Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType::$commonAttributesCache = []; } protected function tearDown() diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php index dc9e440b045f86ad2e85de45124ac01881d3892c..9087aefa11e8320b7b1113770109904ffc3dcb6a 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php @@ -7,6 +7,8 @@ namespace Magento\CatalogImportExport\Model\Export; /** * @magentoDataFixtureBeforeTransaction Magento/Catalog/_files/enable_reindex_schedule.php + * @magentoAppIsolation enabled + * @magentoDbIsolation enabled */ class ProductTest extends \PHPUnit_Framework_TestCase { @@ -66,6 +68,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase /** * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_data.php + * @magentoDbIsolationEnabled */ public function testExport() { @@ -88,6 +91,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase /** * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_with_product_links_data.php + * @magentoDbIsolationEnabled */ public function testExportWithProductLinks() { @@ -101,7 +105,9 @@ class ProductTest extends \PHPUnit_Framework_TestCase /** * Verify that all stock item attribute values are exported (aren't equal to empty string) - * + * + * @magentoAppIsolation enabled + * @magentoDbIsolation enabled * @covers \Magento\CatalogImportExport\Model\Export\Product::export * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_data.php */ @@ -163,7 +169,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase /** * Verifies if exception processing works properly - * + * @magentoDbIsolation enabled * @magentoDataFixture Magento/CatalogImportExport/_files/product_export_data.php */ public function testExceptionInGetExportData() diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php index c0e45410952717c783686e05b75d54eabdc6a295..ff21749ccf372d3dae8d07d64406b21e87465b49 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php @@ -24,7 +24,8 @@ use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface; /** * Class ProductTest - * + * @magentoAppIsolation enabled + * @magentoDbIsolation enabled * @magentoDataFixtureBeforeTransaction Magento/Catalog/_files/enable_reindex_schedule.php * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data.php index ffee568b0622fa8ef3f5af185e24805367ee9203..f7fd7cec31996908d0a6ed5b76ad5d6ada302381 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data.php +++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data.php @@ -3,12 +3,13 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - -\Magento\TestFramework\Helper\Bootstrap::getInstance()->reinitialize(); - +/** Create category */ require dirname(dirname(__DIR__)) . '/Catalog/_files/category.php'; +/** Create fixture store */ require dirname(dirname(__DIR__)) . '/Store/_files/second_store.php'; +/** Create product with multiselect attribute and values */ require dirname(dirname(__DIR__)) . '/Catalog/_files/products_with_multiselect_attribute.php'; +/** Create dummy text attribute */ require dirname(dirname(__DIR__)) . '/Catalog/_files/product_text_attribute.php'; $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..fdb65e731f8255aba9c26c750f1d74760ea6fc59 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_data_rollback.php @@ -0,0 +1,10 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** Delete all products */ +require dirname(dirname(__DIR__)) . '/Catalog/_files/products_with_multiselect_attribute_rollback.php'; +/** Delete text attribute */ +require dirname(dirname(__DIR__)) . '/Catalog/_files/text_attribute_rollback.php'; diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data.php index fcbf58a44e569aa80f2cfe94251ca7e1859a8483..bf5f4f96eed0221a6f1579508bfce5636caf7cf4 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data.php +++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data.php @@ -3,9 +3,11 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - +/** Create category */ require dirname(dirname(__DIR__)) . '/Catalog/_files/category.php'; +/** Create fixture store */ require dirname(dirname(__DIR__)) . '/Store/_files/second_store.php'; +/** Create product with mulselect attribute */ require dirname(dirname(__DIR__)) . '/Catalog/_files/products_with_multiselect_attribute.php'; $productModel = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..519568103b9dabb3bd6abf42b386ce6ebd5cc32d --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/_files/product_export_with_product_links_data_rollback.php @@ -0,0 +1,12 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** Remove fixture category */ +require dirname(dirname(__DIR__)) . '/Catalog/_files/category_rollback.php'; +/** Remove fixture store */ +require dirname(dirname(__DIR__)) . '/Store/_files/second_store_rollback.php'; +/** Delete all products */ +require dirname(dirname(__DIR__)) . '/Catalog/_files/products_with_multiselect_attribute_rollback.php'; diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php index 6322a60cef8a5fda1b50e220b10de7c5385956d4..783baba407da5a3365a5c08e65ae78c35afef2e4 100644 --- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php @@ -80,6 +80,7 @@ class PriceTest extends \PHPUnit_Framework_TestCase } /** + * @magentoConfigFixture current_store tax/display/type 1 * @magentoDataFixture Magento/ConfigurableProduct/_files/tax_rule.php * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php */ diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/configurable_attribute.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/configurable_attribute.php index 2ef7beb59838f0d052056d2a01932d9d60e1d473..b6fe9d7097e1648196b3b4260c443d019563c7f9 100644 --- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/configurable_attribute.php +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/configurable_attribute.php @@ -54,8 +54,9 @@ if (!$attribute->getId()) { ); $attributeRepository->save($attribute); + + /* Assign attribute to attribute set */ + $installer->addAttributeToGroup('catalog_product', 'Default', 'General', $attribute->getId()); } -/* Assign attribute to attribute set */ -$installer->addAttributeToGroup('catalog_product', 'Default', 'General', $attribute->getId()); $eavConfig->clear(); diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id.php index 305a6e699125fae655dcf67b36b6ba8772f2a71e..79a2ff32eed54a8a9b3693732536074505b8458f 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id.php +++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id.php @@ -1,5 +1,7 @@ <?php /** + * Create customer and attach it to custom website with code newwebsite + * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ @@ -13,8 +15,10 @@ $website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\ $website->setName('new Website')->setCode('newwebsite')->save(); $websiteId = $website->getId(); - -$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( +$storeManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->get(\Magento\Store\Model\StoreManager::class); +$storeManager->reinitStores(); +$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( \Magento\Customer\Model\Customer::class); /** @var Magento\Customer\Model\Customer $customer */ $customer->setWebsiteId( @@ -47,7 +51,7 @@ $customer->setWebsiteId( $customer->isObjectNew(true); /** @var \Magento\Customer\Model\Address $addressOne */ -$addressOne = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( +$addressOne = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( \Magento\Customer\Model\Address::class); $addressOneData = [ 'firstname' => 'Firstname', @@ -63,7 +67,7 @@ $addressOne->setData($addressOneData); $customer->addAddress($addressOne); /** @var \Magento\Customer\Model\Address $addressTwo */ -$addressTwo = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( +$addressTwo = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( \Magento\Customer\Model\Address::class); $addressTwoData = [ 'firstname' => 'test firstname', @@ -79,7 +83,7 @@ $addressTwo->setData($addressTwoData); $customer->addAddress($addressTwo); /** @var \Magento\Customer\Model\Address $addressThree */ -$addressThree = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( +$addressThree = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( \Magento\Customer\Model\Address::class); $addressThreeData = [ 'firstname' => 'removed firstname', diff --git a/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php b/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a229b64bb7dd10ef29acd5e824dfb5a9b28bfcc8 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php @@ -0,0 +1,64 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Deploy\Console\Command\App; + +use Magento\Framework\App\DeploymentConfig; +use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Config\File\ConfigFilePool; +use Magento\Framework\Filesystem\DriverPool; +use Magento\Framework\ObjectManagerInterface; +use Magento\TestFramework\Helper\Bootstrap; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class ApplicationDumpCommandTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ApplicationDumpCommand + */ + private $command; + + /** + * @var ObjectManagerInterface + */ + private $objectManager; + + public function setUp() + { + $this->command = Bootstrap::getObjectManager()->get(ApplicationDumpCommand::class); + $this->objectManager = Bootstrap::getObjectManager(); + } + + public function testExecute() + { + $inputMock = $this->getMock(InputInterface::class); + $outputMock = $this->getMock(OutputInterface::class); + $outputMock->expects($this->once()) + ->method('writeln') + ->with('<info>Done.</info>'); + $this->assertEquals(0, $this->command->run($inputMock, $outputMock)); + } + + public function tearDown() + { + /** @var ConfigFilePool $configFilePool */ + $configFilePool = $this->objectManager->get(ConfigFilePool::class); + $filePool = $configFilePool->getInitialFilePools(); + $file = $filePool[ConfigFilePool::LOCAL][ConfigFilePool::APP_CONFIG]; + /** @var DirectoryList $dirList */ + $dirList = $this->objectManager->get(DirectoryList::class); + $path = $dirList->getPath(DirectoryList::CONFIG); + $driverPool = $this->objectManager->get(DriverPool::class); + $fileDriver = $driverPool->getDriver(DriverPool::FILE); + if ($fileDriver->isExists($path . '/' . $file)) { + unlink($path . '/' . $file); + } + /** @var DeploymentConfig $deploymentConfig */ + $deploymentConfig = $this->objectManager->get(DeploymentConfig::class); + $deploymentConfig->resetData(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Directory/Block/DataTest.php b/dev/tests/integration/testsuite/Magento/Directory/Block/DataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b0c08ed1792fc8f17b42d263436b4701bf865d7c --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Directory/Block/DataTest.php @@ -0,0 +1,38 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Directory\Block; + +use Magento\TestFramework\Helper\CacheCleaner; + +class DataTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Directory\Block\Data + */ + private $block; + + protected function setUp() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->block = $objectManager->get(\Magento\Directory\Block\Data::class); + } + + public function testGetCountryHtmlSelect() + { + CacheCleaner::cleanAll(); + $result = $this->block->getCountryHtmlSelect(); + $resultTwo = $this->block->getCountryHtmlSelect(); + $this->assertEquals($result, $resultTwo); + } + + public function testGetRegionHtmlSelect() + { + CacheCleaner::cleanAll(); + $result = $this->block->getRegionHtmlSelect(); + $resultTwo = $this->block->getRegionHtmlSelect(); + $this->assertEquals($result, $resultTwo); + } +} diff --git a/dev/tests/integration/testsuite/Magento/DownloadableImportExport/Model/Import/Product/Type/DownloadableTest.php b/dev/tests/integration/testsuite/Magento/DownloadableImportExport/Model/Import/Product/Type/DownloadableTest.php index 8db369facf97f4d61dd8468dd34db67b5250bf13..d25e0406882377e1ef5e6ab89c21bf5a1368496c 100644 --- a/dev/tests/integration/testsuite/Magento/DownloadableImportExport/Model/Import/Product/Type/DownloadableTest.php +++ b/dev/tests/integration/testsuite/Magento/DownloadableImportExport/Model/Import/Product/Type/DownloadableTest.php @@ -5,9 +5,7 @@ */ namespace Magento\DownloadableImportExport\Model\Import\Product\Type; -use Magento\Framework\App\Bootstrap; use Magento\Framework\App\Filesystem\DirectoryList; -use Magento\ImportExport\Model\Import; /** * @magentoAppArea adminhtml diff --git a/dev/tests/integration/testsuite/Magento/Eav/Model/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Eav/Model/ConfigTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4cb90c2c98c56185f99f3b1e1759fc40aa73d179 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Eav/Model/ConfigTest.php @@ -0,0 +1,40 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Eav\Model; + +use Magento\Eav\Model\Config; +use Magento\TestFramework\ObjectManager; +use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\Helper\CacheCleaner; + +class ConfigTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Config + */ + private $config; + + /** + * @var ObjectManager + */ + private $objectManager; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + $this->config = $this->objectManager->get(Config::class); + } + + public function testGetEntityAttributeCodes() + { + $entityType = 'catalog_product'; + CacheCleaner::cleanAll(); + $this->assertEquals( + $this->config->getEntityAttributeCodes($entityType), + $this->config->getEntityAttributeCodes($entityType) + ); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php index be9c2afe32f42cc0da7ebc591fc144cae8ad39e2..5144c31bfd1486ffb0f0be013cdc98d992e57900 100644 --- a/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php +++ b/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php @@ -12,6 +12,7 @@ use Magento\Framework\Phrase; use Magento\Setup\Module\I18n\Locale; /** + * @magentoAppIsolation enabled * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class FilterTest extends \PHPUnit_Framework_TestCase diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/Config/DataTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/Config/DataTest.php index 25187acef3950ead32082e338c9bdf06f402ece7..5a5a6fa0cf99c345c92dc28bed32d84d79d342af 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/App/Config/DataTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/App/Config/DataTest.php @@ -5,6 +5,9 @@ */ namespace Magento\Framework\App\Config; +use Magento\Framework\App\Config; +use Magento\Framework\App\ObjectManager; + class DataTest extends \PHPUnit_Framework_TestCase { const SAMPLE_CONFIG_PATH = 'web/unsecure/base_url'; @@ -45,6 +48,8 @@ class DataTest extends \PHPUnit_Framework_TestCase \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\App\CacheInterface::class) ->clean([\Magento\Framework\App\Config::CACHE_TAG]); \Magento\TestFramework\Helper\Bootstrap::getInstance()->reinitialize(); + $appConfig = ObjectManager::getInstance()->get(Config::class); + $appConfig->clean(); } protected function setUp() diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/Config/InitialTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/Config/InitialTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a98704a130b3bb74c2fc14df9d7b2d4efa0205f8 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/App/Config/InitialTest.php @@ -0,0 +1,55 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config; + +use Magento\TestFramework\Helper\CacheCleaner; +use Magento\TestFramework\ObjectManager; +use Magento\TestFramework\Helper\Bootstrap; +use Magento\Framework\App\Config\Initial as Config; + +class InitialTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ObjectManager + */ + private $objectManager; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + } + + public function testGetMetadata() + { + CacheCleaner::cleanAll(); + $this->assertEquals( + $this->objectManager->create(Config::class)->getMetadata(), + $this->objectManager->create(Config::class)->getMetadata() + ); + } + + /** + * @param string $scope + * @dataProvider getDataDataProvider + */ + public function testGetData($scope) + { + CacheCleaner::cleanAll(); + $this->assertEquals( + $this->objectManager->create(Config::class)->getData($scope), + $this->objectManager->create(Config::class)->getData($scope) + ); + } + + public function getDataDataProvider() + { + return [ + ['default'], + ['stores|default'], + ['websites|default'] + ]; + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/ObjectManager/ConfigLoaderTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/ObjectManager/ConfigLoaderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..30e9c09e9b4c5b834a4e071ed3d74be1c6d27029 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/App/ObjectManager/ConfigLoaderTest.php @@ -0,0 +1,33 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\ObjectManager; + +use Magento\TestFramework\Helper\CacheCleaner; + +class ConfigLoaderTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\App\ObjectManager\ConfigLoader + */ + private $object; + + protected function setUp() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->object = $objectManager->create( + \Magento\Framework\App\ObjectManager\ConfigLoader::class + ); + } + + public function testLoad() + { + CacheCleaner::cleanAll(); + $data = $this->object->load('global'); + $this->assertNotEmpty($data); + $cachedData = $this->object->load('global'); + $this->assertEquals($data, $cachedData); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/Route/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/Route/ConfigTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d0c4b562952ba0f0b36ba88088430eb87fdb40d7 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/App/Route/ConfigTest.php @@ -0,0 +1,45 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Route; + +use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\Helper\CacheCleaner; +use Magento\TestFramework\ObjectManager; + +class ConfigTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ObjectManager + */ + private $objectManager; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + } + + /** + * @param string $route + * @param string $scope + * @dataProvider getRouteFrontNameDataProvider + */ + public function testGetRouteFrontName($route, $scope) + { + CacheCleaner::cleanAll(); + $this->assertEquals( + $this->objectManager->create(Config::class)->getRouteFrontName($route, $scope), + $this->objectManager->create(Config::class)->getRouteFrontName($route, $scope) + ); + } + + public function getRouteFrontNameDataProvider() + { + return [ + ['adminhtml', 'adminhtml'], + ['catalog', 'frontend'], + ]; + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/Interception/AbstractPlugin.php b/dev/tests/integration/testsuite/Magento/Framework/Interception/AbstractPlugin.php index 5c0406ec372a5b0055bca2ef1171ea0d7841282f..43b962851c3bfb68fe9aa0e0a20711266f50aebc 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Interception/AbstractPlugin.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Interception/AbstractPlugin.php @@ -71,6 +71,7 @@ abstract class AbstractPlugin extends \PHPUnit_Framework_TestCase $definitions ); $interceptionDefinitions = new Definition\Runtime(); + $json = new \Magento\Framework\Serialize\Serializer\Json(); $sharedInstances = [ \Magento\Framework\Config\CacheInterface::class => $cache, \Magento\Framework\Config\ScopeInterface::class => $configScope, @@ -79,7 +80,8 @@ abstract class AbstractPlugin extends \PHPUnit_Framework_TestCase \Magento\Framework\ObjectManager\ConfigInterface::class => $config, \Magento\Framework\Interception\ObjectManager\ConfigInterface::class => $config, \Magento\Framework\ObjectManager\DefinitionInterface::class => $definitions, - \Magento\Framework\Interception\DefinitionInterface::class => $interceptionDefinitions + \Magento\Framework\Interception\DefinitionInterface::class => $interceptionDefinitions, + \Magento\Framework\Serialize\SerializerInterface::class => $json, ]; $this->_objectManager = new \Magento\Framework\ObjectManager\ObjectManager( $factory, diff --git a/dev/tests/integration/testsuite/Magento/Framework/Reflection/MethodsMapTest.php b/dev/tests/integration/testsuite/Magento/Framework/Reflection/MethodsMapTest.php new file mode 100644 index 0000000000000000000000000000000000000000..992b6a59382e7c3b5e67e6f8e3b6df6dfbaad2ab --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/Reflection/MethodsMapTest.php @@ -0,0 +1,48 @@ +<?php +/** + * Test case for \Magento\Framework\Profiler + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Reflection; + +use Magento\TestFramework\Helper\CacheCleaner; + +class MethodsMapTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Framework\Reflection\MethodsMap */ + private $object; + + protected function setUp() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->object = $objectManager->create( + \Magento\Framework\Reflection\MethodsMap::class + ); + } + + public function testGetMethodsMap() + { + CacheCleaner::cleanAll(); + $data = $this->object->getMethodsMap(\Magento\Framework\Reflection\MethodsMap::class); + $this->assertArrayHasKey('getMethodsMap', $data); + $cachedData = $this->object->getMethodsMap(\Magento\Framework\Reflection\MethodsMap::class); + $this->assertEquals($data, $cachedData); + } + + public function testGetMethodParams() + { + CacheCleaner::cleanAll(); + $data = $this->object->getMethodParams( + \Magento\Framework\Reflection\MethodsMap::class, + 'getMethodParams' + ); + $this->assertCount(2, $data); + $cachedData = $this->object->getMethodParams( + \Magento\Framework\Reflection\MethodsMap::class, + 'getMethodParams' + ); + $this->assertEquals($data, $cachedData); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/filterable_attribute_rollback.php b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/filterable_attribute_rollback.php index 9498a4251be1274d6e92313a32c90825398ac053..214f2b1dda5de0ee5c0be976664ef76730f6e189 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/filterable_attribute_rollback.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/filterable_attribute_rollback.php @@ -3,7 +3,6 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - /* Create attribute */ /** @var $installer \Magento\Catalog\Setup\CategorySetup */ $installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( diff --git a/dev/tests/integration/testsuite/Magento/Framework/TranslateCachingTest.php b/dev/tests/integration/testsuite/Magento/Framework/TranslateCachingTest.php index fbbc2ffc7bd1bdeee03e9f612e6bc2a3ee6fc3a2..e2b1982ba534c9c6ac84e18fc25f50ec4c6cd661 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/TranslateCachingTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/TranslateCachingTest.php @@ -6,8 +6,12 @@ namespace Magento\Framework; use Magento\TestFramework\Helper\Bootstrap; -use Magento\Framework\Phrase; +/** + * Class TranslateCachingTest + * @package Magento\Framework + * @magentoAppIsolation enabled + */ class TranslateCachingTest extends \PHPUnit_Framework_TestCase { /** diff --git a/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php b/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php index 2af602ff91850720845b73f04cd74b6c610714a0..93043a5deb12ae36c324ee56208124b1d5bccfd9 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/TranslateTest.php @@ -6,13 +6,18 @@ namespace Magento\Framework; use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\Helper\CacheCleaner; /** + * @magentoAppIsolation enabled * @magentoCache all disabled * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class TranslateTest extends \PHPUnit_Framework_TestCase { + /** @var \Magento\Framework\Translate */ + private $translate; + protected function setUp() { /** @var \Magento\Framework\View\FileSystem $viewFileSystem */ @@ -36,6 +41,7 @@ class TranslateTest extends \PHPUnit_Framework_TestCase $viewFileSystem->expects($this->any())->method('getDesignTheme')->will($this->returnValue($theme)); + /** @var \Magento\TestFramework\ObjectManager $objectManager */ $objectManager = Bootstrap::getObjectManager(); $objectManager->addSharedInstance($viewFileSystem, \Magento\Framework\View\FileSystem::class); @@ -71,19 +77,31 @@ class TranslateTest extends \PHPUnit_Framework_TestCase $objectManager->addSharedInstance($designModel, \Magento\Theme\Model\View\Design\Proxy::class); - $model = $objectManager->create(\Magento\Framework\Translate::class); - $objectManager->addSharedInstance($model, \Magento\Framework\Translate::class); + $this->translate = $objectManager->create(\Magento\Framework\Translate::class); + $objectManager->addSharedInstance($this->translate, \Magento\Framework\Translate::class); $objectManager->removeSharedInstance(\Magento\Framework\Phrase\Renderer\Composite::class); $objectManager->removeSharedInstance(\Magento\Framework\Phrase\Renderer\Translate::class); - \Magento\Framework\Phrase::setRenderer($objectManager->get(\Magento\Framework\Phrase\RendererInterface::class)); - $model->loadData(\Magento\Framework\App\Area::AREA_FRONTEND); + \Magento\Framework\Phrase::setRenderer( + $objectManager->get(\Magento\Framework\Phrase\RendererInterface::class) + ); + } + + public function testLoadData() + { + $data = $this->translate->loadData(null, true)->getData(); + CacheCleaner::cleanAll(); + $this->translate->loadData()->getData(); + $dataCached = $this->translate->loadData()->getData(); + $this->assertEquals($data, $dataCached); } /** + * @magentoCache all disabled * @dataProvider translateDataProvider */ public function testTranslate($inputText, $expectedTranslation) { + $this->translate->loadData(\Magento\Framework\App\Area::AREA_FRONTEND); $actualTranslation = new \Magento\Framework\Phrase($inputText); $this->assertEquals($expectedTranslation, $actualTranslation); } diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/Element/UiComponent/Config/Provider/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Framework/View/Element/UiComponent/Config/Provider/TemplateTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d2e5ab7215ff00fa76428d027d8289f7bb2dc3bb --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/Element/UiComponent/Config/Provider/TemplateTest.php @@ -0,0 +1,79 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\View\Element\UiComponent\Config\Provider; + +use \Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\Helper\CacheCleaner; + +/** + * @magentoComponentsDir Magento/Framework/View/_files/UiComponent/theme + * @magentoAppIsolation enabled + * @magentoDbIsolation enabled + */ +class TemplateTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\ObjectManagerInterface + */ + private $objectManager; + + /** + * @var \Magento\Framework\View\Element\UiComponent\Config\Provider\Template + */ + private $model; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + $this->registerThemes(); + $this->objectManager->addSharedInstance( + $this->objectManager->create( + \Magento\Framework\App\Arguments\ValidationState::class, + ['appMode' => 'default'] + ), + \Magento\Framework\App\Arguments\ValidationState::class + ); + $this->model = $this->objectManager->create( + \Magento\Framework\View\Element\UiComponent\Config\Provider\Template::class + ); + } + + public function testGetTemplate() + { + $expected = file_get_contents(__DIR__ . '/../../../../_files/UiComponent/expected/config.xml'); + + \Magento\TestFramework\Helper\Bootstrap::getInstance()->loadArea('adminhtml'); + $this->objectManager->get(\Magento\Framework\View\DesignInterface::class) + ->setDesignTheme('FrameworkViewUiComponent/default'); + CacheCleaner::cleanAll(); + + $resultOne = $this->model->getTemplate('test.xml'); + $resultTwo = $this->model->getTemplate('test.xml'); + + $this->assertXmlStringEqualsXmlString($expected, $resultOne); + $this->assertXmlStringEqualsXmlString($expected, $resultTwo); + } + + /** + * Register themes in the fixture folder + */ + protected function registerThemes() + { + /** @var \Magento\Theme\Model\Theme\Registration $registration */ + $registration = $this->objectManager->get( + \Magento\Theme\Model\Theme\Registration::class + ); + $registration->register(); + } + + protected function tearDown() + { + $this->objectManager->removeSharedInstance( + \Magento\Framework\App\Arguments\ValidationState::class + ); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/expected/config.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/expected/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..467afb2004cbe9d85b92ef8aba0778abec26a420 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/expected/config.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> + <argument name="data" xsi:type="array" type="array"> + <item name="buttons" xsi:type="array"> + <item name="save" xsi:type="string">Magento\Catalog\Block\Adminhtml\Product\Edit\Button\CreateCategory</item> + </item> + <item name="js_config" xsi:type="array"> + <item name="provider" xsi:type="string">new_category_form.new_category_form_data_source</item> + </item> + </argument> +</form> diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Catalog/ui_component/test.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Catalog/ui_component/test.xml new file mode 100644 index 0000000000000000000000000000000000000000..e0bd296bfda2b1d9096b115e2176b2df17059648 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Catalog/ui_component/test.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> + <argument name="data" xsi:type="array"> + <item name="js_config" xsi:type="array"> + <item name="provider" xsi:type="string">new_category_form.new_category_form_data_source</item> + </item> + </argument> +</form> diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Customer/ui_component/test.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Customer/ui_component/test.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1e0d46aee53e82eba40994f545231974c2b3523 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/Magento_Customer/ui_component/test.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> + <argument name="data" xsi:type="array"> + <item name="buttons" xsi:type="array"> + <item name="save" xsi:type="string">Magento\Catalog\Block\Adminhtml\Product\Edit\Button\CreateCategory</item> + </item> + </argument> +</form> diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/registration.php b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/registration.php new file mode 100644 index 0000000000000000000000000000000000000000..42145b38953bdf25371d3a8eaf83b9889c7e27d1 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/registration.php @@ -0,0 +1,11 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +\Magento\Framework\Component\ComponentRegistrar::register( + \Magento\Framework\Component\ComponentRegistrar::THEME, + 'adminhtml/FrameworkViewUiComponent/default', + __DIR__ +); diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/theme.xml b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/theme.xml new file mode 100644 index 0000000000000000000000000000000000000000..96de1f7bebee0d46e22e984e97ae61983e6cd5ca --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/UiComponent/theme/theme.xml @@ -0,0 +1,9 @@ +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Config/etc/theme.xsd"> + <title>Test theme</title> +</theme> diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php index 13d7636b0cbac8721a8c3e0757137f86f1533bd0..fe12480e25879014edd75f47b90876c4e53fddeb 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php @@ -5,6 +5,11 @@ */ namespace Magento\Sales\Model\Order; +/** + * Class ShipmentTest + * @magentoAppIsolation enabled + * @package Magento\Sales\Model\Order + */ class ShipmentTest extends \PHPUnit_Framework_TestCase { /** diff --git a/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php b/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php index cdf0a38d249150a9454d580353c938b26637103e..155431ba67f1e2cba89b1cb973e17776aed666ef 100644 --- a/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php +++ b/dev/tests/integration/testsuite/Magento/Store/Controller/Store/SwitchActionTest.php @@ -21,7 +21,7 @@ class SwitchActionTest extends \Magento\TestFramework\TestCase\AbstractControlle */ public function testExecuteWithCustomDefaultStore() { - + \Magento\TestFramework\Helper\Bootstrap::getInstance()->reinitialize(); $defaultStoreCode = 'default'; $modifiedDefaultCode = 'modified_default_code'; $this->changeStoreCode($defaultStoreCode, $modifiedDefaultCode); diff --git a/dev/tests/integration/testsuite/Magento/Store/Model/StoreResolverTest.php b/dev/tests/integration/testsuite/Magento/Store/Model/StoreResolverTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b2aa803bc010599cc6a02554b9c23b36ad47b8f2 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Store/Model/StoreResolverTest.php @@ -0,0 +1,37 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Store\Model; + +use Magento\TestFramework\Helper\CacheCleaner; + +class StoreResolverTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\TestFramework\ObjectManager */ + private $objectManager; + + protected function setUp() + { + $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->block = $this->objectManager->get(\Magento\Directory\Block\Data::class); + } + + public function testGetStoreData() + { + $methodGetStoresData = new \ReflectionMethod(\Magento\Store\Model\StoreResolver::class, 'getStoresData'); + $methodGetStoresData->setAccessible(true); + $methodReadStoresData = new \ReflectionMethod(\Magento\Store\Model\StoreResolver::class, 'readStoresData'); + $methodReadStoresData->setAccessible(true); + + $storeResolver = $this->objectManager->get(\Magento\Store\Model\StoreResolver::class); + + $storesDataRead = $methodReadStoresData->invoke($storeResolver); + CacheCleaner::cleanAll(); + $storesData = $methodGetStoresData->invoke($storeResolver); + $storesDataCached = $methodGetStoresData->invoke($storeResolver); + $this->assertEquals($storesDataRead, $storesData); + $this->assertEquals($storesDataRead, $storesDataCached); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/scope.config.fixture.php b/dev/tests/integration/testsuite/Magento/Store/_files/scope.config.fixture.php new file mode 100644 index 0000000000000000000000000000000000000000..1bf8fa811183391f3450c185bee4f25579dfbf21 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Store/_files/scope.config.fixture.php @@ -0,0 +1,11 @@ +<?php +/** + * Fixture which retrieve dummy scopes + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +return [ + +]; diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php index b75c491b36a0e9c013707aec4155f7454eb5a8ba..91b30888194f44a007528ddc557784e58cab5fd6 100644 --- a/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php +++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php @@ -1,5 +1,7 @@ <?php /** + * Create fixture store + * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ @@ -26,9 +28,9 @@ if (!$store->load('fixture_second_store', 'code')->getId()) { 1 ); $store->save(); - - /* Refresh stores memory cache */ - \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( - \Magento\Store\Model\StoreManagerInterface::class - )->reinitStores(); } + +/* Refresh stores memory cache */ +\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( + \Magento\Store\Model\StoreManagerInterface::class +)->reinitStores(); diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/store.php b/dev/tests/integration/testsuite/Magento/Store/_files/store.php index 9bb761f0b6a136c5b01c50ba2c5a1942716db18e..35ade6fe3a4358c865196157e041d5cd465f6388 100644 --- a/dev/tests/integration/testsuite/Magento/Store/_files/store.php +++ b/dev/tests/integration/testsuite/Magento/Store/_files/store.php @@ -1,5 +1,7 @@ <?php /** + * Create fixture store with code test + * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ @@ -19,3 +21,6 @@ if (!$store->load('test', 'code')->getId()) { ); $store->save(); } +$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); +/* Refresh stores memory cache */ +$objectManager->get('Magento\Store\Model\StoreManagerInterface')->reinitStores(); diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/website.php b/dev/tests/integration/testsuite/Magento/Store/_files/website.php index 4e1f03fcadb58acea0d69fb9cb195437f9355030..dfe04879548ccbb88a7db58e762f8aab1e05b969 100644 --- a/dev/tests/integration/testsuite/Magento/Store/_files/website.php +++ b/dev/tests/integration/testsuite/Magento/Store/_files/website.php @@ -8,3 +8,7 @@ $website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Store\Model\Website::class); $website->setData(['code' => 'test', 'name' => 'Test Website', 'default_group_id' => '1', 'is_default' => '0']); $website->save(); + +$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); +/* Refresh stores memory cache */ +$objectManager->get('Magento\Store\Model\StoreManagerInterface')->reinitStores(); diff --git a/dev/tests/integration/testsuite/Magento/Theme/Model/DesignTest.php b/dev/tests/integration/testsuite/Magento/Theme/Model/DesignTest.php index 6cd9746daca3325eafcf730a462b9c0226db9ba0..f450f1b3d0cbe2309611ee673493bfdddfad9f5d 100644 --- a/dev/tests/integration/testsuite/Magento/Theme/Model/DesignTest.php +++ b/dev/tests/integration/testsuite/Magento/Theme/Model/DesignTest.php @@ -5,6 +5,9 @@ */ namespace Magento\Theme\Model; +use Magento\Backend\Block\Widget\Grid\Serializer; +use Magento\Framework\Serialize\SerializerInterface; + class DesignTest extends \PHPUnit_Framework_TestCase { /** @@ -121,7 +124,8 @@ class DesignTest extends \PHPUnit_Framework_TestCase )->load( $cacheId ); - $cachedDesign = unserialize($cachedDesign); + $serializer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(SerializerInterface::class); + $cachedDesign = $serializer->unserialize($cachedDesign); $this->assertInternalType('array', $cachedDesign); $this->assertArrayHasKey('design', $cachedDesign); @@ -139,7 +143,8 @@ class DesignTest extends \PHPUnit_Framework_TestCase )->load( $cacheId ); - $cachedDesign = unserialize($cachedDesign); + + $cachedDesign = $serializer->unserialize($cachedDesign); $this->assertTrue(is_array($cachedDesign)); $this->assertEquals($cachedDesign['design'], $design->getDesign()); diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php index 54f4a030992803ff60cdd9cdffacc5879056069b..8e820c1d22c10a6c055cbe45f950465ba40cfe1f 100644 --- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php +++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Edit/FormTest.php @@ -146,6 +146,7 @@ class FormTest extends \PHPUnit_Framework_TestCase * Test fields disabled status * @dataProvider fieldsStateDataProvider * @magentoAppIsolation enabled + * @magentoConfigFixture current_store general/single_store_mode/enabled 0 */ public function testReadonlyFields($urlRewrite, $fields) { diff --git a/dev/tests/integration/testsuite/Magento/User/Helper/DataTest.php b/dev/tests/integration/testsuite/Magento/User/Helper/DataTest.php index 4c0a81b41efd42f05c1fe5b83cbbb36ede2cedee..c197f3f86d22f1dbe4aa5d57051f945b5668045c 100644 --- a/dev/tests/integration/testsuite/Magento/User/Helper/DataTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Helper/DataTest.php @@ -42,7 +42,7 @@ class DataTest extends \PHPUnit_Framework_TestCase { /** @var $configModel \Magento\Backend\App\ConfigInterface */ $configModel = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( - \Magento\Backend\App\ConfigInterface::class + \Magento\Framework\App\Config\MutableScopeConfigInterface::class ); $this->assertEquals( 2, diff --git a/dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php b/dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php index 260f731aecf1ce30d60cbd5dee1c2fb0f20074d2..4f9082aa4eb2124072b3c9fe39ddd50a901b7bd1 100644 --- a/dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php +++ b/dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php @@ -5,12 +5,10 @@ */ namespace Magento\Sniffs\Translation; -use PHP_CodeSniffer_File; - /** * Make sure that constants are not used as the first argument of translation function. */ -class ConstantUsageSniff extends \Generic_Sniffs_Files_LineLengthSniff +class ConstantUsageSniff implements \PHP_CodeSniffer_Sniff { /** * Having previous line content allows to process multi-line declaration. @@ -20,24 +18,73 @@ class ConstantUsageSniff extends \Generic_Sniffs_Files_LineLengthSniff protected $previousLineContent = ''; /** - * {@inheritdoc} + * {@inheritDoc} + */ + public function register() + { + return [T_OPEN_TAG]; + + } + + /** + * Copied from \Generic_Sniffs_Files_LineLengthSniff, minor changes made + * + * {@inheritDoc} */ - protected function checkLineLength(\PHP_CodeSniffer_File $phpcsFile, $stackPtr, $lineContent) + public function process(\PHP_CodeSniffer_File $phpcsFile, $stackPtr) { - $previousLineRegexp = '~__\($|Phrase\($~'; - $currentLineRegexp = '~__\(.+\)|Phrase\(.+\)~'; + $tokens = $phpcsFile->getTokens(); + + // Make sure this is the first open tag + $previousOpenTag = $phpcsFile->findPrevious(T_OPEN_TAG, ($stackPtr - 1)); + if ($previousOpenTag !== false) { + return; + } + + $tokenCount = 0; + $currentLineContent = ''; + $currentLine = 1; + + for (; $tokenCount < $phpcsFile->numTokens; $tokenCount++) { + if ($tokens[$tokenCount]['line'] === $currentLine) { + $currentLineContent .= $tokens[$tokenCount]['content']; + } else { + $this->checkIfFirstArgumentConstant($phpcsFile, ($tokenCount - 1), $currentLineContent); + $currentLineContent = $tokens[$tokenCount]['content']; + $currentLine++; + } + } + + $this->checkIfFirstArgumentConstant($phpcsFile, ($tokenCount - 1), $currentLineContent); + } + + /** + * Checks if first argument of \Magento\Framework\Phrase or translation function is a constant + * + * @param \PHP_CodeSniffer_File $phpcsFile + * @param int $stackPtr + * @param string $lineContent + * @return void + */ + private function checkIfFirstArgumentConstant( + \PHP_CodeSniffer_File $phpcsFile, + $stackPtr, + $lineContent + ) { + $previousLineRegexp = '/(__|Phrase)\($/im'; + $currentLineRegexp = '/(__|Phrase)\(.+\)/'; $currentLineMatch = preg_match($currentLineRegexp, $lineContent) !== 0; $previousLineMatch = preg_match($previousLineRegexp, $this->previousLineContent) !== 0; $this->previousLineContent = $lineContent; $error = 'Constants are not allowed as the first argument of translation function, use string literal instead'; - $constantRegexp = '[^\'"]+::[A-Z_0-9]+.*'; + $constantRegexp = '[^\$\'"]+::[A-Z_0-9]+.*'; if ($currentLineMatch) { - $variableRegexp = "~__\({$constantRegexp}\)|Phrase\({$constantRegexp}\)~"; + $variableRegexp = "/(__|Phrase)\({$constantRegexp}\)/"; if (preg_match($variableRegexp, $lineContent) !== 0) { $phpcsFile->addError($error, $stackPtr, 'VariableTranslation'); } } else if ($previousLineMatch) { - $variableRegexp = "~^\s+{$constantRegexp}~"; + $variableRegexp = "/^{$constantRegexp}/"; if (preg_match($variableRegexp, $lineContent) !== 0) { $phpcsFile->addError($error, $stackPtr, 'VariableTranslation'); } diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php b/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php index d71c03eb0f85d01634f6f3a28c185c37e84bc1b2..a25b16c2277f3e7052840e9cf1fbbe2660cc4462 100644 --- a/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php +++ b/dev/tests/static/framework/Magento/TestFramework/Utility/ChangedFiles.php @@ -7,6 +7,7 @@ namespace Magento\TestFramework\Utility; use Magento\Framework\App\Utility\Files; +use Magento\TestFramework\Utility\File\RegexIteratorFactory; /** * A helper to gather various changed files @@ -15,6 +16,11 @@ use Magento\Framework\App\Utility\Files; */ class ChangedFiles { + /** + * File path with changed files content. + */ + const CHANGED_FILES_CONTENT_FILE = '/dev/tests/static/testsuite/Magento/Test/_files/changed_%s_files_content.json'; + /** * Returns array of PHP-files, that use or declare Magento application classes and Magento libs * @@ -23,7 +29,7 @@ class ChangedFiles */ public static function getPhpFiles($changedFilesList) { - $fileHelper = \Magento\Framework\App\Utility\Files::init(); + $fileUtilities = new File(Files::init(), new RegexIteratorFactory()); if (isset($_ENV['INCREMENTAL_BUILD'])) { $phpFiles = []; foreach (glob($changedFilesList) as $listFile) { @@ -36,29 +42,45 @@ class ChangedFiles } ); if (!empty($phpFiles)) { - $phpFiles = \Magento\Framework\App\Utility\Files::composeDataSets($phpFiles); - $phpFiles = array_intersect_key($phpFiles, $fileHelper->getPhpFiles( - Files::INCLUDE_APP_CODE - | Files::INCLUDE_PUB_CODE - | Files::INCLUDE_LIBS - | Files::INCLUDE_TEMPLATES - | Files::INCLUDE_TESTS - | Files::AS_DATA_SET - | Files::INCLUDE_NON_CLASSES - )); + $phpFiles = Files::composeDataSets($phpFiles); + $phpFiles = array_intersect_key($phpFiles, $fileUtilities->getPhpFiles()); } } else { - $phpFiles = $fileHelper->getPhpFiles( - Files::INCLUDE_APP_CODE - | Files::INCLUDE_PUB_CODE - | Files::INCLUDE_LIBS - | Files::INCLUDE_TEMPLATES - | Files::INCLUDE_TESTS - | Files::AS_DATA_SET - | Files::INCLUDE_NON_CLASSES - ); + $phpFiles = $fileUtilities->getPhpFiles(); } return $phpFiles; } + + /** + * Get changed content. + * + * @param string $fileName + * @return string + */ + public static function getChangedContent($fileName) + { + $data = []; + $extension = self::getFileExtension($fileName); + $fileName = ltrim(str_replace(BP, '', $fileName), DIRECTORY_SEPARATOR); + $changedFilesContentFile = BP . sprintf(self::CHANGED_FILES_CONTENT_FILE, $extension); + if (file_exists($changedFilesContentFile)) { + $changedContent = file_get_contents($changedFilesContentFile); + $data = json_decode($changedContent, true); + } + + return isset($data[$fileName]) ? $data[$fileName] : ''; + } + + /** + * Get file extension. + * + * @param string $fileName + * @return string + */ + public static function getFileExtension($fileName) + { + $fileInfo = pathinfo($fileName); + return isset($fileInfo['extension']) ? $fileInfo['extension'] : 'unknown'; + } } diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/File.php b/dev/tests/static/framework/Magento/TestFramework/Utility/File.php new file mode 100644 index 0000000000000000000000000000000000000000..7a8e02e5143a0808867a4b9c1d1d01b2da7b34f9 --- /dev/null +++ b/dev/tests/static/framework/Magento/TestFramework/Utility/File.php @@ -0,0 +1,80 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestFramework\Utility; + +use Magento\Framework\App\Utility\Files; +use Magento\TestFramework\Utility\File\RegexIteratorFactory; + +/** + * Get list of PHP files including files in setup application + */ +class File +{ + /** + * @var RegexIteratorFactory + */ + private $regexIteratorFactory; + + /** + * @var Files + */ + private $fileUtilities; + + /** + * Constructor + * + * @param Files $fileUtilities + * @param RegexIteratorFactory $regexIteratorFactory + */ + public function __construct( + Files $fileUtilities, + RegexIteratorFactory $regexIteratorFactory + ) { + $this->fileUtilities = $fileUtilities; + $this->regexIteratorFactory = $regexIteratorFactory; + } + + /** + * Get list of PHP files + * + * @return array + * @throws \Exception + */ + public function getPhpFiles() + { + $files = array_merge( + $this->fileUtilities->getPhpFiles( + Files::INCLUDE_APP_CODE + | Files::INCLUDE_PUB_CODE + | Files::INCLUDE_LIBS + | Files::INCLUDE_TEMPLATES + | Files::INCLUDE_TESTS + | Files::INCLUDE_NON_CLASSES + ), + $this->getSetupPhpFiles() + ); + return Files::composeDataSets($files); + } + + /** + * Get list of PHP files in setup application + * + * @param int $flags + * @return array + */ + private function getSetupPhpFiles() + { + $files = []; + $regexIterator = $this->regexIteratorFactory->create( + BP . '/setup', + '/.*php^/' + ); + foreach ($regexIterator as $file) { + $files = array_merge($files, [$file]); + } + return $files; + } +} diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/File/RegexIteratorFactory.php b/dev/tests/static/framework/Magento/TestFramework/Utility/File/RegexIteratorFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..d2e5768414f06f13138ba83ebcf34ce7535783e6 --- /dev/null +++ b/dev/tests/static/framework/Magento/TestFramework/Utility/File/RegexIteratorFactory.php @@ -0,0 +1,26 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestFramework\Utility\File; + +/** + * Factory for \RegexIterator + */ +class RegexIteratorFactory +{ + /** + * Create instance of \RegexIterator + * + * @param string $directoryPath + * @param string $regexp + * @return \RegexIterator + */ + public function create($directoryPath, $regexp) + { + $directory = new \RecursiveDirectoryIterator($directoryPath); + $recursiveIterator = new \RecursiveIteratorIterator($directory); + return new \RegexIterator($recursiveIterator, $regexp, \RegexIterator::GET_MATCH); + } +} diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/FunctionDetector.php b/dev/tests/static/framework/Magento/TestFramework/Utility/FunctionDetector.php new file mode 100644 index 0000000000000000000000000000000000000000..69162d3dfba2e6d67acb9c9bad48dbb03fc3c41a --- /dev/null +++ b/dev/tests/static/framework/Magento/TestFramework/Utility/FunctionDetector.php @@ -0,0 +1,113 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestFramework\Utility; + +/** + * Check if one or more functions are used in the file + */ +class FunctionDetector +{ + /** + * Detect functions in given file + * + * return result in this format: + * [ + * line_number => [ + * function_name_1, + * function_name_2, + * function_name_3, + * ], + * line_number => [ + * function_name_1, + * function_name_2, + * function_name_3, + * ], + * ] + * + * @param string $filePath + * @param string[] $functions + * @return array + */ + public function detect($filePath, $functions) + { + $result = []; + $regexp = $this->composeRegexp($functions); + + if (!$regexp) { + return $result; + } + + $fileContent = \Magento\TestFramework\Utility\ChangedFiles::getChangedContent($filePath); + $file = file($filePath); + + return $fileContent + ? $this->grepChangedContent($file, $regexp, $functions, $fileContent) + : $this->grepFile($file, $regexp); + } + + /** + * Grep only changed content. + * + * @param array $file + * @param string $regexp + * @param string[] $functions + * @param string $fileContent + * @return array + */ + public function grepChangedContent(array $file, $regexp, $functions, $fileContent) + { + $result = []; + $matches = preg_grep($regexp, explode("\n", $fileContent)); + if (!empty($matches)) { + foreach ($matches as $line) { + $actualFunctions = []; + foreach ($functions as $function) { + if (false !== strpos($line, $function)) { + $actualFunctions[] = $function; + } + } + $result[array_search($line . "\n", $file) + 1] = $actualFunctions; + } + } + + return $result; + } + + /** + * Grep File. + * + * @param array $file + * @param string $regexp + * @return array + */ + public function grepFile(array $file, $regexp) + { + $result = []; + array_unshift($file, ''); + $lines = preg_grep($regexp, $file); + foreach ($lines as $lineNumber => $line) { + if (preg_match_all($regexp, $line, $matches)) { + $result[$lineNumber] = $matches[1]; + } + } + + return $result; + } + + /** + * Compose regular expression + * + * @param array $functions + * @return string + */ + private function composeRegexp(array $functions) + { + if (empty($functions)) { + return ''; + } + return '/(?<!function |->|::)\b(' . join('|', $functions) . ')\s*\(/i'; + } +} diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/ConstantUsageSniffTest.php b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/ConstantUsageSniffTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a64d47054ede9bc1f695514aa8f3ef95fc1e8eeb --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/ConstantUsageSniffTest.php @@ -0,0 +1,96 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sniffs\Translation; + +class ConstantUsageSniffTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \PHP_CodeSniffer_File|\PHPUnit_Framework_MockObject_MockObject + */ + private $fileMock; + + /** + * @var ConstantUsageSniff + */ + private $constantUsageSniff; + + protected function setUp() + { + $this->fileMock = $this->getMock(\PHP_CodeSniffer_File::class, [], [], '', false); + $this->constantUsageSniff = new ConstantUsageSniff(); + } + + /** + * @param string $file + * @param int $numIncorrectUsages + * @dataProvider processDataProvider + */ + public function testProcessIncorrectArguments($file, $numIncorrectUsages) + { + $stackPtr = 10; + $fileContent = file_get_contents(__DIR__ . '/_files/' . $file); + $tokens = $this->tokenizeString($fileContent); + $this->fileMock->expects($this->once()) + ->method('findPrevious') + ->with( + T_OPEN_TAG, + $stackPtr - 1 + ) + ->willReturn(false); + $this->fileMock->expects($this->once()) + ->method('getTokens') + ->willReturn($tokens); + $this->fileMock->numTokens = count($tokens); + $this->fileMock->expects($this->exactly($numIncorrectUsages)) + ->method('addError') + ->with( + 'Constants are not allowed as the first argument of translation function, use string literal instead', + $this->anything(), + 'VariableTranslation' + ); + $this->constantUsageSniff->process($this->fileMock, $stackPtr); + } + + /** + * Get tokens for a string + * + * @param string $fileContent + * @return array + */ + private function tokenizeString($fileContent) + { + $lineNumber = 1; + $tokens = token_get_all($fileContent); + $snifferTokens = []; + for ($i = 0; $i < count($tokens); $i++) { + $content = is_array($tokens[$i]) ? $tokens[$i][1] : $tokens[$i]; + $snifferTokens[$i]['line'] = $lineNumber; + $snifferTokens[$i]['content'] = $content; + $trimmedContent = trim($content, ' '); + if ($trimmedContent == PHP_EOL || $trimmedContent == PHP_EOL . PHP_EOL) { + $lineNumber++; + } + } + return $snifferTokens; + } + + /** + * @return array + */ + public function processDataProvider() + { + return [ + [ + 'incorrect_arguments.txt', + 9 + ], + [ + 'correct_arguments.txt', + 0 + ] + ]; + } +} diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/correct_arguments.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/correct_arguments.txt new file mode 100644 index 0000000000000000000000000000000000000000..536029811fd87972da11ca531cd6787fa59921a4 --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/correct_arguments.txt @@ -0,0 +1,29 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +__($variable) + +__($variable[Class::CONSTANT]) + +__($variable[\Namespace\Class::CONSTANT]) + +__($variable['value']) + +__( + $variable +) + +Phrase($variable) + +Phrase($variable[Class::CONSTANT]) + +Phrase($variable[\Namespace\Class::CONSTANT]) + +\Magento\Framework\Phrase($variable['value']) + +\Magento\Framework\Phrase( + $variable[Class::CONSTANT] +) diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/incorrect_arguments.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/incorrect_arguments.txt new file mode 100644 index 0000000000000000000000000000000000000000..6112ce567ce14cc200e4bb648e828fc51d0dbc77 --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/Sniffs/Translation/_files/incorrect_arguments.txt @@ -0,0 +1,27 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +__(Class::CONSTANT) + +__(self::CONSTANT) + +__(\Namespace\Class::CONSTANT) + +__( + Class::CONSTANT +) + +Phrase(Class::CONSTANT) + +Phrase(self::CONSTANT) + +Phrase(\Namespace\Class::CONSTANT) + +\Magento\Framework\Phrase(Class::CONSTANT) + +\Magento\Framework\Phrase( + Class::CONSTANT +) diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FileTest.php b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FileTest.php new file mode 100644 index 0000000000000000000000000000000000000000..be8b246a9330495fd5b859a4feb2552772492e21 --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FileTest.php @@ -0,0 +1,83 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestFramework\Utility; + +use Magento\Framework\App\Utility\Files; +use Magento\TestFramework\Utility\File\RegexIteratorFactory; +use Magento\TestFramework\Utility\File; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; + +class FileTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Files|PHPUnit_Framework_MockObject_MockObject + */ + private $fileUtilitiesMock; + + /** + * @var RegexIteratorFactory|PHPUnit_Framework_MockObject_MockObject + */ + private $regexIteratorFactoryMock; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var File + */ + private $file; + + protected function setUp() + { + $this->objectManager = new ObjectManager($this); + $this->fileUtilitiesMock = $this->getMock(Files::class, [], [], '', false); + $this->regexIteratorFactoryMock = $this->getMock(RegexIteratorFactory::class, [], [], '', false); + $this->file = $this->objectManager->getObject( + File::class, + [ + 'fileUtilities' => $this->fileUtilitiesMock, + 'regexIteratorFactory' => $this->regexIteratorFactoryMock + ] + ); + } + + public function testGetPhpFiles() + { + $appFiles = [ + 'file1', + 'file2' + ]; + $setupFiles = [ + 'file3' + ]; + $expected = [ + 'file1' => ['file1'], + 'file2' => ['file2'], + 'file3' => ['file3'] + ]; + $iteratorMock = $this->getMock(\IteratorAggregate::class, [], [], '', false); + $iteratorMock->expects($this->any()) + ->method('getIterator') + ->willReturn(new \ArrayIterator($setupFiles)); + $this->regexIteratorFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($iteratorMock); + $this->fileUtilitiesMock->expects($this->once()) + ->method('getPhpFiles') + ->with( + Files::INCLUDE_APP_CODE + | Files::INCLUDE_PUB_CODE + | Files::INCLUDE_LIBS + | Files::INCLUDE_TEMPLATES + | Files::INCLUDE_TESTS + | Files::INCLUDE_NON_CLASSES + ) + ->willReturn($appFiles); + $this->assertEquals($expected, $this->file->getPhpFiles()); + } +} diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FunctionDetectorTest.php b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FunctionDetectorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a356aaa3cc83b48e4bf310b31d2556ec4c63bc12 --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FunctionDetectorTest.php @@ -0,0 +1,22 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TestFramework\Utility; + +class FunctionDetectorTest extends \PHPUnit_Framework_TestCase +{ + public function testDetectFunctions() + { + $fixturePath = __DIR__ . '/_files/test.txt'; + $expectedResults = [ + 1 => ['strtoupper', 'strtolower'], + 3 => ['foo'], + 4 => ['foo'], + ]; + $functionDetector = new FunctionDetector(); + $lines = $functionDetector->detect($fixturePath, ['foo', 'strtoupper', 'test', 'strtolower']); + $this->assertEquals($expectedResults, $lines); + } +} diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/test.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/test.txt new file mode 100644 index 0000000000000000000000000000000000000000..c2feb8284b2373bc94f9c16f7b5383fbc60f711a --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/test.txt @@ -0,0 +1,9 @@ +strtoupper(strtolower($foo . $bar)) +function foo($merchantMd5, $merchantApiLogin) +$this->generateHash(foo($bar), $foo) +foo( + 'bar' +) +Foo::bar($foo, $this->getData('bar')) +$this->foo('bar') +Foo::foo() diff --git a/dev/tests/static/get_github_changes.php b/dev/tests/static/get_github_changes.php index f332208cd17d0861dd1b28bd7096a0b3fe0066a5..16a4f7d8e090de40c4881f1e3a60015bb377396b 100644 --- a/dev/tests/static/get_github_changes.php +++ b/dev/tests/static/get_github_changes.php @@ -34,6 +34,8 @@ if (!validateInput($options, $requiredOptions)) { $fileExtensions = explode(',', isset($options['file-extensions']) ? $options['file-extensions'] : 'php'); +include_once __DIR__ . '/framework/autoload.php'; + $mainline = 'mainline_' . (string)rand(0, 9999); $repo = getRepo($options, $mainline); $branches = $repo->getBranches('--remotes'); @@ -41,8 +43,27 @@ generateBranchesList($options['output-file'], $branches, $options['branch']); $changes = retrieveChangesAcrossForks($mainline, $repo, $options['branch']); $changedFiles = getChangedFiles($changes, $fileExtensions); generateChangedFilesList($options['output-file'], $changedFiles); +saveChangedFileContent($repo); cleanup($repo, $mainline); +/** + * Save changed file content. + * + * @param GitRepo $repo + * @return void + */ +function saveChangedFileContent(GitRepo $repo) +{ + $changedFilesContentFileName = BP . Magento\TestFramework\Utility\ChangedFiles::CHANGED_FILES_CONTENT_FILE; + foreach ($repo->getChangedContentFiles() as $key => $changedContentFile) { + $filePath = sprintf($changedFilesContentFileName, $key); + $oldContent = file_exists($filePath) ? file_get_contents($filePath) : '{}'; + $oldData = json_decode($oldContent, true); + $data = array_merge($oldData, $changedContentFile); + file_put_contents($filePath, json_encode($data)); + } +} + /** * Generates a file containing changed files * @@ -170,6 +191,18 @@ class GitRepo */ private $remoteList = []; + /** + * Array of changed content files. + * + * Example: + * 'extension' => + * 'path_to_file/filename' => 'Content that was edited', + * 'path_to_file/filename2' => 'Content that was edited', + * + * @var array + */ + private $changedContentFiles = []; + /** * @param string $workTree absolute path to git project */ @@ -285,6 +318,9 @@ class GitRepo 'diff HEAD %s/%s -- %s', $remoteAlias, $remoteBranch, $this->workTree . '/' . $fileName) ); if ($result) { + if (!(isset($this->changedContentFiles[$fileName]))) { + $this->setChangedContentFile($result, $fileName); + } $filteredChanges[] = $fileName; } } @@ -295,6 +331,38 @@ class GitRepo return $filteredChanges; } + /** + * Set changed content for file. + * + * @param array $content + * @param string $fileName + * @return void + */ + private function setChangedContentFile(array $content, $fileName) + { + $changedContent = ''; + $extension = Magento\TestFramework\Utility\ChangedFiles::getFileExtension($fileName); + + foreach ($content as $item) { + if (strpos($item, '---') !== 0 && strpos($item, '-') === 0 && $line = ltrim($item, '-')) { + $changedContent .= $line . "\n"; + } + } + if ($changedContent !== '') { + $this->changedContentFiles[$extension][$fileName] = $changedContent; + } + } + + /** + * Get changed content files collection. + * + * @return array + */ + public function getChangedContentFiles() + { + return $this->changedContentFiles; + } + /** * Makes call ro git cli * diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/ApiAnnotationTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/ApiAnnotationTest.php deleted file mode 100644 index a1e7c25e3d6008cff744a090c0c01a810efad8a4..0000000000000000000000000000000000000000 --- a/dev/tests/static/testsuite/Magento/Test/Integrity/ApiAnnotationTest.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php -/** - * Scan source code for unmarked API interfaces - * - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Test\Integrity; - -use Magento\Framework\App\Utility\Files; -use Magento\Framework\Component\ComponentRegistrar; - -class ApiAnnotationTest extends \PHPUnit_Framework_TestCase -{ - /** - * API annotation pattern - */ - private $apiAnnotation = '~/\*{2}(.*@api.*)\*/\s+(?=interface)~s'; - - public function testApiAnnotations() - { - $modulePaths = array_map(function ($path) { - return $path . DIRECTORY_SEPARATOR . 'Api'; - }, (new ComponentRegistrar())->getPaths(ComponentRegistrar::MODULE)); - - foreach (Files::init()->getFiles($modulePaths, '*.php', true) as $file) { - $fileContent = file_get_contents($file); - if (!preg_match($this->apiAnnotation, $fileContent)) { - $result[] = $file; - } - } - if (!empty($result)) { - $this->fail(sprintf( - 'Found %s file(s) without @api annotations under Api namespace: %s', - count($result), - PHP_EOL . implode(PHP_EOL, $result) - )); - } - } -} diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/ModuleDBChangeTest.php b/dev/tests/static/testsuite/Magento/Test/Legacy/ModuleDBChangeTest.php index 2f3d312fb41ffba1287bafd324a64ac751316d5c..5c8c2fdf0501699768457b3b888c217a1301f6c3 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/ModuleDBChangeTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/ModuleDBChangeTest.php @@ -15,12 +15,7 @@ class ModuleDBChangeTest extends \PHPUnit_Framework_TestCase /** * @var string */ - private static $branchesFilesPattern = __DIR__ . '/../_files/branches*'; - - /** - * @var string - */ - private static $changedFilesPattern = __DIR__ . '/../_files/changed_files*'; + protected static $changedFilesPattern = __DIR__ . '/../_files/changed_files*'; /** * @var string @@ -37,24 +32,6 @@ class ModuleDBChangeTest extends \PHPUnit_Framework_TestCase */ public static function setUpBeforeClass() { - foreach (glob(self::$branchesFilesPattern) as $branchesFile) { - //get the current branchname from the first line - $branchName = trim(file($branchesFile)[0]); - if ($branchName === 'develop') { - self::$actualBranch = true; - } else { - //get current minor branch name - preg_match('|^(\d+\.\d+)|', $branchName, $minorBranch); - $branchName = $minorBranch[0]; - - //get all version branches - preg_match_all('|^(\d+\.\d+)|m', file_get_contents($branchesFile), $matches); - - //check is this a latest release branch - self::$actualBranch = ($branchName == max($matches[0])); - } - } - foreach (glob(self::$changedFilesPattern) as $changedFile) { self::$changedFileList .= file_get_contents($changedFile) . PHP_EOL; } diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/RestrictedCodeTest.php b/dev/tests/static/testsuite/Magento/Test/Legacy/RestrictedCodeTest.php index 0c4c6eba49efa33c997b2dc62c70bd49434540e8..68c2d166448ab6fb4c39354b92ddb9f803d500f1 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/RestrictedCodeTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/RestrictedCodeTest.php @@ -3,14 +3,13 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - -/** - * Tests to find usage of restricted code - */ namespace Magento\Test\Legacy; use Magento\Framework\Component\ComponentRegistrar; +/** + * Tests to find usage of restricted code + */ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase { /**@#+ @@ -18,17 +17,29 @@ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase * * @var array */ - protected static $_classes = []; + private static $_classes = []; /**#@-*/ /** * List of fixtures that contain restricted classes and should not be tested + * * @var array */ - protected static $_fixtureFiles = []; + private static $_fixtureFiles = []; + + /** + * @var ComponentRegistrar + */ + private $componentRegistrar; + + protected function setUp() + { + $this->componentRegistrar = new ComponentRegistrar(); + } /** * Read fixtures into memory as arrays + * * @return void */ public static function setUpBeforeClass() @@ -69,6 +80,7 @@ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase /** * Test that restricted entities are not used in PHP files + * * @return void */ public function testPhpFiles() @@ -97,15 +109,13 @@ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase protected function _testRestrictedClasses($file) { $content = file_get_contents($file); - $componentRegistrar = new ComponentRegistrar(); foreach (self::$_classes as $restrictedClass => $classRules) { foreach ($classRules['exclude'] as $skippedPathInfo) { - $skippedPath = $componentRegistrar->getPath($skippedPathInfo['type'], $skippedPathInfo['name']) - . '/' . $skippedPathInfo['path']; - if (strpos($file, $skippedPath) === 0) { + if (strpos($file, $this->getExcludedFilePath($skippedPathInfo)) === 0) { continue 2; } } + $this->assertFalse( \Magento\TestFramework\Utility\CodeCheck::isClassUsed($restrictedClass, $content), sprintf( @@ -117,4 +127,18 @@ class RestrictedCodeTest extends \PHPUnit_Framework_TestCase ); } } + + /** + * Get full path for excluded file + * + * @param array $pathInfo + * @return string + */ + private function getExcludedFilePath($pathInfo) + { + if ($pathInfo['type'] != 'setup') { + return $this->componentRegistrar->getPath($pathInfo['type'], $pathInfo['name']) . '/' . $pathInfo['path']; + } + return BP . '/setup/' . $pathInfo['path']; + } } diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/UnsecureFunctionsUsageTest.php b/dev/tests/static/testsuite/Magento/Test/Legacy/UnsecureFunctionsUsageTest.php index e5263713d71d7af374ea1f32c2d765d3639e56ce..44eb7fa78d8ac7099bfbfb6c14eae050c5e578e1 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/UnsecureFunctionsUsageTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/UnsecureFunctionsUsageTest.php @@ -6,12 +6,28 @@ namespace Magento\Test\Legacy; use Magento\Framework\App\Utility\Files; +use Magento\Framework\Component\ComponentRegistrar; +use Magento\TestFramework\Utility\FunctionDetector; /** * Tests to detect unsecure functions usage */ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase { + /** + * Php unsecure functions + * + * @var array + */ + private static $phpUnsecureFunctions = []; + + /** + * JS unsecure functions + * + * @var array + */ + private static $jsUnsecureFunctions = []; + /** * File extensions pattern to search for * @@ -20,25 +36,54 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase private $fileExtensions = '/\.(php|phtml|js)$/'; /** - * Php unsecure functions to detect + * Read fixtures into memory as arrays * - * @var array + * @return void */ - private $phpUnsecureFunctions = [ - 'unserialize', - 'serialize', - 'eval', - 'md5', - 'srand', - 'mt_srand' - ]; + public static function setUpBeforeClass() + { + self::loadData(self::$phpUnsecureFunctions, 'unsecure_php_functions*.php'); + self::loadData(self::$jsUnsecureFunctions, 'unsecure_js_functions*.php'); + } /** - * JS unsecure functions to detect + * Loads and merges data from fixtures * - * @var array + * @param array $data + * @param string $filePattern + * @return void */ - private $jsUnsecureFunctions = []; + private static function loadData(array &$data, $filePattern) + { + foreach (glob(__DIR__ . '/_files/security/' . $filePattern) as $file) { + $data = array_merge_recursive($data, self::readList($file)); + } + $componentRegistrar = new ComponentRegistrar(); + foreach ($data as $key => $value) { + $excludes = $value['exclude']; + $excludePaths = []; + foreach ($excludes as $exclude) { + if ('setup' == $exclude['type']) { + $excludePaths[] = BP . '/setup/' . $exclude['path']; + } else { + $excludePaths[] = $componentRegistrar->getPath($exclude['type'], $exclude['name']) + . '/' . $exclude['path']; + } + } + $data[$key]['exclude'] = $excludePaths; + } + } + + /** + * Isolate including a file into a method to reduce scope + * + * @param string $file + * @return array + */ + private static function readList($file) + { + return include $file; + } /** * Detect unsecure functions usage for changed files in whitelist with the exception of blacklist @@ -48,46 +93,69 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase public function testUnsecureFunctionsUsage() { $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this); + $functionDetector = new FunctionDetector(); $invoker( - function ($fileName) { - $result = ''; - $errorMessage = 'The following functions are non secure and should be avoided: ' - . implode(', ', $this->phpUnsecureFunctions) - . ' for PHP'; - if (!empty($this->jsUnsecureFunctions)) { - $errorMessage .= ', and ' - . implode(', ', $this->jsUnsecureFunctions) - . ' for JavaScript'; - } - $errorMessage .= ".\n"; - $regexp = $this->getRegexpByFileExtension(pathinfo($fileName, PATHINFO_EXTENSION)); - if ($regexp) { - $matches = preg_grep( - $regexp, - file($fileName) - ); - if (!empty($matches)) { - foreach (array_keys($matches) as $line) { - $result .= $fileName . ':' . ($line + 1) . "\n"; - } - } - $this->assertEmpty($result, $errorMessage . $result); + function ($fileFullPath) use ($functionDetector) { + $functions = $this->getFunctions($fileFullPath); + $lines = $functionDetector->detect($fileFullPath, array_keys($functions)); + + $message = ''; + if (!empty($lines)) { + $message = $this->composeMessage($fileFullPath, $lines, $functions); } + $this->assertEmpty( + $lines, + $message + ); }, - $this->unsecureFunctionsUsageDataProvider() + $this->getFilesToVerify() ); } /** - * Data provider for test + * Compose message + * + * @param string $fileFullPath + * @param array $lines + * @param array $functionRules + * @return string + */ + private function composeMessage($fileFullPath, $lines, $functionRules) + { + $result = ''; + foreach ($lines as $lineNumber => $detectedFunctions) { + $detectedFunctionRules = array_intersect_key($functionRules, array_flip($detectedFunctions)); + $replacementString = ''; + foreach ($detectedFunctionRules as $function => $functionRule) { + $replacement = $functionRule['replacement']; + if (is_array($replacement)) { + $replacement = array_unique($replacement); + $replacement = count($replacement) > 1 ? + "[\n\t\t\t" . implode("\n\t\t\t", $replacement) . "\n\t\t]" : + $replacement[0]; + } + $replacement = empty($replacement) ? 'No suggested replacement at this time' : $replacement; + $replacementString .= "\t\t'$function' => '$replacement'\n"; + } + $result .= sprintf( + "Functions '%s' are not secure in %s. \n\tSuggested replacement:\n%s", + implode(', ', $detectedFunctions), + $fileFullPath . ':' . $lineNumber, + $replacementString + ); + } + return $result; + } + + /** + * Get files to be verified * * @return array */ - public function unsecureFunctionsUsageDataProvider() + private function getFilesToVerify() { $fileExtensions = $this->fileExtensions; $directoriesToScan = Files::init()->readLists(__DIR__ . '/_files/security/whitelist.txt'); - $blackListFiles = include __DIR__ . '/_files/security/blacklist.php'; $filesToVerify = []; foreach (glob(__DIR__ . '/../_files/changed_files*') as $listFile) { @@ -104,7 +172,7 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase ); $filesToVerify = array_filter( $filesToVerify, - function ($path) use ($directoriesToScan, $fileExtensions, $blackListFiles) { + function ($path) use ($directoriesToScan, $fileExtensions) { if (!file_exists($path[0])) { return false; } @@ -113,11 +181,9 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase $directory = realpath($directory); if (strpos($path, $directory) === 0) { if (preg_match($fileExtensions, $path)) { - foreach ($blackListFiles as $blackListFile) { - $blackListFile = preg_quote($blackListFile, '#'); - if (preg_match('#' . $blackListFile . '#', $path)) { - return false; - } + // skip unit tests + if (preg_match('#' . preg_quote('Test/Unit', '#') . '#', $path)) { + return false; } return true; } @@ -130,35 +196,27 @@ class UnsecureFunctionsUsageTest extends \PHPUnit_Framework_TestCase } /** - * Get regular expression by file extension + * Get functions for the given file * - * @param string $fileExtension - * @return string|bool + * @param string $fileFullPath + * @return array */ - private function getRegexpByFileExtension($fileExtension) + private function getFunctions($fileFullPath) { - $regexp = false; + $fileExtension = pathinfo($fileFullPath, PATHINFO_EXTENSION); + $functions = []; if ($fileExtension == 'php') { - $regexp = $this->prepareRegexp($this->phpUnsecureFunctions); + $functions = self::$phpUnsecureFunctions; } elseif ($fileExtension == 'js') { - $regexp = $this->prepareRegexp($this->jsUnsecureFunctions); + $functions = self::$jsUnsecureFunctions; } elseif ($fileExtension == 'phtml') { - $regexp = $this->prepareRegexp($this->phpUnsecureFunctions + $this->jsUnsecureFunctions); + $functions = array_merge_recursive(self::$phpUnsecureFunctions, self::$jsUnsecureFunctions); } - return $regexp; - } - - /** - * Prepare regular expression for unsecure function names - * - * @param array $functions - * @return string - */ - private function prepareRegexp(array $functions) - { - if (empty($functions)) { - return ''; + foreach ($functions as $function => $functionRules) { + if (in_array($fileFullPath, $functionRules['exclude'])) { + unset($functions[$function]); + } } - return '/(?<!function |[^\s])\b(' . join('|', $functions) . ')\s*\(/i'; + return $functions; } } diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index f5ae2f2dfd67b5628326149d6d28f055c9d2485f..2a0c4f23bf3793978b06c3cb26e8706554d0ad51 100755 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3826,8 +3826,8 @@ return [ ], ['Magento\Setup\Model\Deployer', 'Magento\Deploy\Model\Deployer'], [ - 'Magento\Setup\Console\Command\DeployStaticContentCommand', - 'Magento\Deploy\Console\Command\DeployStaticContentCommand' + 'Magento\Deploy\Console\Command\DeployStaticContentCommand', + 'Magento\Setup\Console\Command\DeployStaticContentCommand' ], [ 'Magento\Setup\Test\Unit\Console\Command\DeployStaticContentCommandTest', diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/restricted_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/restricted_classes.php index a950b2d7e9ed243356da176f8eef1095ef4fb210..683449d4e5e34b919ef476d93c26fe01d122b0a8 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/restricted_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/restricted_classes.php @@ -1,27 +1,103 @@ <?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + /** * Classes that are restricted to use directly. * A <replacement> will be suggested to be used instead. * Use <whitelist> to specify files and directories that are allowed to use restricted classes. * * Format: array(<class_name>, <replacement>[, array(<whitelist>)]]) - * - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. */ return [ 'Zend_Db_Select' => [ 'replacement' => '\Magento\Framework\DB\Select', 'exclude' => [ - ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Select.php'], - ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Adapter/Pdo/Mysql.php'], - ['type' => 'library', 'name' => 'magento/framework', 'path' => 'Model/ResourceModel/Iterator.php'], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'DB/Select.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'DB/Adapter/Pdo/Mysql.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'Model/ResourceModel/Iterator.php' + ], ] ], 'Zend_Db_Adapter_Pdo_Mysql' => [ 'replacement' => '\Magento\Framework\DB\Adapter\Pdo\Mysql', 'exclude' => [ - ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Adapter/Pdo/Mysql.php'], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'DB/Adapter/Pdo/Mysql.php' + ], ] ], + 'Magento\Framework\Serialize\Serializer\Serialize' => [ + 'replacement' => 'Magento\Framework\Serialize\SerializerInterface', + 'exclude' => [ + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'DB/Adapter/Pdo/Mysql.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'App/ObjectManager/ConfigLoader/Compiled.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'App/Config/ScopePool.php'], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'App/ObjectManager/ConfigCache.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'App/ObjectManager/ConfigLoader.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'ObjectManager/Config/Compiled.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'Interception/Config/Config.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'Interception/PluginList/PluginList.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'App/Router/ActionList.php' + ], + [ + 'type' => 'library', + 'name' => 'magento/framework', + 'path' => 'Serialize/Test/Unit/Serializer/SerializeTest.php' + ], + [ + 'type' => 'setup', + 'path' => 'src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php' + ], + ] + ] ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/blacklist.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/blacklist.php deleted file mode 100644 index 42b8e68e784111b96d43049ae27dc5ebc963ad40..0000000000000000000000000000000000000000 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/blacklist.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -return [ - 'Test/Unit', - 'lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php', - 'lib/internal/Magento/Framework/Serialize/Serializer/Serialize.php', -]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/unsecure_php_functions.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/unsecure_php_functions.php new file mode 100644 index 0000000000000000000000000000000000000000..eb51d1bbba3bd98ec7ef2d5fd26754aea8fc221a --- /dev/null +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/security/unsecure_php_functions.php @@ -0,0 +1,52 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/** + * Functions that are not secure to use. + * A <replacement> will be suggested to be used instead. + * Use <exclude> to specify files and directories that are allowed to use function. + * + * Format: [ + * <class_name> => [ + * 'replacement' => <replacement>, + * 'exclude' => [ + * <exclude>, + * <exclude>, + * ] + * ] + */ +return [ + 'unserialize' => [ + 'replacement' => '\Magento\Framework\Serialize\SerializerInterface::unserialize', + 'exclude' => [ + ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Adapter/Pdo/Mysql.php'], + ['type' => 'library', 'name' => 'magento/framework', 'path' => 'Serialize/Serializer/Serialize.php'], + ] + ], + 'serialize' => [ + 'replacement' => '\Magento\Framework\Serialize\SerializerInterface::serialize', + 'exclude' => [ + ['type' => 'library', 'name' => 'magento/framework', 'path' => 'DB/Adapter/Pdo/Mysql.php'], + ['type' => 'library', 'name' => 'magento/framework', 'path' => 'Serialize/Serializer/Serialize.php'], + ] + ], + 'eval' => [ + 'replacement' => '', + 'exclude' => [] + ], + 'md5' => [ + 'replacement' => '', + 'exclude' => [] + ], + 'srand' => [ + 'replacement' => '', + 'exclude' => [] + ], + 'mt_srand' => [ + 'replacement' => '', + 'exclude' => [] + ], +]; diff --git a/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config.php b/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config.php index 303e4a57926662733398a7703afea0c548da2f03..1dcfe02e56b3ed22f780216bb0728a8a0ee6466e 100644 --- a/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config.php +++ b/lib/internal/Magento/Framework/Api/ExtensionAttribute/Config.php @@ -7,24 +7,32 @@ namespace Magento\Framework\Api\ExtensionAttribute; use Magento\Framework\Config\CacheInterface; use Magento\Framework\Api\ExtensionAttribute\Config\Reader; +use Magento\Framework\Serialize\SerializerInterface; /** * Extension attributes config */ class Config extends \Magento\Framework\Config\Data { + /** + * Cache identifier + */ const CACHE_ID = 'extension_attributes_config'; /** - * Initialize reader and cache. + * Constructor * * @param Reader $reader * @param CacheInterface $cache + * @param string $cacheId|null + * @param SerializerInterface|null $serializer */ public function __construct( Reader $reader, - CacheInterface $cache + CacheInterface $cache, + $cacheId = self::CACHE_ID, + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, self::CACHE_ID); + parent::__construct($reader, $cache, $cacheId, $serializer); } } diff --git a/lib/internal/Magento/Framework/Api/Search/SearchResult.php b/lib/internal/Magento/Framework/Api/Search/SearchResult.php index f637ef27d7b2cb4889e509aac154997ff1454aa9..f4ece5c84dde049468b76b357ecb09e2e86c2230 100644 --- a/lib/internal/Magento/Framework/Api/Search/SearchResult.php +++ b/lib/internal/Magento/Framework/Api/Search/SearchResult.php @@ -85,4 +85,18 @@ class SearchResult extends AbstractSimpleObject implements SearchResultInterface { return $this->setData(self::TOTAL_COUNT, $totalCount); } + + /** + * Retrieve ids of all items + * + * @return array + */ + public function getAllIds() + { + $ids = []; + foreach ($this->getItems() as $item) { + $ids[] = $item->getId(); + } + return $ids; + } } diff --git a/lib/internal/Magento/Framework/Api/Search/SearchResultInterface.php b/lib/internal/Magento/Framework/Api/Search/SearchResultInterface.php index ffa4c0fe43cf2422efbefc5a2c1605ec78281711..d44a8be3fb0ecff9a5031d07d66a50785c31c9d0 100644 --- a/lib/internal/Magento/Framework/Api/Search/SearchResultInterface.php +++ b/lib/internal/Magento/Framework/Api/Search/SearchResultInterface.php @@ -7,6 +7,11 @@ namespace Magento\Framework\Api\Search; use Magento\Framework\Api\SearchResultsInterface; +/** + * Interface SearchResultInterface + * + * @api + */ interface SearchResultInterface extends SearchResultsInterface { /**#@+ @@ -48,4 +53,11 @@ interface SearchResultInterface extends SearchResultsInterface * @return \Magento\Framework\Api\Search\SearchCriteriaInterface */ public function getSearchCriteria(); + + /** + * Retrieve all ids from list + * + * @return int[] + */ + public function getAllIds(); } diff --git a/lib/internal/Magento/Framework/Api/Test/Unit/Search/SearchResultTest.php b/lib/internal/Magento/Framework/Api/Test/Unit/Search/SearchResultTest.php new file mode 100644 index 0000000000000000000000000000000000000000..5d289291996906e4b60b0940da8fafd893a720fc --- /dev/null +++ b/lib/internal/Magento/Framework/Api/Test/Unit/Search/SearchResultTest.php @@ -0,0 +1,72 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Api\Test\Unit\Search; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Framework\Api\Search\SearchResult; +use Magento\Framework\Api\Search\DocumentInterface; + +class SearchResultTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var SearchResult + */ + private $search; + + /** + * @var DocumentInterface[] + */ + private $items; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Set up + */ + protected function setUp() + { + $document1 = $this->getMock(DocumentInterface::class); + $document2 = $this->getMock(DocumentInterface::class); + + $this->items = [ $document1, $document2]; + $document1->expects($this->any()) + ->method('getId') + ->willReturn(1); + $document2->expects($this->any()) + ->method('getId') + ->willReturn(2); + + $data = [ + 'items' => $this->items + ]; + $this->objectManager = new ObjectManager($this); + $this->search = $this->objectManager->getObject( + SearchResult::class, + [ + 'data' => $data + ] + ); + } + + /** + * Test getAllIds + */ + public function testGetAllIds() + { + $this->assertEquals([1, 2], $this->search->getAllIds()); + } + + /** + * Test getItems + */ + public function testGetItems() + { + $this->assertEquals($this->items, $this->search->getItems()); + } +} diff --git a/lib/internal/Magento/Framework/App/Cache/TypeList.php b/lib/internal/Magento/Framework/App/Cache/TypeList.php index 1fae9652810c8528870c5157948a4aa4809dcb0f..38516b7174d6f143b066752394b8f469a87e3bd5 100644 --- a/lib/internal/Magento/Framework/App/Cache/TypeList.php +++ b/lib/internal/Magento/Framework/App/Cache/TypeList.php @@ -5,6 +5,9 @@ */ namespace Magento\Framework\App\Cache; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; + class TypeList implements TypeListInterface { const INVALIDATED_TYPES = 'core_cache_invalidate'; @@ -29,22 +32,30 @@ class TypeList implements TypeListInterface */ protected $_cache; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\Cache\ConfigInterface $config * @param StateInterface $cacheState * @param InstanceFactory $factory * @param \Magento\Framework\App\CacheInterface $cache + * @param SerializerInterface $serializer */ public function __construct( \Magento\Framework\Cache\ConfigInterface $config, StateInterface $cacheState, InstanceFactory $factory, - \Magento\Framework\App\CacheInterface $cache + \Magento\Framework\App\CacheInterface $cache, + SerializerInterface $serializer = null ) { $this->_config = $config; $this->_factory = $factory; $this->_cacheState = $cacheState; $this->_cache = $cache; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); } /** @@ -72,7 +83,7 @@ class TypeList implements TypeListInterface { $types = $this->_cache->load(self::INVALIDATED_TYPES); if ($types) { - $types = unserialize($types); + $types = $this->serializer->unserialize($types); } else { $types = []; } @@ -87,7 +98,7 @@ class TypeList implements TypeListInterface */ protected function _saveInvalidatedTypes($types) { - $this->_cache->save(serialize($types), self::INVALIDATED_TYPES); + $this->_cache->save($this->serializer->serialize($types), self::INVALIDATED_TYPES); } /** diff --git a/lib/internal/Magento/Framework/App/Config.php b/lib/internal/Magento/Framework/App/Config.php index e8aaaa0bbe57094d088e0df9cf81711d251b8cd6..d25739c5d1bf3238745d5016d28f5cae95459bfd 100644 --- a/lib/internal/Magento/Framework/App/Config.php +++ b/lib/internal/Magento/Framework/App/Config.php @@ -7,9 +7,14 @@ */ namespace Magento\Framework\App; +use Magento\Framework\App\Config\ScopeCodeResolver; use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\App\Config\ConfigTypeInterface; -class Config implements \Magento\Framework\App\Config\ScopeConfigInterface +/** + * Class Config + */ +class Config implements ScopeConfigInterface { /** * Config cache tag @@ -17,16 +22,27 @@ class Config implements \Magento\Framework\App\Config\ScopeConfigInterface const CACHE_TAG = 'CONFIG'; /** - * @var \Magento\Framework\App\Config\ScopePool + * @var ScopeCodeResolver */ - protected $_scopePool; + private $scopeCodeResolver; /** - * @param \Magento\Framework\App\Config\ScopePool $scopePool + * @var ConfigTypeInterface[] */ - public function __construct(\Magento\Framework\App\Config\ScopePool $scopePool) - { - $this->_scopePool = $scopePool; + private $types; + + /** + * Config constructor. + * + * @param ScopeCodeResolver $scopeCodeResolver + * @param array $types + */ + public function __construct( + ScopeCodeResolver $scopeCodeResolver, + array $types = [] + ) { + $this->scopeCodeResolver = $scopeCodeResolver; + $this->types = $types; } /** @@ -42,7 +58,26 @@ class Config implements \Magento\Framework\App\Config\ScopeConfigInterface $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null ) { - return $this->_scopePool->getScope($scope, $scopeCode)->getValue($path); + if ($scope === 'store') { + $scope = 'stores'; + } elseif ($scope === 'website') { + $scope = 'websites'; + } + $configPath = $scope; + if ($scope !== 'default') { + if (is_numeric($scopeCode) || $scopeCode === null) { + $scopeCode = $this->scopeCodeResolver->resolve($scope, $scopeCode); + } else if ($scopeCode instanceof \Magento\Framework\App\ScopeInterface) { + $scopeCode = $scopeCode->getCode(); + } + if ($scopeCode) { + $configPath .= '/' . $scopeCode; + } + } + if ($path) { + $configPath .= '/' . $path; + } + return $this->get('system', $configPath); } /** @@ -55,6 +90,45 @@ class Config implements \Magento\Framework\App\Config\ScopeConfigInterface */ public function isSetFlag($path, $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null) { - return (bool) $this->getValue($path, $scope, $scopeCode); + return !!$this->getValue($path, $scope, $scopeCode); + } + + /** + * Invalidate cache by type + * + * @return void + */ + public function clean() + { + foreach ($this->types as $type) { + $type->clean(); + } + } + + /** + * Retrieve configuration. + * + * ('modules') - modules status configuration data + * ('scopes', 'websites/base') - base website data + * ('scopes', 'stores/default') - default store data + * + * ('system', 'default/web/seo/use_rewrites') - default system configuration data + * ('system', 'websites/base/web/seo/use_rewrites') - 'base' website system configuration data + * + * ('i18n', 'default/en_US') - translations for default store and 'en_US' locale + * + * @param string $configType + * @param string|null $path + * @param mixed|null $default + * @return array + */ + public function get($configType, $path = '', $default = null) + { + $result = null; + if (isset($this->types[$configType])) { + $result = $this->types[$configType]->get($path); + } + + return $result !== null ? $result : $default; } } diff --git a/lib/internal/Magento/Framework/App/Config/ConfigSourceAggregated.php b/lib/internal/Magento/Framework/App/Config/ConfigSourceAggregated.php new file mode 100644 index 0000000000000000000000000000000000000000..c1a9259a4329b4ce2998b53f293ed7bf0301deb5 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/ConfigSourceAggregated.php @@ -0,0 +1,56 @@ +<?php +/** + * Application configuration object. Used to access configuration when application is initialized and installed. + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config; + +class ConfigSourceAggregated implements ConfigSourceInterface +{ + /** + * @var ConfigSourceInterface[] + */ + private $sources; + + /** + * ConfigSourceAggregated constructor. + * + * @param array $sources + */ + public function __construct(array $sources = []) + { + $this->sources = $sources; + } + + /** + * Retrieve aggregated configuration from all available sources. + * + * @param string $path + * @return array + */ + public function get($path = '') + { + $this->sortSources(); + $data = []; + foreach ($this->sources as $sourceConfig) { + /** @var ConfigSourceInterface $source */ + $source = $sourceConfig['source']; + $data = array_replace_recursive($data, $source->get($path)); + } + return $data; + } + + /** + * Sort sources + * + * @return void + */ + private function sortSources() + { + uasort($this->sources, function ($firstItem, $secondItem) { + return $firstItem['sortOrder'] > $secondItem['sortOrder']; + }); + } +} diff --git a/lib/internal/Magento/Framework/App/Config/ConfigSourceInterface.php b/lib/internal/Magento/Framework/App/Config/ConfigSourceInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..c070125de9f35d5119b9d4df5ddf250ed09a4ca4 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/ConfigSourceInterface.php @@ -0,0 +1,22 @@ +<?php +/** + * Provide access to data. Each Source can be responsible for each storage, where config data can be placed + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config; + +/** + * Interface ConfigSourceInterface + */ +interface ConfigSourceInterface +{ + /** + * Retrieve configuration raw data array. + * + * @param string $path + * @return array + */ + public function get($path = ''); +} diff --git a/lib/internal/Magento/Framework/App/Config/ConfigTypeInterface.php b/lib/internal/Magento/Framework/App/Config/ConfigTypeInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..81dce57e314786144fa53a8b9bc31bb79ebbc9bb --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/ConfigTypeInterface.php @@ -0,0 +1,27 @@ +<?php +/** + * Application configuration object. Used to access configuration when application is initialized and installed. + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config; + +/** + * Interface ConfigTypeInterface + */ +interface ConfigTypeInterface +{ + /** + * Retrieve configuration raw data array. + * + * @param string $path + * @return array + */ + public function get($path = ''); + + /** + * @return void + */ + public function clean(); +} diff --git a/lib/internal/Magento/Framework/App/Config/Initial.php b/lib/internal/Magento/Framework/App/Config/Initial.php index 0704fb855939625d2fd7c756e7abf1a213391efb..5669041ee98d232682ca8c2102290e71c0059433 100644 --- a/lib/internal/Magento/Framework/App/Config/Initial.php +++ b/lib/internal/Magento/Framework/App/Config/Initial.php @@ -8,6 +8,7 @@ namespace Magento\Framework\App\Config; use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\Serialize\SerializerInterface; class Initial { @@ -31,19 +32,30 @@ class Initial protected $_metadata = []; /** - * @param \Magento\Framework\App\Config\Initial\Reader $reader + * @var SerializerInterface + */ + private $serializer; + + /** + * Initial constructor + * + * @param Initial\Reader $reader * @param \Magento\Framework\App\Cache\Type\Config $cache + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\App\Config\Initial\Reader $reader, - \Magento\Framework\App\Cache\Type\Config $cache + \Magento\Framework\App\Cache\Type\Config $cache, + SerializerInterface $serializer = null ) { + $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(SerializerInterface::class); $data = $cache->load(self::CACHE_ID); if (!$data) { $data = $reader->read(); - $cache->save(serialize($data), self::CACHE_ID); + $cache->save($this->serializer->serialize($data), self::CACHE_ID); } else { - $data = unserialize($data); + $data = $this->serializer->unserialize($data); } $this->_data = $data['data']; $this->_metadata = $data['metadata']; diff --git a/lib/internal/Magento/Framework/App/Config/InitialConfigSource.php b/lib/internal/Magento/Framework/App/Config/InitialConfigSource.php new file mode 100644 index 0000000000000000000000000000000000000000..1f75bef92914a348e28317bf6b81739eae5c145d --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/InitialConfigSource.php @@ -0,0 +1,56 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config; + +use Magento\Framework\App\DeploymentConfig\Reader; +use Magento\Framework\DataObject; + +/** + * Responsible for reading sources from files: config.dist.php, config.local.php, config.php + */ +class InitialConfigSource implements ConfigSourceInterface +{ + /** + * @var Reader + */ + private $reader; + + /** + * @var string + */ + private $configType; + + /** + * @var string + */ + private $fileKey; + + /** + * DataProvider constructor. + * + * @param Reader $reader + * @param string $configType + * @param string $fileKey + */ + public function __construct(Reader $reader, $configType, $fileKey) + { + $this->reader = $reader; + $this->configType = $configType; + $this->fileKey = $fileKey; + } + + /** + * @inheritdoc + */ + public function get($path = '') + { + $data = new DataObject($this->reader->load($this->fileKey)); + if ($path !== '' && $path !== null) { + $path = '/' . $path; + } + return $data->getData($this->configType . $path) ?: []; + } +} diff --git a/lib/internal/Magento/Framework/App/Config/MetadataConfigTypeProcessor.php b/lib/internal/Magento/Framework/App/Config/MetadataConfigTypeProcessor.php new file mode 100644 index 0000000000000000000000000000000000000000..04acde7950c136f070b413c198b192a5417744b7 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/MetadataConfigTypeProcessor.php @@ -0,0 +1,116 @@ +<?php +/** + * Configuration metadata processor + * + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config; + +use Magento\Framework\App\Config\Spi\PostProcessorInterface; + +class MetadataConfigTypeProcessor implements PostProcessorInterface +{ + /** + * @var \Magento\Framework\App\Config\Data\ProcessorFactory + */ + protected $_processorFactory; + + /** + * @var array + */ + protected $_metadata = []; + + /** + * @param \Magento\Framework\App\Config\Data\ProcessorFactory $processorFactory + * @param Initial $initialConfig + */ + public function __construct( + \Magento\Framework\App\Config\Data\ProcessorFactory $processorFactory, + Initial $initialConfig + ) { + $this->_processorFactory = $processorFactory; + $this->_metadata = $initialConfig->getMetadata(); + } + + /** + * Retrieve array value by path + * + * @param array $data + * @param string $path + * @return string|null + */ + protected function _getValue(array $data, $path) + { + $keys = explode('/', $path); + foreach ($keys as $key) { + if (is_array($data) && array_key_exists($key, $data)) { + $data = $data[$key]; + } else { + return null; + } + } + return $data; + } + + /** + * Set array value by path + * + * @param array &$container + * @param string $path + * @param string $value + * @return void + */ + protected function _setValue(array &$container, $path, $value) + { + $segments = explode('/', $path); + $currentPointer = & $container; + foreach ($segments as $segment) { + if (!isset($currentPointer[$segment])) { + $currentPointer[$segment] = []; + } + $currentPointer = & $currentPointer[$segment]; + } + $currentPointer = $value; + } + + /** + * Process data by sections: stores, default, websites and by scope codes + * + * @param array $data + * @return array + */ + private function processScopeData(array $data) + { + foreach ($this->_metadata as $path => $metadata) { + /** @var \Magento\Framework\App\Config\Data\ProcessorInterface $processor */ + $processor = $this->_processorFactory->get($metadata['backendModel']); + $value = $processor->processValue($this->_getValue($data, $path)); + $this->_setValue($data, $path, $value); + } + + return $data; + } + + /** + * Process config data + * + * @param array $data + * @return array + */ + public function process(array $rawData) + { + $processedData = []; + foreach ($rawData as $scope => $scopeData) { + if ($scope == ScopeConfigInterface::SCOPE_TYPE_DEFAULT) { + $processedData[ScopeConfigInterface::SCOPE_TYPE_DEFAULT] = $this->processScopeData($scopeData); + } else { + foreach ($scopeData as $scopeCode => $data) { + $processedData[$scope][$scopeCode] = $this->processScopeData($data); + } + } + } + + return $processedData; + } +} diff --git a/lib/internal/Magento/Framework/App/Config/PostProcessorComposite.php b/lib/internal/Magento/Framework/App/Config/PostProcessorComposite.php new file mode 100644 index 0000000000000000000000000000000000000000..a008b1abd0595bf163c20563c822484d9076d3b5 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/PostProcessorComposite.php @@ -0,0 +1,39 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config; + +use Magento\Framework\App\Config\Spi\PostProcessorInterface; + +/** + * @inheritdoc + * @package Magento\Framework\App\Config + */ +class PostProcessorComposite implements PostProcessorInterface +{ + /** @var PostProcessorInterface[] */ + private $processors; + + /** + * @param array $processors + */ + public function __construct(array $processors = []) + { + $this->processors = $processors; + } + + /** + * @param array $config + * @return array + */ + public function process(array $config) + { + foreach ($this->processors as $processor) { + $config = $processor->process($config); + } + + return $config; + } +} diff --git a/lib/internal/Magento/Framework/App/Config/Reader/Source/SourceInterface.php b/lib/internal/Magento/Framework/App/Config/Reader/Source/SourceInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..2f1061fb7b6bdb5533929a9ac477ab695491de29 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/Reader/Source/SourceInterface.php @@ -0,0 +1,22 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config\Reader\Source; + +/** + * Provide access to data. Each Source can be responsible for each storage, where config data can be placed + * + * @package Magento\Framework\App\Config\Reader\Source + */ +interface SourceInterface +{ + /** + * Retrieve config by scope + * + * @param string|null $scopeCode + * @return array + */ + public function get($scopeCode = null); +} diff --git a/lib/internal/Magento/Framework/App/Config/Scope/ReaderPoolInterface.php b/lib/internal/Magento/Framework/App/Config/Scope/ReaderPoolInterface.php deleted file mode 100644 index 9c2b66dad2860156393bfe5f02f5512850f067c8..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/App/Config/Scope/ReaderPoolInterface.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\App\Config\Scope; - -interface ReaderPoolInterface -{ - /** - * Retrieve reader by scope - * - * @param string $scopeType - * @return ReaderInterface|null - */ - public function getReader($scopeType); -} diff --git a/lib/internal/Magento/Framework/App/Config/ScopeCodeResolver.php b/lib/internal/Magento/Framework/App/Config/ScopeCodeResolver.php new file mode 100644 index 0000000000000000000000000000000000000000..ef7da5c94c1e25e061909fffa692ecfb0c728fd6 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/ScopeCodeResolver.php @@ -0,0 +1,61 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config; + +use Magento\Framework\App\ScopeResolverPool; + +/** + * Class for resolving scope code + */ +class ScopeCodeResolver +{ + /** + * @var ScopeResolverPool + */ + private $scopeResolverPool; + + /** + * @var array + */ + private $resolvedScopeCodes = []; + + /** + * @param ScopeResolverPool $scopeResolverPool + */ + public function __construct(ScopeResolverPool $scopeResolverPool) + { + $this->scopeResolverPool = $scopeResolverPool; + } + + /** + * Resolve scope code + * + * @param string $scopeType + * @param string $scopeCode + * @return string + */ + public function resolve($scopeType, $scopeCode) + { + if (isset($this->resolvedScopeCodes[$scopeType][$scopeCode])) { + return $this->resolvedScopeCodes[$scopeType][$scopeCode]; + } + if (($scopeCode === null || is_numeric($scopeCode)) + && $scopeType !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT + ) { + $scopeResolver = $this->scopeResolverPool->get($scopeType); + $resolverScopeCode = $scopeResolver->getScope($scopeCode); + } else { + $resolverScopeCode = $scopeCode; + } + + if ($resolverScopeCode instanceof \Magento\Framework\App\ScopeInterface) { + $resolverScopeCode = $resolverScopeCode->getCode(); + } + + $this->resolvedScopeCodes[$scopeType][$scopeCode] = $resolverScopeCode; + return $resolverScopeCode; + } +} diff --git a/lib/internal/Magento/Framework/App/Config/ScopePool.php b/lib/internal/Magento/Framework/App/Config/ScopePool.php deleted file mode 100644 index 9e6a47d918f7602cd2e2b1d50286eb82f3f5cca6..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/App/Config/ScopePool.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\App\Config; - -use Magento\Framework\App\RequestInterface; - -/** - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ -class ScopePool -{ - const CACHE_TAG = 'config_scopes'; - - /** - * @var \Magento\Framework\App\Config\Scope\ReaderPoolInterface - */ - protected $_readerPool; - - /** - * @var DataFactory - */ - protected $_dataFactory; - - /** - * @var \Magento\Framework\Cache\FrontendInterface - */ - protected $_cache; - - /** - * @var string - */ - protected $_cacheId; - - /** - * @var DataInterface[] - */ - protected $_scopes = []; - - /** - * @var \Magento\Framework\App\ScopeResolverPool - */ - protected $_scopeResolverPool; - - /** - * @var RequestInterface - */ - private $request; - - /** - * @param \Magento\Framework\App\Config\Scope\ReaderPoolInterface $readerPool - * @param DataFactory $dataFactory - * @param \Magento\Framework\Cache\FrontendInterface $cache - * @param \Magento\Framework\App\ScopeResolverPool $scopeResolverPool - * @param string $cacheId - */ - public function __construct( - \Magento\Framework\App\Config\Scope\ReaderPoolInterface $readerPool, - DataFactory $dataFactory, - \Magento\Framework\Cache\FrontendInterface $cache, - \Magento\Framework\App\ScopeResolverPool $scopeResolverPool, - $cacheId = 'default_config_cache' - ) { - $this->_readerPool = $readerPool; - $this->_dataFactory = $dataFactory; - $this->_cache = $cache; - $this->_cacheId = $cacheId; - $this->_scopeResolverPool = $scopeResolverPool; - } - - /** - * @return RequestInterface - */ - private function getRequest() - { - if ($this->request === null) { - $this->request = \Magento\Framework\App\ObjectManager::getInstance()->get(RequestInterface::class); - } - return $this->request; - } - - /** - * Retrieve config section - * - * @param string $scopeType - * @param string|\Magento\Framework\DataObject|null $scopeCode - * @return \Magento\Framework\App\Config\DataInterface - */ - public function getScope($scopeType, $scopeCode = null) - { - $scopeCode = $this->_getScopeCode($scopeType, $scopeCode); - - $code = $scopeType . '|' . $scopeCode; - - if (!isset($this->_scopes[$code])) { - // Key by url to support dynamic {{base_url}} and port assignments - $host = $this->getRequest()->getHttpHost(); - $port = $this->getRequest()->getServer('SERVER_PORT'); - $path = $this->getRequest()->getBasePath(); - - $urlInfo = $host . $port . trim($path, '/'); - $cacheKey = $this->_cacheId . '|' . $code . '|' . $urlInfo; - $data = $this->_cache->load($cacheKey); - - if ($data) { - $data = unserialize($data); - } else { - $reader = $this->_readerPool->getReader($scopeType); - if ($scopeType === ScopeConfigInterface::SCOPE_TYPE_DEFAULT) { - $data = $reader->read(); - } else { - $data = $reader->read($scopeCode); - } - $this->_cache->save(serialize($data), $cacheKey, [self::CACHE_TAG]); - } - $this->_scopes[$code] = $this->_dataFactory->create(['data' => $data]); - } - return $this->_scopes[$code]; - } - - /** - * Clear cache of all scopes - * - * @return void - */ - public function clean() - { - $this->_scopes = []; - $this->_cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, [self::CACHE_TAG]); - } - - /** - * Retrieve scope code value - * - * @param string $scopeType - * @param string|\Magento\Framework\DataObject|null $scopeCode - * @return string - */ - protected function _getScopeCode($scopeType, $scopeCode) - { - if (($scopeCode === null || is_numeric($scopeCode)) - && $scopeType !== ScopeConfigInterface::SCOPE_TYPE_DEFAULT - ) { - $scopeResolver = $this->_scopeResolverPool->get($scopeType); - $scopeCode = $scopeResolver->getScope($scopeCode); - } - - if ($scopeCode instanceof \Magento\Framework\App\ScopeInterface) { - $scopeCode = $scopeCode->getCode(); - } - - return $scopeCode; - } -} diff --git a/lib/internal/Magento/Framework/App/Config/Spi/PostProcessorInterface.php b/lib/internal/Magento/Framework/App/Config/Spi/PostProcessorInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..53c348170761f448914a01447a028c766ec89f4b --- /dev/null +++ b/lib/internal/Magento/Framework/App/Config/Spi/PostProcessorInterface.php @@ -0,0 +1,27 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Config\Spi; + +use Magento\Framework\App\Config\ConfigTypeInterface; +use Magento\Framework\App\Config\Reader\Source\SourceInterface; + +/** + * Allows to use custom callbacks and functions after collecting config from all sources + * + * @see SourceInterface + * @see ConfigTypeInterface + * @package Magento\Framework\App\Config\Spi + */ +interface PostProcessorInterface +{ + /** + * Process config after reading and converting to appropriate format + * + * @param array $config + * @return array + */ + public function process(array $config); +} diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig.php b/lib/internal/Magento/Framework/App/DeploymentConfig.php index d1a8b9018d55deb6b2d4d32031c168efec1d5f23..fa81b0fd8bc71f502bc1c0798a4698e33f667569 100644 --- a/lib/internal/Magento/Framework/App/DeploymentConfig.php +++ b/lib/internal/Magento/Framework/App/DeploymentConfig.php @@ -114,6 +114,17 @@ class DeploymentConfig $this->data = null; } + /** + * Check if data from deploy files is avaiable + * + * @return bool + */ + public function isDbAvailable() + { + $this->load(); + return isset($this->data['db']); + } + /** * Loads the configuration data * diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php index 6a4af75512d4d993f99ac374b33c1b5dca7bc812..a1635fc4b2670d3749adbc8ac7bb88bab31904cf 100644 --- a/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php +++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Reader.php @@ -11,7 +11,7 @@ use Magento\Framework\Config\File\ConfigFilePool; use Magento\Framework\Filesystem\DriverPool; /** - * Deployment configuration reader + * Deployment configuration reader from files: env.php, config.php (config.local.php, config.dist.php) */ class Reader { @@ -72,7 +72,26 @@ class Reader */ public function getFiles() { - return $this->files; + $path = $this->dirList->getPath(DirectoryList::CONFIG); + $fileDriver = $this->driverPool->getDriver(DriverPool::FILE); + $initialFilePools = $this->configFilePool->getInitialFilePools(); + + $files = []; + foreach ($this->files as $fileKey => $filePath) { + $files[$fileKey] = $filePath; + if (!$fileDriver->isExists($path . "/" . $filePath)) { + foreach ($initialFilePools as $initialFiles) { + if ( + isset($initialFiles[$fileKey]) + && $fileDriver->isExists($path . '/' . $initialFiles[$fileKey]) + ) { + $files[$fileKey] = $initialFiles[$fileKey]; + } + } + } + } + + return $files; } /** @@ -84,26 +103,19 @@ class Reader */ public function load($fileKey = null) { - $path = $this->dirList->getPath(DirectoryList::CONFIG); - $fileDriver = $this->driverPool->getDriver(DriverPool::FILE); - $result = []; if ($fileKey) { - $filePath = $path . '/' . $this->configFilePool->getPath($fileKey); - if ($fileDriver->isExists($filePath)) { - $result = include $filePath; - } + $pathConfig = $this->configFilePool->getPath($fileKey); + return $this->loadConfigFile($fileKey, $pathConfig); } else { $configFiles = $this->configFilePool->getPaths(); $allFilesData = []; $result = []; - foreach (array_keys($configFiles) as $fileKey) { - $configFile = $path . '/' . $this->configFilePool->getPath($fileKey); - if ($fileDriver->isExists($configFile)) { - $fileData = include $configFile; - } else { + foreach ($configFiles as $fileKey => $pathConfig) { + $fileData = $this->loadConfigFile($fileKey, $pathConfig); + if (!$fileData) { continue; } - $allFilesData[$configFile] = $fileData; + $allFilesData[$fileKey] = $fileData; if (!empty($fileData)) { $intersection = array_intersect_key($result, $fileData); if (!empty($intersection)) { @@ -116,8 +128,38 @@ class Reader $result = array_merge($result, $fileData); } } + return $result; } - return $result ?: []; + } + + /** + * @param string $fileKey + * @param string $pathConfig + * @param bool $ignoreInitialConfigFiles + * @return array + */ + public function loadConfigFile($fileKey, $pathConfig, $ignoreInitialConfigFiles = false) + { + $result = []; + $initialFilePools = $this->configFilePool->getInitialFilePools(); + $path = $this->dirList->getPath(DirectoryList::CONFIG); + $fileDriver = $this->driverPool->getDriver(DriverPool::FILE); + + if (!$ignoreInitialConfigFiles) { + foreach ($initialFilePools as $initialFiles) { + if (isset($initialFiles[$fileKey]) && $fileDriver->isExists($path . '/' . $initialFiles[$fileKey])) { + $fileBuffer = include $path . '/' . $initialFiles[$fileKey]; + $result = array_replace_recursive($result, $fileBuffer); + } + } + } + + if ($fileDriver->isExists($path . '/' . $pathConfig)) { + $fileBuffer = include $path . '/' . $pathConfig; + $result = array_replace_recursive($result, $fileBuffer); + } + + return $result; } /** diff --git a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php index ac1e5f6ecf897c4769af5b3dbe97cfde4a9e9ee8..6cead0305a6c6ada899060a2a7debdbfe71f6f1a 100644 --- a/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php +++ b/lib/internal/Magento/Framework/App/DeploymentConfig/Writer.php @@ -14,7 +14,7 @@ use Magento\Framework\Config\File\ConfigFilePool; use Magento\Framework\Phrase; /** - * Deployment configuration writer + * Deployment configuration writer to files: env.php, config.php (config.local.php, config.dist.php) */ class Writer { @@ -93,17 +93,18 @@ class Writer * * @param array $data * @param bool $override + * @param string $pool * @return void + * @throws FileSystemException */ - public function saveConfig(array $data, $override = false) + public function saveConfig(array $data, $override = false, $pool = null) { - $paths = $this->configFilePool->getPaths(); - foreach ($data as $fileKey => $config) { - if (isset($paths[$fileKey])) { + $paths = $pool ? $this->configFilePool->getPathsByPool($pool) : $this->configFilePool->getPaths(); - if ($this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->isExist($paths[$fileKey])) { - $currentData = $this->reader->load($fileKey); + if (isset($paths[$fileKey])) { + $currentData = $this->reader->loadConfigFile($fileKey, $paths[$fileKey], true); + if ($currentData) { if ($override) { $config = array_merge($currentData, $config); } else { @@ -113,7 +114,8 @@ class Writer $contents = $this->formatter->format($config); try { - $this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->writeFile($paths[$fileKey], $contents); + $writeFilePath = $paths[$fileKey]; + $this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->writeFile($writeFilePath, $contents); } catch (FileSystemException $e) { throw new FileSystemException( new Phrase('Deployment config file %1 is not writable.', [$paths[$fileKey]]) diff --git a/lib/internal/Magento/Framework/App/MutableScopeConfig.php b/lib/internal/Magento/Framework/App/MutableScopeConfig.php index 5cbf108bc20317e27be0e13be4d4f3b2e2fc547a..010504d993bfcf7f54268994b03294289348956f 100644 --- a/lib/internal/Magento/Framework/App/MutableScopeConfig.php +++ b/lib/internal/Magento/Framework/App/MutableScopeConfig.php @@ -11,8 +11,31 @@ namespace Magento\Framework\App; use Magento\Framework\App\Config\MutableScopeConfigInterface; use Magento\Framework\App\Config\ScopeConfigInterface; +/** + * @inheritdoc + */ class MutableScopeConfig extends Config implements MutableScopeConfigInterface { + /** + * @var array + */ + private $data; + + /** + * @inheritdoc + */ + public function getValue( + $path = null, + $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, + $scopeCode = null + ) { + if (isset($this->data[$scope][$scopeCode][$path])) { + return $this->data[$scope][$scopeCode][$path]; + } + + return parent::getValue($path, $scope, $scopeCode); + } + /** * Set config value in the corresponding config scope * @@ -28,9 +51,15 @@ class MutableScopeConfig extends Config implements MutableScopeConfigInterface $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeCode = null ) { - if (empty($scopeCode)) { - $scopeCode = null; - } - $this->_scopePool->getScope($scope, $scopeCode)->setValue($path, $value); + $this->data[$scope][$scopeCode][$path] = $value; + } + + /** + * @inheritdoc + */ + public function clean() + { + $this->data = null; + parent::clean(); } } diff --git a/lib/internal/Magento/Framework/App/ObjectManager/ConfigCache.php b/lib/internal/Magento/Framework/App/ObjectManager/ConfigCache.php index 7e8711d027bb730327f080170f6b5d4557ed9630..4e685e3472ef8305095c150088b77efc94964244 100644 --- a/lib/internal/Magento/Framework/App/ObjectManager/ConfigCache.php +++ b/lib/internal/Magento/Framework/App/ObjectManager/ConfigCache.php @@ -7,6 +7,9 @@ */ namespace Magento\Framework\App\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Serialize\Serializer\Serialize; + class ConfigCache implements \Magento\Framework\ObjectManager\ConfigCacheInterface { /** @@ -21,6 +24,11 @@ class ConfigCache implements \Magento\Framework\ObjectManager\ConfigCacheInterfa */ protected $_prefix = 'diConfig'; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\Cache\FrontendInterface $cacheFrontend */ @@ -37,7 +45,7 @@ class ConfigCache implements \Magento\Framework\ObjectManager\ConfigCacheInterfa */ public function get($key) { - return unserialize($this->_cacheFrontend->load($this->_prefix . $key)); + return $this->getSerializer()->unserialize($this->_cacheFrontend->load($this->_prefix . $key)); } /** @@ -49,6 +57,20 @@ class ConfigCache implements \Magento\Framework\ObjectManager\ConfigCacheInterfa */ public function save(array $config, $key) { - $this->_cacheFrontend->save(serialize($config), $this->_prefix . $key); + $this->_cacheFrontend->save($this->getSerializer()->serialize($config), $this->_prefix . $key); + } + + /** + * Get serializer + * + * @return SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if (null === $this->serializer) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()->get(Serialize::class); + } + return $this->serializer; } } diff --git a/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader.php b/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader.php index 2190ff6cdb37fa5a17bc618dc4b8b2f396a787ad..2770443b6d7e28bc1565c6a79372402f5e196fee 100644 --- a/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader.php +++ b/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader.php @@ -7,6 +7,8 @@ */ namespace Magento\Framework\App\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Serialize\Serializer\Serialize; use Magento\Framework\ObjectManager\ConfigLoaderInterface; class ConfigLoader implements ConfigLoaderInterface @@ -32,6 +34,11 @@ class ConfigLoader implements ConfigLoaderInterface */ protected $_cache; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\Config\CacheInterface $cache * @param \Magento\Framework\ObjectManager\Config\Reader\DomFactory $readerFactory @@ -67,11 +74,25 @@ class ConfigLoader implements ConfigLoaderInterface if (!$data) { $data = $this->_getReader()->read($area); - $this->_cache->save(serialize($data), $cacheId); + $this->_cache->save($this->getSerializer()->serialize($data), $cacheId); } else { - $data = unserialize($data); + $data = $this->getSerializer()->unserialize($data); } return $data; } + + /** + * Get serializer + * + * @return SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if (null === $this->serializer) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()->get(Serialize::class); + } + return $this->serializer; + } } diff --git a/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php b/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php index 844d3f038aefec4e5e13e80741d5f49477eea627..669c9f4121ac0612faf6ac34317e180b6011eddb 100644 --- a/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php +++ b/lib/internal/Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php @@ -6,7 +6,10 @@ */ namespace Magento\Framework\App\ObjectManager\ConfigLoader; +use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\ObjectManager\ConfigLoaderInterface; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Serialize\Serializer\Serialize; class Compiled implements ConfigLoaderInterface { @@ -17,6 +20,11 @@ class Compiled implements ConfigLoaderInterface */ private $configCache = []; + /** + * @var SerializerInterface + */ + private $serializer; + /** * {inheritdoc} */ @@ -25,18 +33,33 @@ class Compiled implements ConfigLoaderInterface if (isset($this->configCache[$area])) { return $this->configCache[$area]; } - $this->configCache[$area] = \unserialize(\file_get_contents(self::getFilePath($area))); + $this->configCache[$area] = $this->getSerializer()->unserialize(\file_get_contents(self::getFilePath($area))); return $this->configCache[$area]; } /** - * Returns path to cached configuration + * Returns path to compiled configuration * * @param string $area * @return string */ public static function getFilePath($area) { - return BP . '/var/di/' . $area . '.ser'; + $diPath = DirectoryList::getDefaultConfig()[DirectoryList::DI][DirectoryList::PATH]; + return BP . '/' . $diPath . '/' . $area . '.ser'; + } + + /** + * Get serializer + * + * @return SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if (null === $this->serializer) { + $this->serializer = new Serialize(); + } + return $this->serializer; } } diff --git a/lib/internal/Magento/Framework/App/ObjectManagerFactory.php b/lib/internal/Magento/Framework/App/ObjectManagerFactory.php index 3a007841532cc84258b7a1a4d5d03aff927b4161..530c7c43599dfcdc8749491716f0239079d16243 100644 --- a/lib/internal/Magento/Framework/App/ObjectManagerFactory.php +++ b/lib/internal/Magento/Framework/App/ObjectManagerFactory.php @@ -1,7 +1,5 @@ <?php /** - * Initialize application object manager. - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ @@ -10,22 +8,15 @@ namespace Magento\Framework\App; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem\DriverPool; use Magento\Framework\Interception\ObjectManager\ConfigInterface; -use Magento\Framework\ObjectManager\Definition\Compiled\Serialized; use Magento\Framework\App\ObjectManager\Environment; use Magento\Framework\Config\File\ConfigFilePool; use Magento\Framework\Code\GeneratedFiles; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - * Class ObjectManagerFactory */ class ObjectManagerFactory { - /** - * Path to definitions format in deployment configuration - */ - const CONFIG_PATH_DEFINITION_FORMAT = 'definition/format'; - /** * Initialization parameter for a custom deployment configuration file */ @@ -117,18 +108,16 @@ class ObjectManagerFactory $arguments = array_merge($deploymentConfig->get(), $arguments); $definitionFactory = new \Magento\Framework\ObjectManager\DefinitionFactory( $this->driverPool->getDriver(DriverPool::FILE), - $this->directoryList->getPath(DirectoryList::DI), - $this->directoryList->getPath(DirectoryList::GENERATION), - $deploymentConfig->get(self::CONFIG_PATH_DEFINITION_FORMAT, Serialized::MODE_NAME) + $this->directoryList->getPath(DirectoryList::GENERATION) ); - $definitions = $definitionFactory->createClassDefinition($deploymentConfig->get('definitions')); + $definitions = $definitionFactory->createClassDefinition(); $relations = $definitionFactory->createRelations(); /** @var EnvironmentFactory $envFactory */ $envFactory = new $this->envFactoryClassName($relations, $definitions); /** @var EnvironmentInterface $env */ - $env = $envFactory->createEnvironment(); + $env = $envFactory->createEnvironment(); /** @var ConfigInterface $diConfig */ $diConfig = $env->getDiConfig(); @@ -298,6 +287,8 @@ class ObjectManagerFactory * @param \Magento\Framework\ObjectManager\Config\Config $diConfig * @param \Magento\Framework\ObjectManager\DefinitionInterface $definitions * @return \Magento\Framework\Interception\PluginList\PluginList + * @deprecated + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ protected function _createPluginList( \Magento\Framework\ObjectManagerInterface $objectManager, @@ -312,8 +303,7 @@ class ObjectManagerFactory 'relations' => $relations, 'definitions' => $definitionFactory->createPluginDefinition(), 'omConfig' => $diConfig, - 'classDefinitions' => $definitions instanceof - \Magento\Framework\ObjectManager\Definition\Compiled ? $definitions : null + 'classDefinitions' => null ] ); } diff --git a/lib/internal/Magento/Framework/App/ReinitableConfig.php b/lib/internal/Magento/Framework/App/ReinitableConfig.php index 9944978785f54445eb0da3cd8007ec7b27712ed4..2d50bbadabbfefd81ef59a9be7a8ee7e193169fb 100644 --- a/lib/internal/Magento/Framework/App/ReinitableConfig.php +++ b/lib/internal/Magento/Framework/App/ReinitableConfig.php @@ -7,6 +7,10 @@ namespace Magento\Framework\App; use Magento\Framework\App\Config\ReinitableConfigInterface; +/** + * @inheritdoc + * @deprecated + */ class ReinitableConfig extends MutableScopeConfig implements ReinitableConfigInterface { /** @@ -14,7 +18,7 @@ class ReinitableConfig extends MutableScopeConfig implements ReinitableConfigInt */ public function reinit() { - $this->_scopePool->clean(); + $this->clean(); return $this; } } diff --git a/lib/internal/Magento/Framework/App/ResourceConnection/Config.php b/lib/internal/Magento/Framework/App/ResourceConnection/Config.php index 9cd03c8372e1753c1268e4a523a1407151cefa52..e967bb1b007b9d495e3eaed6bfb399ce247ecdba 100644 --- a/lib/internal/Magento/Framework/App/ResourceConnection/Config.php +++ b/lib/internal/Magento/Framework/App/ResourceConnection/Config.php @@ -1,14 +1,16 @@ <?php /** - * Resource configuration. Uses application configuration to retrieve resource connection information. - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\App\ResourceConnection; use Magento\Framework\Config\ConfigOptionsListConstants; +use Magento\Framework\Serialize\SerializerInterface; +/** + * Resource configuration, uses application configuration to retrieve resource connection information + */ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInterface { /** @@ -19,11 +21,24 @@ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInte protected $_connectionNames = []; /** + * @var \Magento\Framework\App\DeploymentConfig + */ + private $deploymentConfig; + + /** + * @var bool + */ + private $initialized = false; + + /** + * Constructor + * * @param Config\Reader $reader * @param \Magento\Framework\Config\ScopeInterface $configScope * @param \Magento\Framework\Config\CacheInterface $cache * @param \Magento\Framework\App\DeploymentConfig $deploymentConfig - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer * @throws \InvalidArgumentException */ public function __construct( @@ -31,17 +46,11 @@ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInte \Magento\Framework\Config\ScopeInterface $configScope, \Magento\Framework\Config\CacheInterface $cache, \Magento\Framework\App\DeploymentConfig $deploymentConfig, - $cacheId = 'resourcesCache' + $cacheId = 'resourcesCache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $configScope, $cache, $cacheId); - - $resource = $deploymentConfig->getConfigData(ConfigOptionsListConstants::KEY_RESOURCE); - foreach ($resource as $resourceName => $resourceData) { - if (!isset($resourceData['connection'])) { - throw new \InvalidArgumentException('Invalid initial resource configuration'); - } - $this->_connectionNames[$resourceName] = $resourceData['connection']; - } + parent::__construct($reader, $configScope, $cache, $cacheId, $serializer); + $this->deploymentConfig = $deploymentConfig; } /** @@ -52,6 +61,7 @@ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInte */ public function getConnectionName($resourceName) { + $this->initConnections(); $connectionName = \Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION; $resourceName = preg_replace("/_setup$/", '', $resourceName); @@ -80,4 +90,23 @@ class Config extends \Magento\Framework\Config\Data\Scoped implements ConfigInte return $connectionName; } + + /** + * Initialise connections + * + * @return void + */ + private function initConnections() + { + if (!$this->initialized) { + $this->initialized = true; + $resource = $this->deploymentConfig->getConfigData(ConfigOptionsListConstants::KEY_RESOURCE) ?: []; + foreach ($resource as $resourceName => $resourceData) { + if (!isset($resourceData['connection'])) { + throw new \InvalidArgumentException('Invalid initial resource configuration'); + } + $this->_connectionNames[$resourceName] = $resourceData['connection']; + } + } + } } diff --git a/lib/internal/Magento/Framework/App/Route/Config.php b/lib/internal/Magento/Framework/App/Route/Config.php index 70968c84d77fcf7de3951b182fd7cde2a12e365d..60412e7fa888b2969067ab7e73725b5f39d301a9 100644 --- a/lib/internal/Magento/Framework/App/Route/Config.php +++ b/lib/internal/Magento/Framework/App/Route/Config.php @@ -7,6 +7,8 @@ */ namespace Magento\Framework\App\Route; +use Magento\Framework\Serialize\SerializerInterface; + class Config implements ConfigInterface { /** @@ -39,6 +41,11 @@ class Config implements ConfigInterface */ protected $_routes; + /** + * @var SerializerInterface + */ + private $serializer; + /** * @param Config\Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache @@ -73,7 +80,7 @@ class Config implements ConfigInterface return $this->_routes[$scope]; } $cacheId = $scope . '::' . $this->_cacheId; - $cachedRoutes = unserialize($this->_cache->load($cacheId)); + $cachedRoutes = $this->getSerializer()->unserialize($this->_cache->load($cacheId)); if (is_array($cachedRoutes)) { $this->_routes[$scope] = $cachedRoutes; return $cachedRoutes; @@ -81,7 +88,8 @@ class Config implements ConfigInterface $routers = $this->_reader->read($scope); $routes = $routers[$this->_areaList->getDefaultRouter($scope)]['routes']; - $this->_cache->save(serialize($routes), $cacheId); + $routesData = $this->getSerializer()->serialize($routes); + $this->_cache->save($routesData, $cacheId); $this->_routes[$scope] = $routes; return $routes; } @@ -133,4 +141,19 @@ class Config implements ConfigInterface return array_unique($modules); } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/lib/internal/Magento/Framework/App/Router/ActionList.php b/lib/internal/Magento/Framework/App/Router/ActionList.php index 11ee22a5f375ebd5f08e6cb7d606c5a4787074db..ec46154b2553ac2bc7f1d6e288a04f63602d25f7 100644 --- a/lib/internal/Magento/Framework/App/Router/ActionList.php +++ b/lib/internal/Magento/Framework/App/Router/ActionList.php @@ -6,6 +6,8 @@ */ namespace Magento\Framework\App\Router; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Serialize\Serializer\Serialize; use Magento\Framework\Module\Dir\Reader as ModuleReader; class ActionList @@ -36,27 +38,42 @@ class ActionList ]; /** + * @var SerializerInterface + */ + private $serializer; + + /** + * @var string + */ + private $actionInterface; + + /** + * ActionList constructor + * * @param \Magento\Framework\Config\CacheInterface $cache * @param ModuleReader $moduleReader * @param string $actionInterface * @param string $cacheKey * @param array $reservedWords + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Config\CacheInterface $cache, ModuleReader $moduleReader, $actionInterface = \Magento\Framework\App\ActionInterface::class, $cacheKey = 'app_action_list', - $reservedWords = [] + $reservedWords = [], + SerializerInterface $serializer = null ) { $this->reservedWords = array_merge($reservedWords, $this->reservedWords); $this->actionInterface = $actionInterface; + $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()->get(Serialize::class); $data = $cache->load($cacheKey); if (!$data) { $this->actions = $moduleReader->getActionFiles(); - $cache->save(serialize($this->actions), $cacheKey); + $cache->save($this->serializer->serialize($this->actions), $cacheKey); } else { - $this->actions = unserialize($data); + $this->actions = $this->serializer->unserialize($data); } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/TypeListTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/TypeListTest.php index a6074f6c457402054cae24c5ac05a499ef21e8fe..d185219becefed1935960b78467c98316c8bbcc3 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/TypeListTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/TypeListTest.php @@ -7,6 +7,7 @@ namespace Magento\Framework\App\Test\Unit\Cache; use \Magento\Framework\App\Cache\TypeList; +use Magento\Framework\Serialize\SerializerInterface; /** * Test class for \Magento\Framework\App\Cache\TypeList @@ -48,6 +49,11 @@ class TypeListTest extends \PHPUnit_Framework_TestCase */ const CACHE_TYPE = \Magento\Framework\Cache\FrontendInterface::class; + /** + * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + protected function setUp() { $this->_typesArray = [ @@ -85,6 +91,7 @@ class TypeListTest extends \PHPUnit_Framework_TestCase '', false ); + $this->serializerMock = $this->getMock(SerializerInterface::class); $objectHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->_typeList = $objectHelper->getObject( @@ -93,7 +100,8 @@ class TypeListTest extends \PHPUnit_Framework_TestCase 'config' => $this->_config, 'cacheState' => $cacheState, 'factory' => $factory, - 'cache' => $this->_cache + 'cache' => $this->_cache, + 'serializer' => $this->serializerMock, ] ); } @@ -118,8 +126,12 @@ class TypeListTest extends \PHPUnit_Framework_TestCase { $expectation = [self::TYPE_KEY => $this->_getPreparedType()]; $this->_cache->expects($this->once())->method('load')->with(TypeList::INVALIDATED_TYPES)->will( - $this->returnValue(serialize($this->_typesArray)) + $this->returnValue('serializedData') ); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with('serializedData') + ->willReturn($this->_typesArray); $this->assertEquals($expectation, $this->_typeList->getInvalidated()); } @@ -132,8 +144,12 @@ class TypeListTest extends \PHPUnit_Framework_TestCase $expectedInvalidated = [ self::TYPE_KEY => 1, ]; + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($expectedInvalidated) + ->willReturn('serializedData'); $this->_cache->expects($this->once())->method('save')->with( - serialize($expectedInvalidated), + 'serializedData', TypeList::INVALIDATED_TYPES ); $this->_typeList->invalidate(self::TYPE_KEY); @@ -147,8 +163,12 @@ class TypeListTest extends \PHPUnit_Framework_TestCase $expectedInvalidated = [ self::TYPE_KEY => 1, ]; + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($expectedInvalidated) + ->willReturn('serializedData'); $this->_cache->expects($this->once())->method('save')->with( - serialize($expectedInvalidated), + 'serializedData', TypeList::INVALIDATED_TYPES ); $this->_typeList->invalidate([self::TYPE_KEY]); @@ -156,15 +176,23 @@ class TypeListTest extends \PHPUnit_Framework_TestCase public function testCleanType() { + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with('serializedData') + ->willReturn($this->_typesArray); $this->_cache->expects($this->once())->method('load')->with(TypeList::INVALIDATED_TYPES)->will( - $this->returnValue(serialize($this->_typesArray)) + $this->returnValue('serializedData') ); $this->_config->expects($this->once())->method('getType')->with(self::TYPE_KEY)->will( $this->returnValue(['instance' => self::CACHE_TYPE]) ); unset($this->_typesArray[self::TYPE_KEY]); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($this->_typesArray) + ->willReturn('serializedData'); $this->_cache->expects($this->once())->method('save')->with( - serialize($this->_typesArray), + 'serializedData', TypeList::INVALIDATED_TYPES ); $this->_typeList->cleanType(self::TYPE_KEY); diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/ConfigSourceAggregatedTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/ConfigSourceAggregatedTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9ddd8e325671afa3199270522811027308c222e6 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/ConfigSourceAggregatedTest.php @@ -0,0 +1,69 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Test\Unit\Config; + +use Magento\Framework\App\Config\ConfigSourceAggregated; +use Magento\Framework\App\Config\ConfigSourceInterface; + +class ConfigSourceAggregatedTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $sourceMock; + + /** + * @var ConfigSourceInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $sourceMockTwo; + + /** + * @var ConfigSourceAggregated + */ + private $source; + + public function setUp() + { + $this->sourceMock = $this->getMockBuilder(ConfigSourceInterface::class) + ->getMockForAbstractClass(); + $this->sourceMockTwo = $this->getMockBuilder(ConfigSourceInterface::class) + ->getMockForAbstractClass(); + + $sources = [ + [ + 'source' => $this->sourceMockTwo, + 'sortOrder' => 100 + ], + [ + 'source' => $this->sourceMock, + 'sortOrder' => 10 + ], + + ]; + + $this->source = new ConfigSourceAggregated($sources); + } + + public function testGet() + { + $path = 'path'; + $this->sourceMock->expects($this->once()) + ->method('get') + ->with($path) + ->willReturn(['key' => 'value1', 'test' => false]); + $this->sourceMockTwo->expects($this->once()) + ->method('get') + ->with($path) + ->willReturn(['key' => 'value2']); + $this->assertEquals( + [ + 'test' => false, + 'key' => 'value2' + ], + $this->source->get($path) + ); + } +} diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialConfigSourceTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialConfigSourceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e1b8d1e465141c4a724c891f5fae1d09eaa87299 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialConfigSourceTest.php @@ -0,0 +1,54 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\App\Test\Unit\Config; + + +use Magento\Framework\App\Config\InitialConfigSource; +use Magento\Framework\App\DeploymentConfig\Reader; + +class InitialConfigSourceTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Reader|\PHPUnit_Framework_MockObject_MockObject + */ + private $reader; + + /** + * @var string + */ + private $configType; + + /** + * @var string + */ + private $fileKey; + + /** + * @var InitialConfigSource + */ + private $source; + + public function setUp() + { + $this->reader = $this->getMockBuilder(Reader::class) + ->disableOriginalConstructor() + ->getMock(); + $this->configType = 'configType'; + $this->fileKey = 'file.php'; + $this->source = new InitialConfigSource($this->reader, $this->configType, $this->fileKey); + } + + public function testGet() + { + $path = 'path'; + $this->reader->expects($this->once()) + ->method('load') + ->with($this->fileKey) + ->willReturn([$this->configType => [$path => 'value']]); + $this->assertEquals('value', $this->source->get($path)); + } +} diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialTest.php index ce85753bedab5463799390149386a36ed6143803..941a670b1b44c8848371788826dcc3953a4fa8a1 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/InitialTest.php @@ -7,59 +7,68 @@ namespace Magento\Framework\App\Test\Unit\Config; class InitialTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\Framework\App\Config\Initial */ - protected $_model; + private $config; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\Cache\Type\Config|\PHPUnit_Framework_MockObject_MockObject */ - protected $_initialReaderMock; + private $cacheMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var array */ - protected $_configCacheMock; + private $data = [ + 'data' => [ + 'default' => ['key' => 'default_value'], + 'stores' => ['default' => ['key' => 'store_value']], + 'websites' => ['default' => ['key' => 'website_value']], + ], + 'metadata' => ['metadata'], + ]; protected function setUp() { - $this->_initialReaderMock = - $this->getMock(\Magento\Framework\App\Config\Initial\Reader::class, [], [], '', false); - $this->_configCacheMock = - $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false); - $serializedData = serialize( + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->cacheMock = $this->getMock( + \Magento\Framework\App\Cache\Type\Config::class, + [], + [], + '', + false + ); + $this->cacheMock->expects($this->any()) + ->method('load') + ->with('initial_config') + ->willReturn(json_encode($this->data)); + $serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); + $serializerMock->method('unserialize') + ->willReturn($this->data); + + $this->config = $this->objectManager->getObject( + \Magento\Framework\App\Config\Initial::class, [ - 'data' => [ - 'default' => ['key' => 'default_value'], - 'stores' => ['default' => ['key' => 'store_value']], - 'websites' => ['default' => ['key' => 'website_value']], - ], - 'metadata' => ['metadata'], + 'cache' => $this->cacheMock, + 'serializer' => $serializerMock, ] ); - $this->_configCacheMock->expects( - $this->any() - )->method( - 'load' - )->with( - 'initial_config' - )->will( - $this->returnValue($serializedData) - ); - - $this->_model = new \Magento\Framework\App\Config\Initial($this->_initialReaderMock, $this->_configCacheMock); } /** - * @dataProvider getDataDataProvider - * * @param string $scope - * @param array $expectedResult + * @param array $expected + * @dataProvider getDataDataProvider */ - public function testGetData($scope, $expectedResult) + public function testGetData($scope, $expected) { - $this->assertEquals($expectedResult, $this->_model->getData($scope)); + $this->assertEquals($expected, $this->config->getData($scope)); } public function getDataDataProvider() @@ -73,7 +82,6 @@ class InitialTest extends \PHPUnit_Framework_TestCase public function testGetMetadata() { - $expectedResult = ['metadata']; - $this->assertEquals($expectedResult, $this->_model->getMetadata()); + $this->assertEquals(['metadata'], $this->config->getMetadata()); } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/MetadataConfigTypeProcessorTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/MetadataConfigTypeProcessorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f1bedf1c3276b338075f83694fe0b1e8917192a0 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/MetadataConfigTypeProcessorTest.php @@ -0,0 +1,79 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Test\Unit\Config; + +class MetadataConfigTypeProcessorTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\App\Config\MetadataProcessor + */ + protected $_model; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $_initialConfigMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $_modelPoolMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $_backendModelMock; + + protected function setUp() + { + $this->_modelPoolMock = $this->getMock( + \Magento\Framework\App\Config\Data\ProcessorFactory::class, + [], + [], + '', + false + ); + $this->_initialConfigMock = $this->getMock(\Magento\Framework\App\Config\Initial::class, [], [], '', false); + $this->_backendModelMock = $this->getMock(\Magento\Framework\App\Config\Data\ProcessorInterface::class); + $this->_initialConfigMock->expects( + $this->any() + )->method( + 'getMetadata' + )->will( + $this->returnValue(['some/config/path' => ['backendModel' => 'Custom_Backend_Model']]) + ); + $this->_model = new \Magento\Framework\App\Config\MetadataConfigTypeProcessor( + $this->_modelPoolMock, + $this->_initialConfigMock + ); + } + + public function testProcess() + { + $this->_modelPoolMock->expects( + $this->once() + )->method( + 'get' + )->with( + 'Custom_Backend_Model' + )->will( + $this->returnValue($this->_backendModelMock) + ); + $this->_backendModelMock->expects( + $this->once() + )->method( + 'processValue' + )->with( + 'value' + )->will( + $this->returnValue('processed_value') + ); + $data = ['default' => [ 'some' => ['config' => ['path' => 'value']], 'active' => 1]]; + $expectedResult = $data; + $expectedResult['default']['some']['config']['path'] = 'processed_value'; + $this->assertEquals($expectedResult, $this->_model->process($data)); + } +} diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopeCodeResolverTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopeCodeResolverTest.php new file mode 100644 index 0000000000000000000000000000000000000000..cbf671479877bedc1f6bb55f682f60b329e105bf --- /dev/null +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopeCodeResolverTest.php @@ -0,0 +1,68 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Test\Unit\Config; + +use Magento\Framework\App\Config\ScopeCodeResolver; +use Magento\Framework\App\ScopeInterface; +use Magento\Framework\App\ScopeResolverInterface; +use Magento\Framework\App\ScopeResolverPool; + +class ScopeCodeResolverTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ScopeResolverPool|\PHPUnit_Framework_MockObject_MockObject + */ + private $scopeResolverPool; + + /** + * @var ScopeResolverInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $scopeResolver; + + /** + * @var ScopeInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $scope; + + /** + * @var ScopeCodeResolver + */ + private $scopeCodeResolver; + + public function setUp() + { + $this->scopeResolverPool = $this->getMockBuilder(ScopeResolverPool::class) + ->disableOriginalConstructor() + ->getMock(); + $this->scopeResolver = $this->getMockBuilder(ScopeResolverInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->scope = $this->getMockBuilder(ScopeInterface::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->scopeCodeResolver = new ScopeCodeResolver($this->scopeResolverPool); + } + + public function testResolve() + { + $scopeType = 'website'; + $scopeCode = 'myWebsite'; + $scopeId = 4; + $this->scopeResolverPool->expects($this->once()) + ->method('get') + ->with($scopeType) + ->willReturn($this->scopeResolver); + $this->scopeResolver->expects($this->once()) + ->method('getScope') + ->with($scopeId) + ->willReturn($this->scope); + $this->scope->expects($this->once()) + ->method('getCode') + ->willReturn($scopeCode); + $this->assertEquals($scopeCode, $this->scopeCodeResolver->resolve($scopeType, $scopeId)); + } +} diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopePoolTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopePoolTest.php deleted file mode 100644 index 6c9ae8a09a77de9481e80de94c1b2faa1a19bf42..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/App/Test/Unit/Config/ScopePoolTest.php +++ /dev/null @@ -1,168 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\App\Test\Unit\Config; - -use Magento\Framework\App\Config\Scope\ReaderInterface; -use Magento\Framework\App\Config\Scope\ReaderPoolInterface; - -class ScopePoolTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var ReaderInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_reader; - - /** - * @var ReaderPoolInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_readerPool; - - /** - * @var \Magento\Framework\App\Config\DataFactory|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_dataFactory; - - /** - * @var \Magento\Framework\Cache\FrontendInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_cache; - - /** - * @var \Magento\Framework\App\Config\ScopePool - */ - protected $_object; - - protected function setUp() - { - $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->_readerPool = $this->getMockForAbstractClass(ReaderPoolInterface::class); - $this->_reader = $this->getMockForAbstractClass(ReaderInterface::class); - $this->_dataFactory = $this->getMockBuilder( - \Magento\Framework\App\Config\DataFactory::class - )->disableOriginalConstructor()->getMock(); - $this->_cache = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class); - $this->_object = $helper->getObject( - \Magento\Framework\App\Config\ScopePool::class, - [ - 'readerPool' => $this->_readerPool, - 'dataFactory' => $this->_dataFactory, - 'cache' => $this->_cache, - 'cacheId' => 'test_cache_id' - ] - ); - - $requestMock = $this->getMockBuilder(\Magento\Framework\App\RequestInterface::class) - ->disableOriginalConstructor() - ->setMethods( - [ - 'getBasePath', - 'getModuleName', - 'setModuleName', - 'getActionName', - 'setActionName', - 'getParam', - 'getParams', - 'setParams', - 'getCookie', - 'isSecure', - 'getServer', - 'getHttpHost' - ] - )->getMock(); - $reflection = new \ReflectionClass(get_class($this->_object)); - $reflectionProperty = $reflection->getProperty('request'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->_object, $requestMock); - $requestMock->expects($this->any()) - ->method('getBasePath') - ->willReturn('baseUrl'); - } - - /** - * @dataProvider getScopeDataProvider - * - * @param string $scopeType - * @param string $scope - * @param array $data - * @param string|null $cachedData - */ - public function testGetScope($scopeType, $scope, array $data, $cachedData) - { - $scopeCode = $scope instanceof \Magento\Framework\App\ScopeInterface ? $scope->getCode() : $scope; - $cacheKey = "test_cache_id|{$scopeType}|{$scopeCode}|baseUrl"; - - $this->_readerPool->expects( - $this->any() - )->method( - 'getReader' - )->with( - $scopeType - )->will( - $this->returnValue($this->_reader) - ); - $this->_cache->expects($this->once())->method('load')->with($cacheKey)->will($this->returnValue($cachedData)); - - if (!$cachedData) { - $this->_reader->expects($this->once())->method('read')->with('testScope')->will($this->returnValue($data)); - $this->_cache->expects( - $this->once() - )->method( - 'save' - )->with( - serialize($data), - $cacheKey, - [\Magento\Framework\App\Config\ScopePool::CACHE_TAG] - ); - } - - $configData = $this->getMockBuilder(\Magento\Framework\App\Config\Data::class) - ->disableOriginalConstructor() - ->getMock(); - $this->_dataFactory->expects( - $this->once() - )->method( - 'create' - )->with( - ['data' => $data] - )->will( - $this->returnValue($configData) - ); - $this->assertInstanceOf( - \Magento\Framework\App\Config\DataInterface::class, - $this->_object->getScope($scopeType, $scope) - ); - - // second call to check caching - $this->assertInstanceOf( - \Magento\Framework\App\Config\DataInterface::class, - $this->_object->getScope($scopeType, $scope) - ); - } - - public function getScopeDataProvider() - { - $baseScope = $this->getMockForAbstractClass(\Magento\Framework\App\ScopeInterface::class); - $baseScope->expects($this->any())->method('getCode')->will($this->returnValue('testScope')); - return [ - ['scopeType1', 'testScope', ['key' => 'value'], null], - ['scopeType2', 'testScope', ['key' => 'value'], serialize(['key' => 'value'])], - ['scopeType1', $baseScope, ['key' => 'value'], null] - ]; - } - - public function testClean() - { - $this->_cache->expects( - $this->once() - )->method( - 'clean' - )->with( - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, - [\Magento\Framework\App\Config\ScopePool::CACHE_TAG] - ); - $this->_object->clean('testScope'); - } -} diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ConfigTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d2474829693e40a16890041c25791f05525defe3 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Test/Unit/ConfigTest.php @@ -0,0 +1,83 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\App\Test\Unit; + +use Magento\Framework\App\Config; +use Magento\Framework\App\Config\ConfigTypeInterface; +use Magento\Framework\App\Config\ScopeCodeResolver; +use Magento\Framework\App\ScopeInterface; + +class ConfigTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ScopeCodeResolver|\PHPUnit_Framework_MockObject_MockObject + */ + private $scopeCodeResolver; + + /** + * @var ConfigTypeInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $configType; + + /** + * @var ScopeInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $scope; + + /** + * @var Config + */ + private $appConfig; + + public function setUp() + { + $this->scopeCodeResolver = $this->getMockBuilder(ScopeCodeResolver::class) + ->disableOriginalConstructor() + ->getMock(); + $this->configType = $this->getMockBuilder(ConfigTypeInterface::class) + ->getMockForAbstractClass(); + $this->scope = $this->getMockBuilder(ScopeInterface::class) + ->getMockForAbstractClass(); + + $this->appConfig = new Config($this->scopeCodeResolver, ['system' => $this->configType]); + } + + /** + * @param string $scope + * @param string|null $scopeCode + * + * @dataProvider getValueDataProvider + * @return void + */ + public function testGetValue($scope, $scopeCode = null) + { + $path = 'path'; + if (!is_string($scope)) { + $this->scopeCodeResolver->expects($this->once()) + ->method('resolve') + ->with('stores', $scopeCode) + ->willReturn('myStore'); + } elseif (!$scopeCode) { + $this->scope->expects($this->once()) + ->method('getCode') + ->willReturn('myWebsite'); + } + $this->configType->expects($this->once()) + ->method('get') + ->with($scope =='store' ? 'stores/path' : 'websites/myWebsite/path') + ->willReturn(true); + + $this->assertTrue($this->appConfig->getValue($path, $scope, $scopeCode ?: $this->scope)); + } + + public function getValueDataProvider() + { + return [ + ['store', 1], + ['website'], + ]; + } +} diff --git a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/ReaderTest.php b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/ReaderTest.php index b78e5a536ac9d3757f537822851a3e450788aa9b..a321775883e09abb951aa3179a24d2ec82ce6370 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/ReaderTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/ReaderTest.php @@ -61,6 +61,10 @@ class ReaderTest extends \PHPUnit_Framework_TestCase ->expects($this->any()) ->method('getPaths') ->willReturn(['configKeyOne' => 'config.php', 'configKeyTwo' => 'env.php']); + $this->configFilePool + ->expects($this->any()) + ->method('getInitialFilePools') + ->willReturn([]); } public function testGetFile() @@ -103,6 +107,7 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $configFilePool = $this->getMock(\Magento\Framework\Config\File\ConfigFilePool::class, [], [], '', false); $configFilePool->expects($this->any())->method('getPaths')->willReturn([$file]); $configFilePool->expects($this->any())->method('getPath')->willReturn($file); + $configFilePool->expects($this->any())->method('getInitialFilePools')->willReturn([]); $object = new Reader($this->dirList, $this->driverPool, $configFilePool, $file); $this->assertSame($expected, $object->load($file)); } @@ -130,6 +135,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase ->expects($this->any()) ->method('getPath') ->will($this->returnValueMap($files)); + $configFilePool->expects($this->any()) + ->method('getInitialFilePools') + ->willReturn([]); $configFilePool ->expects($this->any()) ->method('getPaths') @@ -150,6 +158,9 @@ class ReaderTest extends \PHPUnit_Framework_TestCase ->expects($this->any()) ->method('getPath') ->will($this->returnValueMap($files)); + $configFilePool->expects($this->any()) + ->method('getInitialFilePools') + ->willReturn([]); $configFilePool ->expects($this->any()) ->method('getPaths') diff --git a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/WriterTest.php b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/WriterTest.php index de06f6f18a5909093a0b5d45e8c2b34c2f1940b9..02d3ade243b8319f458b28a24977bd7893240ad8 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/WriterTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/DeploymentConfig/WriterTest.php @@ -18,6 +18,11 @@ use Magento\Framework\Filesystem\Directory\ReadInterface; use Magento\Framework\Filesystem\Directory\WriteInterface; use Magento\Framework\Phrase; +/** + * @covers \Magento\Framework\App\DeploymentConfig\Writer + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @package Magento\Framework\App\Test\Unit\DeploymentConfig + */ class WriterTest extends \PHPUnit_Framework_TestCase { /** @var Writer */ @@ -76,8 +81,7 @@ class WriterTest extends \PHPUnit_Framework_TestCase public function testSaveConfig() { $configFiles = [ - ConfigFilePool::APP_CONFIG => 'test_conf.php', - 'test_key' => 'test2_conf.php' + ConfigFilePool::APP_CONFIG => 'config.php' ]; $testSetExisting = [ @@ -113,13 +117,14 @@ class WriterTest extends \PHPUnit_Framework_TestCase $this->deploymentConfig->expects($this->once())->method('resetData'); $this->configFilePool->expects($this->once())->method('getPaths')->willReturn($configFiles); $this->dirWrite->expects($this->any())->method('isExist')->willReturn(true); - $this->reader->expects($this->once())->method('load')->willReturn($testSetExisting[ConfigFilePool::APP_CONFIG]); + $this->reader->expects($this->once())->method('loadConfigFile') + ->willReturn($testSetExisting[ConfigFilePool::APP_CONFIG]); $this->formatter ->expects($this->once()) ->method('format') ->with($testSetExpected[ConfigFilePool::APP_CONFIG]) ->willReturn([]); - $this->dirWrite->expects($this->once())->method('writeFile')->with('test_conf.php', []); + $this->dirWrite->expects($this->once())->method('writeFile')->with('config.php', []); $this->object->saveConfig($testSetUpdate); } @@ -127,19 +132,7 @@ class WriterTest extends \PHPUnit_Framework_TestCase public function testSaveConfigOverride() { $configFiles = [ - ConfigFilePool::APP_CONFIG => 'test_conf.php', - 'test_key' => 'test2_conf.php' - ]; - - $testSetExisting = [ - ConfigFilePool::APP_CONFIG => [ - 'foo' => 'bar', - 'key' => 'value', - 'baz' => [ - 'test' => 'value', - 'test1' => 'value1' - ] - ], + ConfigFilePool::APP_CONFIG => 'config.php' ]; $testSetUpdate = [ @@ -152,8 +145,6 @@ class WriterTest extends \PHPUnit_Framework_TestCase $testSetExpected = [ ConfigFilePool::APP_CONFIG => [ - 'foo' => 'bar', - 'key' => 'value', 'baz' => [ 'test' => 'value2', ] @@ -163,13 +154,12 @@ class WriterTest extends \PHPUnit_Framework_TestCase $this->deploymentConfig->expects($this->once())->method('resetData'); $this->configFilePool->expects($this->once())->method('getPaths')->willReturn($configFiles); $this->dirWrite->expects($this->any())->method('isExist')->willReturn(true); - $this->reader->expects($this->once())->method('load')->willReturn($testSetExisting[ConfigFilePool::APP_CONFIG]); $this->formatter ->expects($this->once()) ->method('format') ->with($testSetExpected[ConfigFilePool::APP_CONFIG]) ->willReturn([]); - $this->dirWrite->expects($this->once())->method('writeFile')->with('test_conf.php', []); + $this->dirWrite->expects($this->once())->method('writeFile')->with('config.php', []); $this->object->saveConfig($testSetUpdate, true); } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigCacheTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigCacheTest.php index 336e958403f9198e916af3ef3fc6a3dd10af84c3..7f05857f7cc816c9e5b0be56ae3ff520ac38efa4 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigCacheTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigCacheTest.php @@ -5,49 +5,86 @@ */ namespace Magento\Framework\App\Test\Unit\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; + class ConfigCacheTest extends \PHPUnit_Framework_TestCase { /** * @var \Magento\Framework\App\ObjectManager\ConfigCache */ - protected $_configCache; + private $configCache; + + /** + * @var \Magento\Framework\App\ObjectManager\ConfigCache|\PHPUnit_Framework_MockObject_MockObject + */ + private $cacheFrontendMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_cacheFrontendMock; + private $serializerMock; protected function setUp() { - $this->_cacheFrontendMock = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class); - $this->_configCache = new \Magento\Framework\App\ObjectManager\ConfigCache($this->_cacheFrontendMock); + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->cacheFrontendMock = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class); + $this->configCache = $objectManagerHelper->getObject( + \Magento\Framework\App\ObjectManager\ConfigCache::class, + ['cacheFrontend' => $this->cacheFrontendMock] + ); + + $this->serializerMock = $this->getMock(SerializerInterface::class); + $objectManagerHelper->setBackwardCompatibleProperty( + $this->configCache, + 'serializer', + $this->serializerMock + ); } protected function tearDown() { - unset($this->_configCache); + unset($this->configCache); } - public function testGet() + /** + * @dataProvider getDataProvider + */ + public function testGet($loadData, $expectedResult) { $key = 'key'; - $this->_cacheFrontendMock->expects( + $this->cacheFrontendMock->expects( $this->once() )->method( 'load' )->with( 'diConfig' . $key )->will( - $this->returnValue(false) + $this->returnValue($loadData) ); - $this->assertEquals(false, $this->_configCache->get($key)); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($loadData) + ->willReturn($expectedResult); + $this->assertEquals($expectedResult, $this->configCache->get($key)); + } + + public function getDataProvider() + { + return [ + [false, false], + ['serialized data', ['some data']], + ]; } public function testSave() { $key = 'key'; $config = ['config']; - $this->_cacheFrontendMock->expects($this->once())->method('save')->with(serialize($config), 'diConfig' . $key); - $this->_configCache->save($config, $key); + $serializedData = 'serialized data'; + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->willReturn($serializedData); + $this->cacheFrontendMock->expects($this->once())->method('save')->with($serializedData, 'diConfig' . $key); + $this->configCache->save($config, $key); } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigLoaderTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigLoaderTest.php index 5a0b4ae96f26cf7eeebe59e0df60d6a981fb4b08..90dba092f054e04370604d061e1eb6b5088300d2 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigLoaderTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/ObjectManager/ConfigLoaderTest.php @@ -8,31 +8,38 @@ namespace Magento\Framework\App\Test\Unit\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; + class ConfigLoaderTest extends \PHPUnit_Framework_TestCase { /** * @var \Magento\Framework\App\ObjectManager\ConfigLoader */ - protected $_model; + private $object; + + /** + * @var \Magento\Framework\ObjectManager\Config\Reader\DomFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $readerFactoryMock; /** - * @var \Magento\Framework\ObjectManager\Config\Reader\DomFactory + * @var \Magento\Framework\ObjectManager\Config\Reader\Dom|\PHPUnit_Framework_MockObject_MockObject */ - protected $_readerFactoryMock; + private $readerMock; /** - * @var \Magento\Framework\ObjectManager\Config\Reader\Dom + * @var \Magento\Framework\App\Cache\Type\Config|\PHPUnit_Framework_MockObject_MockObject */ - protected $_readerMock; + private $cacheMock; /** - * @var \Magento\Framework\App\Cache\Type\Config + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_cacheMock; + private $serializerMock; protected function setUp() { - $this->_readerMock = $this->getMock( + $this->readerMock = $this->getMock( \Magento\Framework\ObjectManager\Config\Reader\Dom::class, [], [], @@ -40,7 +47,7 @@ class ConfigLoaderTest extends \PHPUnit_Framework_TestCase false ); - $this->_readerFactoryMock = $this->getMock( + $this->readerFactoryMock = $this->getMock( \Magento\Framework\ObjectManager\Config\Reader\DomFactory::class, ['create'], [], @@ -48,17 +55,29 @@ class ConfigLoaderTest extends \PHPUnit_Framework_TestCase false ); - $this->_readerFactoryMock->expects( + $this->readerFactoryMock->expects( $this->any() )->method( 'create' )->will( - $this->returnValue($this->_readerMock) + $this->returnValue($this->readerMock) ); - $this->_cacheMock = $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false); - $this->_model = new \Magento\Framework\App\ObjectManager\ConfigLoader( - $this->_cacheMock, $this->_readerFactoryMock + $this->cacheMock = $this->getMock(\Magento\Framework\App\Cache\Type\Config::class, [], [], '', false); + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->object = $objectManagerHelper->getObject( + \Magento\Framework\App\ObjectManager\ConfigLoader::class, + [ + 'cache' => $this->cacheMock, + 'readerFactory' => $this->readerFactoryMock, + ] + ); + $this->serializerMock = $this->getMock(SerializerInterface::class); + $objectManagerHelper->setBackwardCompatibleProperty( + $this->object, + 'serializer', + $this->serializerMock ); } @@ -66,23 +85,28 @@ class ConfigLoaderTest extends \PHPUnit_Framework_TestCase * @param $area * @dataProvider loadDataProvider */ - public function testLoad($area) + public function testLoadNotCached($area) { $configData = ['some' => 'config', 'data' => 'value']; + $serializedData = 'serialized data'; - $this->_cacheMock->expects( - $this->once() - )->method( - 'load' - )->with( - $area . '::DiConfig' - )->will( - $this->returnValue(false) - ); + $this->cacheMock->expects($this->once()) + ->method('load') + ->with($area . '::DiConfig') + ->will($this->returnValue(false)); + + $this->cacheMock->expects($this->once()) + ->method('save') + ->with($serializedData); + $this->readerMock->expects($this->once())->method('read')->with($area)->will($this->returnValue($configData)); - $this->_readerMock->expects($this->once())->method('read')->with($area)->will($this->returnValue($configData)); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->willReturn($serializedData); - $this->assertEquals($configData, $this->_model->load($area)); + $this->serializerMock->expects($this->never())->method('unserialize'); + + $this->assertEquals($configData, $this->object->load($area)); } /** @@ -98,4 +122,23 @@ class ConfigLoaderTest extends \PHPUnit_Framework_TestCase 'any area files' => ['any'] ]; } + + public function testLoadCached() + { + $configData = ['some' => 'config', 'data' => 'value']; + $serializedData = 'serialized data'; + + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn($serializedData); + $this->cacheMock->expects($this->never()) + ->method('save'); + $this->readerMock->expects($this->never())->method('read'); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedData) + ->willReturn($configData); + $this->serializerMock->expects($this->never())->method('serialize'); + $this->assertEquals($configData, $this->object->load('testArea')); + } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php deleted file mode 100644 index 9a35aa9104e80e3eae34c928130fd32add5f0d2e..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/App/Test/Unit/ReinitableConfigTest.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -// @codingStandardsIgnoreFile - -namespace Magento\Framework\App\Test\Unit; - -class ReinitableConfigTest extends \PHPUnit_Framework_TestCase -{ - public function testReinit() - { - $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $scopePool = $this->getMock(\Magento\Framework\App\Config\ScopePool::class, ['clean'], [], '', false); - $scopePool->expects($this->once())->method('clean'); - /** @var \Magento\Framework\App\ReinitableConfig $config */ - $config = $helper->getObject(\Magento\Framework\App\ReinitableConfig::class, ['scopePool' => $scopePool]); - $this->assertInstanceOf(\Magento\Framework\App\Config\ReinitableConfigInterface::class, $config->reinit()); - } -} diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ResourceConnection/ConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ResourceConnection/ConfigTest.php index 936a806432419a43a33207d51cfd751e71bee814..4b6944146e5ed4bb9d59ce458ea9b901403cbf69 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/ResourceConnection/ConfigTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/ResourceConnection/ConfigTest.php @@ -5,47 +5,60 @@ */ namespace Magento\Framework\App\Test\Unit\ResourceConnection; +use Magento\Framework\Config\ConfigOptionsListConstants; + class ConfigTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Framework\App\\Config + * @var \Magento\Framework\App\ResourceConnection\Config */ - protected $_model; + private $config; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Config\ScopeInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_scopeMock; + private $scopeMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_cacheMock; + private $cacheMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\ResourceConnection\Config\Reader|\PHPUnit_Framework_MockObject_MockObject */ - protected $_readerMock; + private $readerMock; /** - * @var array + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_resourcesConfig; + private $serializerMock; /** * @var array */ - protected $_initialResources; + private $resourcesConfig; + + /** + * @var \Magento\Framework\App\DeploymentConfig|\PHPUnit_Framework_MockObject_MockObject + */ + private $deploymentConfig; protected function setUp() { - $this->_scopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class); - $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); - - $this->_readerMock = - $this->getMock(\Magento\Framework\App\ResourceConnection\Config\Reader::class, [], [], '', false); + $this->scopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class); + $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + + $this->readerMock = $this->getMock( + \Magento\Framework\App\ResourceConnection\Config\Reader::class, + [], + [], + '', + false + ); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); - $this->_resourcesConfig = [ + $this->resourcesConfig = [ 'mainResourceName' => ['name' => 'mainResourceName', 'extends' => 'anotherResourceName'], 'otherResourceName' => ['name' => 'otherResourceName', 'connection' => 'otherConnectionName'], 'anotherResourceName' => ['name' => 'anotherResourceName', 'connection' => 'anotherConnection'], @@ -53,61 +66,61 @@ class ConfigTest extends \PHPUnit_Framework_TestCase 'extendedResourceName' => ['name' => 'extendedResourceName', 'extends' => 'validResource'], ]; - $this->_initialResources = [ - 'validResource' => ['connection' => 'validConnectionName'], - ]; - - $this->_cacheMock->expects( - $this->any() - )->method( - 'load' - )->will( - $this->returnValue(serialize($this->_resourcesConfig)) - ); - - $deploymentConfig = $this->getMock(\Magento\Framework\App\DeploymentConfig::class, [], [], '', false); - $deploymentConfig->expects($this->once()) - ->method('getConfigData') - ->with('resource') - ->willReturn($this->_initialResources); - - $this->_model = new \Magento\Framework\App\ResourceConnection\Config( - $this->_readerMock, - $this->_scopeMock, - $this->_cacheMock, - $deploymentConfig, - 'cacheId' + $serializedData = 'serialized data'; + $this->cacheMock->expects($this->any()) + ->method('load') + ->willReturn($serializedData); + $this->serializerMock->method('unserialize') + ->with($serializedData) + ->willReturn($this->resourcesConfig); + + $this->deploymentConfig = $this->getMock(\Magento\Framework\App\DeploymentConfig::class, [], [], '', false); + $this->config = new \Magento\Framework\App\ResourceConnection\Config( + $this->readerMock, + $this->scopeMock, + $this->cacheMock, + $this->deploymentConfig, + 'cacheId', + $this->serializerMock ); } /** - * @dataProvider getConnectionNameDataProvider * @param string $resourceName * @param string $connectionName + * @dataProvider getConnectionNameDataProvider */ public function testGetConnectionName($resourceName, $connectionName) { - $this->assertEquals($connectionName, $this->_model->getConnectionName($resourceName)); + $this->deploymentConfig->expects($this->once()) + ->method('getConfigData') + ->with(ConfigOptionsListConstants::KEY_RESOURCE) + ->willReturn([ + 'validResource' => ['connection' => 'validConnectionName'], + ]); + $this->assertEquals($connectionName, $this->config->getConnectionName($resourceName)); } /** * @expectedException \InvalidArgumentException */ - public function testExceptionConstructor() + public function testGetConnectionNameWithException() { - $deploymentConfig = $this->getMock(\Magento\Framework\App\DeploymentConfig::class, [], [], '', false); - $deploymentConfig->expects($this->once()) + $deploymentConfigMock = $this->getMock(\Magento\Framework\App\DeploymentConfig::class, [], [], '', false); + $deploymentConfigMock->expects($this->once()) ->method('getConfigData') - ->with('resource') + ->with(ConfigOptionsListConstants::KEY_RESOURCE) ->willReturn(['validResource' => ['somekey' => 'validConnectionName']]); - new \Magento\Framework\App\ResourceConnection\Config( - $this->_readerMock, - $this->_scopeMock, - $this->_cacheMock, - $deploymentConfig, - 'cacheId' + $config = new \Magento\Framework\App\ResourceConnection\Config( + $this->readerMock, + $this->scopeMock, + $this->cacheMock, + $deploymentConfigMock, + 'cacheId', + $this->serializerMock ); + $config->getConnectionName('default'); } /** diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Route/ConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Route/ConfigTest.php index 949ed3f9953c91782361e30e5240748c2646f0ea..fe6f8d05114c58cc0585bc44908faf3fa2a2b666 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Route/ConfigTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Route/ConfigTest.php @@ -13,7 +13,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase protected $_config; /** - * @var Cache_Mock_Wrapper + * @var \Magento\Framework\App\Route\Config\Reader|\PHPUnit_Framework_MockObject_MockObject */ protected $_readerMock; @@ -32,88 +32,76 @@ class ConfigTest extends \PHPUnit_Framework_TestCase */ protected $_areaList; + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + protected function setUp() { $this->_readerMock = $this->getMock(\Magento\Framework\App\Route\Config\Reader::class, [], [], '', false); $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class); $this->_areaList = $this->getMock(\Magento\Framework\App\AreaList::class, [], [], '', false); - $this->_configScopeMock->expects( - $this->any() - )->method( - 'getCurrentScope' - )->will( - $this->returnValue('areaCode') - ); - $this->_config = new \Magento\Framework\App\Route\Config( - $this->_readerMock, - $this->_cacheMock, - $this->_configScopeMock, - $this->_areaList + $this->_configScopeMock->expects($this->any()) + ->method('getCurrentScope') + ->willReturn('areaCode'); + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->_config = $objectManager->getObject( + \Magento\Framework\App\Route\Config::class, + [ + 'reader' => $this->_readerMock, + 'cache' => $this->_cacheMock, + 'configScope' => $this->_configScopeMock, + 'areaList' => $this->_areaList + ] ); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); + $objectManager->setBackwardCompatibleProperty($this->_config, 'serializer', $this->serializerMock); } public function testGetRouteFrontNameIfCacheIfRouterIdNotExist() { - $this->_cacheMock->expects( - $this->once() - )->method( - 'load' - )->with( - 'areaCode::RoutesConfig' - )->will( - $this->returnValue(serialize(['expected'])) - ); + $this->_cacheMock->expects($this->once()) + ->method('load') + ->with('areaCode::RoutesConfig') + ->willReturn('["expected"]'); $this->assertEquals('routerCode', $this->_config->getRouteFrontName('routerCode')); } public function testGetRouteByFrontName() { - $this->_cacheMock->expects( - $this->once() - )->method( - 'load' - )->with( - 'areaCode::RoutesConfig' - )->will( - $this->returnValue(serialize(['routerCode' => ['frontName' => 'routerName']])) - ); - - $this->assertEquals('routerCode', $this->_config->getRouteByFrontName('routerName')); - - // check internal caching in $this->_routes array + $data = ['routerCode' => ['frontName' => 'routerName']]; + $this->_cacheMock->expects($this->once()) + ->method('load') + ->with('areaCode::RoutesConfig') + ->willReturn('serializedData'); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with('serializedData') + ->willReturn($data); $this->assertEquals('routerCode', $this->_config->getRouteByFrontName('routerName')); } public function testGetRouteByFrontNameNoRoutes() { - $this->_cacheMock->expects( - $this->once() - )->method( - 'load' - )->with( - 'areaCode::RoutesConfig' - )->will( - $this->returnValue(serialize([])) - ); - - $this->assertFalse($this->_config->getRouteByFrontName('routerName')); - - // check caching in $this->_routes array + $this->_cacheMock->expects($this->once()) + ->method('load') + ->with('areaCode::RoutesConfig') + ->willReturn('serializedData'); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with('serializedData') + ->willReturn([]); $this->assertFalse($this->_config->getRouteByFrontName('routerName')); } public function testGetRouteByFrontNameNoCache() { - $this->_cacheMock->expects( - $this->once() - )->method( - 'load' - )->with( - 'scope::RoutesConfig' - )->will( - $this->returnValue(serialize(false)) - ); + $this->_cacheMock->expects($this->once()) + ->method('load') + ->with('scope::RoutesConfig') + ->willReturn('false'); $routes = [ 'routerCode' => [ @@ -127,6 +115,8 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ], ]; + $serializedData = json_encode($routes); + $this->_readerMock->expects( $this->once() )->method( @@ -147,34 +137,29 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $this->returnValue('default_router') ); - $this->_cacheMock->expects( - $this->once() - )->method( - 'save' - )->with( - serialize($routes), - 'scope::RoutesConfig' - ); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->willReturn($serializedData); - $this->assertEquals('routerCode', $this->_config->getRouteByFrontName('routerName', 'scope')); + $this->_cacheMock->expects($this->once()) + ->method('save') + ->with($serializedData, 'scope::RoutesConfig'); - // check caching in $this->_routes array $this->assertEquals('routerCode', $this->_config->getRouteByFrontName('routerName', 'scope')); } public function testGetModulesByFrontName() { - $this->_cacheMock->expects( - $this->once() - )->method( - 'load' - )->with( - 'areaCode::RoutesConfig' - )->will( - $this->returnValue( - serialize(['routerCode' => ['frontName' => 'routerName', 'modules' => ['Module1']]]) - ) - ); + $data = ['routerCode' => ['frontName' => 'routerName', 'modules' => ['Module1']]]; + + $this->_cacheMock->expects($this->once()) + ->method('load') + ->with('areaCode::RoutesConfig') + ->willReturn('serializedData'); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with('serializedData') + ->willReturn($data); $this->assertEquals(['Module1'], $this->_config->getModulesByFrontName('routerName')); } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php index c24c31e282c62255b3970e01c0994cdb52866dd8..bef703e99a33e1888faf418fdf29e806bfa15003 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Router/ActionListTest.php @@ -1,7 +1,5 @@ <?php /** - * RouterList model test class - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ @@ -12,69 +10,76 @@ class ActionListTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ - protected $objectManager; + private $objectManager; /** - * @var \Magento\Framework\Config\CacheInterface | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheMock; + private $cacheMock; /** - * @var \Magento\Framework\Module\Dir\Reader | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Module\Dir\Reader|\PHPUnit_Framework_MockObject_MockObject */ - protected $moduleReaderMock; + private $readerMock; /** * @var \Magento\Framework\App\Router\ActionList */ - protected $actionList; + private $actionList; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; protected function setUp() { $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->cacheMock = $this->getMockBuilder(\Magento\Framework\Config\CacheInterface::class) - ->disableOriginalConstructor() - ->getMock(); - $this->moduleReaderMock = $this->getMockBuilder(\Magento\Framework\Module\Dir\Reader::class) - ->disableOriginalConstructor() - ->getMock(); + $this->cacheMock = $this->getMock( + \Magento\Framework\Config\CacheInterface::class, + [], + [], + '', + false + ); + $this->readerMock = $this->getMock( + \Magento\Framework\Module\Dir\Reader::class, + [], + [], + '', + false + ); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } - public function testConstructorCachedData() + public function testConstructActionsCached() { $this->cacheMock->expects($this->once()) ->method('load') - ->will($this->returnValue(serialize('data'))); + ->willReturn('"data"'); + $this->serializerMock->expects($this->once()) + ->method('unserialize'); $this->cacheMock->expects($this->never()) ->method('save'); - $this->moduleReaderMock->expects($this->never()) + $this->readerMock->expects($this->never()) ->method('getActionFiles'); - $this->actionList = $this->objectManager->getObject( - \Magento\Framework\App\Router\ActionList::class, - [ - 'cache' => $this->cacheMock, - 'moduleReader' => $this->moduleReaderMock, - ] - ); + $this->createActionListInstance(); } - public function testConstructorNoCachedData() + public function testConstructActionsNoCached() { $this->cacheMock->expects($this->once()) ->method('load') - ->will($this->returnValue(false)); + ->willReturn(false); + $this->serializerMock->expects($this->once()) + ->method('serialize'); $this->cacheMock->expects($this->once()) ->method('save'); - $this->moduleReaderMock->expects($this->once()) + $this->readerMock->expects($this->once()) ->method('getActionFiles') - ->will($this->returnValue('data')); - $this->actionList = $this->objectManager->getObject( - \Magento\Framework\App\Router\ActionList::class, - [ - 'cache' => $this->cacheMock, - 'moduleReader' => $this->moduleReaderMock, - ] - ); + ->willReturn('data') + ; + $this->createActionListInstance(); } /** @@ -88,22 +93,15 @@ class ActionListTest extends \PHPUnit_Framework_TestCase */ public function testGet($module, $area, $namespace, $action, $data, $expected) { - $this->cacheMock->expects($this->once()) ->method('load') ->will($this->returnValue(false)); $this->cacheMock->expects($this->once()) ->method('save'); - $this->moduleReaderMock->expects($this->once()) + $this->readerMock->expects($this->once()) ->method('getActionFiles') - ->will($this->returnValue($data)); - $this->actionList = $this->objectManager->getObject( - \Magento\Framework\App\Router\ActionList::class, - [ - 'cache' => $this->cacheMock, - 'moduleReader' => $this->moduleReaderMock, - ] - ); + ->willReturn($data); + $this->createActionListInstance(); $this->assertEquals($expected, $this->actionList->get($module, $area, $namespace, $action)); } @@ -168,4 +166,16 @@ class ActionListTest extends \PHPUnit_Framework_TestCase ], ]; } + + private function createActionListInstance() + { + $this->actionList = $this->objectManager->getObject( + \Magento\Framework\App\Router\ActionList::class, + [ + 'cache' => $this->cacheMock, + 'moduleReader' => $this->readerMock, + 'serializer' => $this->serializerMock, + ] + ); + } } diff --git a/lib/internal/Magento/Framework/Cache/Config/Data.php b/lib/internal/Magento/Framework/Cache/Config/Data.php index a1f203d9aa7bb6c8ef19567f76bfe11ab893f1ce..5909fff105e2bbfda587f1715e81955bb5aa0ca7 100644 --- a/lib/internal/Magento/Framework/Cache/Config/Data.php +++ b/lib/internal/Magento/Framework/Cache/Config/Data.php @@ -1,12 +1,15 @@ <?php /** - * Cache configuration data container. Provides cache configuration data based on current config scope - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\Cache\Config; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides cached configuration data based on current config scope + */ class Data extends \Magento\Framework\Config\Data\Scoped { /** @@ -17,17 +20,21 @@ class Data extends \Magento\Framework\Config\Data\Scoped protected $_scopePriorityScheme = ['global']; /** + * Constructor + * * @param \Magento\Framework\Cache\Config\Reader $reader * @param \Magento\Framework\Config\ScopeInterface $configScope * @param \Magento\Framework\Config\CacheInterface $cache * @param string $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Cache\Config\Reader $reader, \Magento\Framework\Config\ScopeInterface $configScope, \Magento\Framework\Config\CacheInterface $cache, - $cacheId + $cacheId, + SerializerInterface $serializer = null ) { - parent::__construct($reader, $configScope, $cache, $cacheId); + parent::__construct($reader, $configScope, $cache, $cacheId, $serializer); } } diff --git a/lib/internal/Magento/Framework/Code/GeneratedFiles.php b/lib/internal/Magento/Framework/Code/GeneratedFiles.php index 75d5ff4b4b73bce4e7d82ba65b107611b0208344..f3d3c2bd611d5c0bb1795aaacc24c4701009d573 100644 --- a/lib/internal/Magento/Framework/Code/GeneratedFiles.php +++ b/lib/internal/Magento/Framework/Code/GeneratedFiles.php @@ -133,7 +133,6 @@ class GeneratedFiles return $enabledCacheTypes; } - /** * Returns path to env.php file * @@ -183,8 +182,7 @@ class GeneratedFiles * Enables apppropriate cache types in app/etc/env.php based on the passed in $cacheTypes array * TODO: to be removed in scope of MAGETWO-53476 * - * @param string[] - * + * @param string[] $cacheTypes * @return void */ private function enableCacheTypes($cacheTypes) diff --git a/lib/internal/Magento/Framework/Code/Test/Unit/GeneratedFilesTest.php b/lib/internal/Magento/Framework/Code/Test/Unit/GeneratedFilesTest.php index facf71854c575da7d093d865e8bd919c443ec7a8..ab5e0a594e14ae849ac3e6a442a93a8c62b98e64 100644 --- a/lib/internal/Magento/Framework/Code/Test/Unit/GeneratedFilesTest.php +++ b/lib/internal/Magento/Framework/Code/Test/Unit/GeneratedFilesTest.php @@ -12,12 +12,12 @@ use Magento\Framework\Code\GeneratedFiles; class GeneratedFilesTest extends \PHPUnit_Framework_TestCase { /** - * @var Magento\Framework\App\Filesystem\DirectoryList | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\App\Filesystem\DirectoryList | \PHPUnit_Framework_MockObject_MockObject */ private $directoryList; /** - * @var Magento\Framework\Filesystem\Directory\WriteInterface | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Filesystem\Directory\WriteInterface | \PHPUnit_Framework_MockObject_MockObject */ private $writeInterface; diff --git a/lib/internal/Magento/Framework/Communication/Config/Data.php b/lib/internal/Magento/Framework/Communication/Config/Data.php index e073c7c5471c2adb122c006c21371143c22eff8b..29667100b68603e9a8ff02e7f4486dfa4c55566c 100644 --- a/lib/internal/Magento/Framework/Communication/Config/Data.php +++ b/lib/internal/Magento/Framework/Communication/Config/Data.php @@ -5,23 +5,27 @@ */ namespace Magento\Framework\Communication\Config; +use Magento\Framework\Serialize\SerializerInterface; + /** - * Communication config data. + * Provides communication configuration */ class Data extends \Magento\Framework\Config\Data { /** - * Initialize dependencies. + * Constructor * * @param \Magento\Framework\Communication\Config\CompositeReader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Communication\Config\CompositeReader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'communication_config_cache' + $cacheId = 'communication_config_cache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } } diff --git a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php index b6363520dc085c75ec44a1700094e328af1fb973..304174ac52d3792054221c27d53624f34ed2ca7e 100644 --- a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php +++ b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php @@ -37,7 +37,6 @@ class ConfigOptionsListConstants */ const INPUT_KEY_ENCRYPTION_KEY = 'key'; const INPUT_KEY_SESSION_SAVE = 'session-save'; - const INPUT_KEY_DEFINITION_FORMAT = 'definition-format'; const INPUT_KEY_DB_HOST = 'db-host'; const INPUT_KEY_DB_NAME = 'db-name'; const INPUT_KEY_DB_USER = 'db-user'; @@ -51,6 +50,9 @@ class ConfigOptionsListConstants const INPUT_KEY_CACHE_HOSTS = 'http-cache-hosts'; /**#@-*/ + /** @deprecated */ + const INPUT_KEY_DEFINITION_FORMAT = 'definition-format'; + /**#@+ * Values for session-save */ diff --git a/lib/internal/Magento/Framework/Config/Converter.php b/lib/internal/Magento/Framework/Config/Converter.php index 5ea535bac5f29ccff3d8ac8c1f4675d317eb6083..b22d4d61a68673e158ed973de3d271422d0706fa 100644 --- a/lib/internal/Magento/Framework/Config/Converter.php +++ b/lib/internal/Magento/Framework/Config/Converter.php @@ -7,6 +7,11 @@ namespace Magento\Framework\Config; use Magento\Framework\View\Xsd\Media\TypeDataExtractorPool; +/** + * Class Converter convert xml to appropriate array + * + * @package Magento\Framework\Config + */ class Converter implements \Magento\Framework\Config\ConverterInterface { /** diff --git a/lib/internal/Magento/Framework/Config/Data.php b/lib/internal/Magento/Framework/Config/Data.php index ed5ed3ad9f2e20ff4046bbd09a3ab3714311eaa9..1169abafccd8f2d868d2d56c821a67a761368f38 100644 --- a/lib/internal/Magento/Framework/Config/Data.php +++ b/lib/internal/Magento/Framework/Config/Data.php @@ -1,26 +1,29 @@ <?php /** - * Config data. Represents loaded and cached configuration data. Should be used to gain access to different types - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\Config; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\App\ObjectManager; + /** + * Represents loaded and cached configuration data, should be used to gain access to different types + * * @SuppressWarnings(PHPMD.NumberOfChildren) */ class Data implements \Magento\Framework\Config\DataInterface { /** - * Configuration reader model + * Configuration reader * * @var ReaderInterface */ protected $_reader; /** - * Configuration cache model + * Configuration cache * * @var CacheInterface */ @@ -62,26 +65,35 @@ class Data implements \Magento\Framework\Config\DataInterface */ private $cacheId; + /** + * @var SerializerInterface + */ + private $serializer; + /** * Constructor * * @param ReaderInterface $reader * @param CacheInterface $cache * @param string $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( ReaderInterface $reader, CacheInterface $cache, - $cacheId + $cacheId, + SerializerInterface $serializer = null ) { $this->reader = $reader; $this->cache = $cache; $this->cacheId = $cacheId; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); $this->initData(); } /** * Initialise data for configuration + * * @return void */ protected function initData() @@ -89,10 +101,11 @@ class Data implements \Magento\Framework\Config\DataInterface $data = $this->cache->load($this->cacheId); if (false === $data) { $data = $this->reader->read(); - $this->cache->save(serialize($data), $this->cacheId, $this->cacheTags); + $this->cache->save($this->serializer->serialize($data), $this->cacheId, $this->cacheTags); } else { - $data = unserialize($data); + $data = $this->serializer->unserialize($data); } + $this->merge($data); } @@ -133,6 +146,7 @@ class Data implements \Magento\Framework\Config\DataInterface /** * Clear cache data + * * @return void */ public function reset() diff --git a/lib/internal/Magento/Framework/Config/Data/Scoped.php b/lib/internal/Magento/Framework/Config/Data/Scoped.php index 36b265ac9e6f47584917433e50c54e83999948db..f9c151e867b89726ccea1f46ed269931efee51da 100644 --- a/lib/internal/Magento/Framework/Config/Data/Scoped.php +++ b/lib/internal/Magento/Framework/Config/Data/Scoped.php @@ -5,6 +5,12 @@ */ namespace Magento\Framework\Config\Data; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\App\ObjectManager; + +/** + * Provides scoped configuration + */ class Scoped extends \Magento\Framework\Config\Data { /** @@ -49,6 +55,11 @@ class Scoped extends \Magento\Framework\Config\Data */ protected $_loadedScopes = []; + /** + * @var SerializerInterface + */ + private $serializer; + /** * Constructor * @@ -56,17 +67,20 @@ class Scoped extends \Magento\Framework\Config\Data * @param \Magento\Framework\Config\ScopeInterface $configScope * @param \Magento\Framework\Config\CacheInterface $cache * @param string $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Config\ReaderInterface $reader, \Magento\Framework\Config\ScopeInterface $configScope, \Magento\Framework\Config\CacheInterface $cache, - $cacheId + $cacheId, + SerializerInterface $serializer = null ) { $this->_reader = $reader; $this->_configScope = $configScope; $this->_cache = $cache; $this->_cacheId = $cacheId; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); } /** @@ -98,11 +112,14 @@ class Scoped extends \Magento\Framework\Config\Data if (false == isset($this->_loadedScopes[$scopeCode])) { if ($scopeCode !== 'primary' && ($data = $this->_cache->load($scopeCode . '::' . $this->_cacheId)) ) { - $data = unserialize($data); + $data = $this->serializer->unserialize($data); } else { $data = $this->_reader->read($scopeCode); if ($scopeCode !== 'primary') { - $this->_cache->save(serialize($data), $scopeCode . '::' . $this->_cacheId); + $this->_cache->save( + $this->serializer->serialize($data), + $scopeCode . '::' . $this->_cacheId + ); } } $this->merge($data); diff --git a/lib/internal/Magento/Framework/Config/File/ConfigFilePool.php b/lib/internal/Magento/Framework/Config/File/ConfigFilePool.php index c9439d0a45e8fd064dc6db4a2dc69c075c0ba38c..e84f61383c7cc86d2c5c5fda7abacc42611366d7 100644 --- a/lib/internal/Magento/Framework/Config/File/ConfigFilePool.php +++ b/lib/internal/Magento/Framework/Config/File/ConfigFilePool.php @@ -14,6 +14,9 @@ class ConfigFilePool const APP_CONFIG = 'app_config'; const APP_ENV = 'app_env'; + const LOCAL = 'local'; + const DIST = 'dist'; + /** * Default files for configuration * @@ -24,6 +27,22 @@ class ConfigFilePool self::APP_ENV => 'env.php', ]; + /** + * Initial files for configuration + * + * @var array + */ + private $initialConfigFiles = [ + self::DIST => [ + self::APP_CONFIG => 'config.dist.php', + self::APP_ENV => 'env.dist.php', + ], + self::LOCAL => [ + self::APP_CONFIG => 'config.local.php', + self::APP_ENV => 'env.local.php', + ] + ]; + /** * Constructor * @@ -35,7 +54,7 @@ class ConfigFilePool } /** - * Returns application config files + * Returns application config files. * * @return array */ @@ -58,4 +77,25 @@ class ConfigFilePool } return $this->applicationConfigFiles[$fileKey]; } + + /** + * Returns application initial config files. + * + * @return array + */ + public function getInitialFilePools() + { + return $this->initialConfigFiles; + } + + /** + * Retrieve all config file pools. + * + * @param string $pool + * @return array + */ + public function getPathsByPool($pool) + { + return $this->initialConfigFiles[$pool]; + } } diff --git a/lib/internal/Magento/Framework/Config/FileResolver.php b/lib/internal/Magento/Framework/Config/FileResolver.php index 1455eb355df7ac5e0307405fbe6560c03108f5bc..a6726b95526b34c73d232094c3bb06cd431ee533 100644 --- a/lib/internal/Magento/Framework/Config/FileResolver.php +++ b/lib/internal/Magento/Framework/Config/FileResolver.php @@ -7,7 +7,7 @@ */ namespace Magento\Framework\Config; -use Magento\Framework\Module\Dir\Reader; +use Magento\Framework\Module\Dir\Reader as DirReader; use Magento\Framework\Filesystem; use Magento\Framework\View\Design\ThemeInterface; use Magento\Framework\View\DesignInterface; @@ -24,7 +24,7 @@ class FileResolver implements \Magento\Framework\Config\FileResolverInterface, D /** * Module configuration file reader * - * @var \Magento\Framework\Module\Dir\Reader + * @var DirReader */ protected $moduleReader; @@ -54,7 +54,7 @@ class FileResolver implements \Magento\Framework\Config\FileResolverInterface, D protected $resolver; /** - * @param Reader $moduleReader + * @param DirReader $moduleReader * @param FileIteratorFactory $iteratorFactory * @param DesignInterface $designInterface * @param DirectoryList $directoryList @@ -62,7 +62,7 @@ class FileResolver implements \Magento\Framework\Config\FileResolverInterface, D * @param ResolverInterface $resolver */ public function __construct( - Reader $moduleReader, + DirReader $moduleReader, FileIteratorFactory $iteratorFactory, DesignInterface $designInterface, DirectoryList $directoryList, diff --git a/lib/internal/Magento/Framework/Config/Reader.php b/lib/internal/Magento/Framework/Config/Reader.php new file mode 100644 index 0000000000000000000000000000000000000000..f99e4e3341860d4acf33402c2623889fe523a484 --- /dev/null +++ b/lib/internal/Magento/Framework/Config/Reader.php @@ -0,0 +1,75 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Config; + +use Magento\Framework\Exception\LocalizedException; + +/** + * Read config from different sources and aggregate them + * + * @package Magento\Framework\Config + */ +class Reader implements \Magento\Framework\App\Config\Scope\ReaderInterface +{ + /** + * @var array + */ + private $sources; + + /** + * @param array $sources + */ + public function __construct(array $sources) + { + $this->sources = $this->prepareSources($sources); + } + + /** + * Read configuration data + * + * @param null|string $scope + * @throws LocalizedException Exception is thrown when scope other than default is given + * @return array + */ + public function read($scope = null) + { + $config = []; + foreach ($this->sources as $sourceData) { + /** @var \Magento\Framework\App\Config\Reader\Source\SourceInterface $source */ + $source = $sourceData['class']; + $config = array_replace_recursive($config, $source->get($scope)); + } + + return $config; + } + + /** + * Prepare source for usage + * + * @param array $array + * @return array + */ + private function prepareSources(array $array) + { + $array = array_filter( + $array, + function ($item) { + return (!isset($item['disable']) || !$item['disable']) && $item['class']; + } + ); + uasort( + $array, + function ($firstItem, $nexItem) { + if ((int)$firstItem['sortOrder'] == (int)$nexItem['sortOrder']) { + return 0; + } + return (int)$firstItem['sortOrder'] < (int)$nexItem['sortOrder'] ? -1 : 1; + } + ); + + return $array; + } +} diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/Data/ScopedTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/Data/ScopedTest.php index 496da72ceef9b45d06a498aae8bc732a08de43ae..607977b99bb42a9fcdd0162a5443186343ef06f3 100644 --- a/lib/internal/Magento/Framework/Config/Test/Unit/Data/ScopedTest.php +++ b/lib/internal/Magento/Framework/Config/Test/Unit/Data/ScopedTest.php @@ -7,6 +7,11 @@ namespace Magento\Framework\Config\Test\Unit\Data; class ScopedTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManager; + /** * @var \Magento\Framework\Config\Data\Scoped */ @@ -27,17 +32,28 @@ class ScopedTest extends \PHPUnit_Framework_TestCase */ protected $_cacheMock; + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + protected function setUp() { + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->_readerMock = $this->getMock(\Magento\Framework\Config\ReaderInterface::class); $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class); $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); - $this->_model = new \Magento\Framework\Config\Data\Scoped( - $this->_readerMock, - $this->_configScopeMock, - $this->_cacheMock, - 'tag' + $this->_model = $this->objectManager->getObject( + \Magento\Framework\Config\Data\Scoped::class, + [ + 'reader' => $this->_readerMock, + 'configScope' => $this->_configScopeMock, + 'cache' => $this->_cacheMock, + 'cacheId' => 'tag', + 'serializer' => $this->serializerMock + ] ); } @@ -47,7 +63,7 @@ class ScopedTest extends \PHPUnit_Framework_TestCase * @param string $default * @dataProvider getConfigByPathDataProvider */ - public function testgetConfigByPath($path, $expectedValue, $default) + public function testGetConfigByPath($path, $expectedValue, $default) { $testData = [ 'key_1' => [ @@ -55,7 +71,12 @@ class ScopedTest extends \PHPUnit_Framework_TestCase 'key_1.2' => ['some' => 'arrayValue'], ], ]; - $this->_cacheMock->expects($this->any())->method('load')->will($this->returnValue(serialize([]))); + $this->_cacheMock->expects($this->once()) + ->method('load') + ->willReturn(false); + $this->_readerMock->expects($this->once()) + ->method('read') + ->willReturn([]); $this->_model->merge($testData); $this->assertEquals($expectedValue, $this->_model->get($path, $default)); } @@ -77,6 +98,7 @@ class ScopedTest extends \PHPUnit_Framework_TestCase public function testGetScopeSwitchingWithNonCachedData() { $testValue = ['some' => 'testValue']; + $serializedData = 'serialized data'; /** change current area */ $this->_configScopeMock->expects( @@ -109,8 +131,15 @@ class ScopedTest extends \PHPUnit_Framework_TestCase $this->returnValue($testValue) ); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($testValue) + ->willReturn($serializedData); + /** test cache saving */ - $this->_cacheMock->expects($this->once())->method('save')->with(serialize($testValue), 'adminhtml::tag'); + $this->_cacheMock->expects($this->once()) + ->method('save') + ->with($serializedData, 'adminhtml::tag'); /** test config value existence */ $this->assertEquals('testValue', $this->_model->get('some')); @@ -122,6 +151,7 @@ class ScopedTest extends \PHPUnit_Framework_TestCase public function testGetScopeSwitchingWithCachedData() { $testValue = ['some' => 'testValue']; + $serializedData = 'serialized data'; /** change current area */ $this->_configScopeMock->expects( @@ -132,16 +162,16 @@ class ScopedTest extends \PHPUnit_Framework_TestCase $this->returnValue('adminhtml') ); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedData) + ->willReturn($testValue); + /** set cache data */ - $this->_cacheMock->expects( - $this->once() - )->method( - 'load' - )->with( - 'adminhtml::tag' - )->will( - $this->returnValue(serialize($testValue)) - ); + $this->_cacheMock->expects($this->once()) + ->method('load') + ->with('adminhtml::tag') + ->willReturn($serializedData); /** test preventing of getting data from reader */ $this->_readerMock->expects($this->never())->method('read'); diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/DataTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/DataTest.php index 5c58310e096bbd27b1ba5448e7a5da92c86da250..c37d2108191b429b4d4fa7289b5464570aad5ad9 100644 --- a/lib/internal/Magento/Framework/Config/Test/Unit/DataTest.php +++ b/lib/internal/Magento/Framework/Config/Test/Unit/DataTest.php @@ -10,33 +10,46 @@ namespace Magento\Framework\Config\Test\Unit; class DataTest extends \PHPUnit_Framework_TestCase { - /** @var \Magento\Framework\Config\ReaderInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $reader; - /** @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cache; - /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ - protected $objectManagerHelper; + /** + * @var \Magento\Framework\Config\ReaderInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $readerMock; + + /** + * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $cacheMock; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; protected function setUp() { - $this->reader = $this->getMockBuilder(\Magento\Framework\Config\ReaderInterface::class) - ->disableOriginalConstructor() - ->getMock(); - $this->cache = $this->getMockBuilder(\Magento\Framework\Config\CacheInterface::class) - ->disableOriginalConstructor() - ->getMock(); - $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->readerMock = $this->getMock(\Magento\Framework\Config\ReaderInterface::class); + $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } - public function testGet() + public function testGetConfigNotCached() { $data = ['a' => 'b']; - $cacheid = 'test'; - $this->cache->expects($this->once())->method('load')->will($this->returnValue(false)); - $this->reader->expects($this->once())->method('read')->will($this->returnValue($data)); - + $cacheId = 'test'; + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn(false); + $this->readerMock->expects($this->once()) + ->method('read') + ->willReturn($data); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($data); $config = new \Magento\Framework\Config\Data( - $this->reader, $this->cache, $cacheid + $this->readerMock, + $this->cacheMock, + $cacheId, + $this->serializerMock ); $this->assertEquals($data, $config->get()); $this->assertEquals('b', $config->get('a')); @@ -44,18 +57,50 @@ class DataTest extends \PHPUnit_Framework_TestCase $this->assertEquals(33, $config->get('a/b', 33)); } - public function testReset() + public function testGetConfigCached() { - $cacheid = 'test'; - $this->cache->expects($this->once())->method('load')->will($this->returnValue(serialize([]))); - $this->cache->expects($this->once())->method('remove')->with($cacheid); - + $data = ['a' => 'b']; + $serializedData = '{"a":"b"}'; + $cacheId = 'test'; + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn($serializedData); + $this->readerMock->expects($this->never()) + ->method('read'); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedData) + ->willReturn($data); $config = new \Magento\Framework\Config\Data( - $this->reader, - $this->cache, - $cacheid + $this->readerMock, + $this->cacheMock, + $cacheId, + $this->serializerMock ); + $this->assertEquals($data, $config->get()); + $this->assertEquals('b', $config->get('a')); + } + public function testReset() + { + $serializedData = ''; + $cacheId = 'test'; + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn($serializedData); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedData) + ->willReturn([]); + $this->cacheMock->expects($this->once()) + ->method('remove') + ->with($cacheId); + $config = new \Magento\Framework\Config\Data( + $this->readerMock, + $this->cacheMock, + $cacheId, + $this->serializerMock + ); $config->reset(); } } diff --git a/lib/internal/Magento/Framework/Config/Test/Unit/ReaderTest.php b/lib/internal/Magento/Framework/Config/Test/Unit/ReaderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b51fbd3598e11b8c021d25405ffbe19dd41a0355 --- /dev/null +++ b/lib/internal/Magento/Framework/Config/Test/Unit/ReaderTest.php @@ -0,0 +1,46 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Config\Test\Unit; + +use Magento\Framework\App\Config\Reader\Source\SourceInterface; +use Magento\Framework\App\Config\Scope\Converter; +use Magento\Framework\Config\Reader; +use Magento\Framework\Stdlib\ArrayUtils; + +class ReaderTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var SourceInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $source; + + /** + * @var Reader + */ + private $reader; + + public function setUp() + { + $this->source = $this->getMockBuilder(SourceInterface::class) + ->getMockForAbstractClass(); + $this->reader = new Reader([['class' => $this->source]]); + } + + public function testRead() + { + $config = [ + 'default' => [ + 'general/locale/code'=> 'ru_RU', + 'general/locale/timezone'=> 'America/Chicago', + ] + ]; + $this->source->expects($this->once()) + ->method('get') + ->with(null) + ->willReturn($config); + $this->assertEquals($config, $this->reader->read()); + } +} diff --git a/lib/internal/Magento/Framework/DataObject/Copy/Config/Data.php b/lib/internal/Magento/Framework/DataObject/Copy/Config/Data.php index 61802637750c691e433bab4736272d6a29e8b984..5f2a1518d485a9d7201df0c19cb0f99487c68a0c 100644 --- a/lib/internal/Magento/Framework/DataObject/Copy/Config/Data.php +++ b/lib/internal/Magento/Framework/DataObject/Copy/Config/Data.php @@ -1,12 +1,13 @@ <?php /** - * Fieldset configuration data container. Provides fieldset configuration data. - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\DataObject\Copy\Config; +/** + * Provides DataObject copier configuration + */ class Data extends \Magento\Framework\Config\Data { } diff --git a/lib/internal/Magento/Framework/Event/Config/Data.php b/lib/internal/Magento/Framework/Event/Config/Data.php index 7bd082e5d465bc1299af865c42a24e0c504640b0..4b69e597934978d1ea4715159ff2125c0d4684c0 100644 --- a/lib/internal/Magento/Framework/Event/Config/Data.php +++ b/lib/internal/Magento/Framework/Event/Config/Data.php @@ -1,12 +1,15 @@ <?php /** - * Event configuration data container - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\Event\Config; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides event configuration + */ class Data extends \Magento\Framework\Config\Data\Scoped { /** @@ -17,17 +20,21 @@ class Data extends \Magento\Framework\Config\Data\Scoped protected $_scopePriorityScheme = ['global']; /** + * Constructor + * * @param \Magento\Framework\Event\Config\Reader $reader * @param \Magento\Framework\Config\ScopeInterface $configScope * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Event\Config\Reader $reader, \Magento\Framework\Config\ScopeInterface $configScope, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = 'event_config_cache' + $cacheId = 'event_config_cache', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $configScope, $cache, $cacheId); + parent::__construct($reader, $configScope, $cache, $cacheId, $serializer); } } diff --git a/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php b/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php index 181783c7b2115d8a216c681077e116e98344d15c..35d7b3ac5ee20ae669ccc66775498b3c0d9348b4 100644 --- a/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php +++ b/lib/internal/Magento/Framework/HTTP/Adapter/Curl.php @@ -28,6 +28,7 @@ class Curl implements \Zend_Http_Client_Adapter_Interface ), 'verifypeer' => true, 'verifyhost' => 2, + 'sslversion' => 6 ]; /** @@ -53,6 +54,7 @@ class Curl implements \Zend_Http_Client_Adapter_Interface 'protocols' => CURLOPT_PROTOCOLS, 'verifypeer' => CURLOPT_SSL_VERIFYPEER, 'verifyhost' => CURLOPT_SSL_VERIFYHOST, + 'sslversion' => CURLOPT_SSLVERSION, ]; /** diff --git a/lib/internal/Magento/Framework/HTTP/Client/Curl.php b/lib/internal/Magento/Framework/HTTP/Client/Curl.php index 67525f62f6336cf7de844e866a153be223dc0b5c..5ebc92abf70d9063af63683f5f530dd01470865a 100644 --- a/lib/internal/Magento/Framework/HTTP/Client/Curl.php +++ b/lib/internal/Magento/Framework/HTTP/Client/Curl.php @@ -9,14 +9,17 @@ namespace Magento\Framework\HTTP\Client; * Class to work with HTTP protocol using curl library * * @author Magento Core Team <core@magentocommerce.com> + * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ class Curl implements \Magento\Framework\HTTP\ClientInterface { + const SSL_VERSION = 6; + /** * Max supported protocol by curl CURL_SSLVERSION_TLSv1_2 * @var int */ - private static $sslVersion = 6; + private $sslVersion; /** * Hostname @@ -86,7 +89,7 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface /** * Curl - * @var object + * @var resource */ protected $_ch; @@ -117,10 +120,11 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface } /** - * Constructor + * @param int|null $sslVersion */ - public function __construct() + public function __construct($sslVersion = self::SSL_VERSION) { + $this->sslVersion = $sslVersion; } /** @@ -377,10 +381,9 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface $this->curlOption(CURLOPT_PORT, $this->_port); } - //$this->curlOption(CURLOPT_HEADER, 1); $this->curlOption(CURLOPT_RETURNTRANSFER, 1); $this->curlOption(CURLOPT_HEADERFUNCTION, [$this, 'parseHeaders']); - $this->curlOption(CURLOPT_SSLVERSION, self::$sslVersion); + $this->curlOption(CURLOPT_SSLVERSION, $this->sslVersion); if (count($this->_curlUserOptions)) { foreach ($this->_curlUserOptions as $k => $v) { @@ -415,6 +418,7 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface * @param resource $ch curl handle, not needed * @param string $data * @return int + * @throws \Exception * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ protected function parseHeaders($ch, $data) @@ -422,11 +426,10 @@ class Curl implements \Magento\Framework\HTTP\ClientInterface if ($this->_headerCount == 0) { $line = explode(" ", trim($data), 3); if (count($line) != 3) { - return $this->doError("Invalid response line returned from server: " . $data); + $this->doError("Invalid response line returned from server: " . $data); } $this->_responseStatus = intval($line[1]); } else { - //var_dump($data); $name = $value = ''; $out = explode(": ", trim($data), 2); if (count($out) == 2) { diff --git a/lib/internal/Magento/Framework/Indexer/Config/Converter.php b/lib/internal/Magento/Framework/Indexer/Config/Converter.php index b8b17b185a1f2630842d6fe6e01b6a9de2a52107..0112b4d9a4de301a312e3e66bd146d8f477cd349 100644 --- a/lib/internal/Magento/Framework/Indexer/Config/Converter.php +++ b/lib/internal/Magento/Framework/Indexer/Config/Converter.php @@ -72,10 +72,10 @@ class Converter implements ConverterInterface $data['fieldsets'] = isset($data['fieldsets']) ? $data['fieldsets'] : []; switch ($childNode->nodeName) { case 'title': - $data['title'] = $this->getTranslatedNodeValue($childNode); + $data['title'] = $childNode->nodeValue; break; case 'description': - $data['description'] = $this->getTranslatedNodeValue($childNode); + $data['description'] = $childNode->nodeValue; break; case 'saveHandler': $data['saveHandler'] = $this->getAttributeValue($childNode, 'class'); @@ -207,6 +207,7 @@ class Converter implements ConverterInterface * * @param \DOMNode $node * @return string + * @deprecated */ protected function getTranslatedNodeValue(\DOMNode $node) { diff --git a/lib/internal/Magento/Framework/Interception/Config/Config.php b/lib/internal/Magento/Framework/Interception/Config/Config.php index 9812e505cc397226f689b7cbfe354cbf6a5ce608..0b30b2619c069751430de447b7731568bacc847d 100644 --- a/lib/internal/Magento/Framework/Interception/Config/Config.php +++ b/lib/internal/Magento/Framework/Interception/Config/Config.php @@ -7,6 +7,9 @@ */ namespace Magento\Framework\Interception\Config; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Serialize\Serializer\Serialize; + class Config implements \Magento\Framework\Interception\ConfigInterface { /** @@ -71,6 +74,13 @@ class Config implements \Magento\Framework\Interception\ConfigInterface protected $_scopeList; /** + * @var SerializerInterface + */ + private $serializer; + + /** + * Config constructor + * * @param \Magento\Framework\Config\ReaderInterface $reader * @param \Magento\Framework\Config\ScopeListInterface $scopeList * @param \Magento\Framework\Cache\FrontendInterface $cache @@ -78,6 +88,7 @@ class Config implements \Magento\Framework\Interception\ConfigInterface * @param \Magento\Framework\Interception\ObjectManager\ConfigInterface $omConfig * @param \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions * @param string $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Config\ReaderInterface $reader, @@ -86,7 +97,8 @@ class Config implements \Magento\Framework\Interception\ConfigInterface \Magento\Framework\ObjectManager\RelationsInterface $relations, \Magento\Framework\Interception\ObjectManager\ConfigInterface $omConfig, \Magento\Framework\ObjectManager\DefinitionInterface $classDefinitions, - $cacheId = 'interception' + $cacheId = 'interception', + SerializerInterface $serializer = null ) { $this->_omConfig = $omConfig; $this->_relations = $relations; @@ -95,10 +107,11 @@ class Config implements \Magento\Framework\Interception\ConfigInterface $this->_cacheId = $cacheId; $this->_reader = $reader; $this->_scopeList = $scopeList; - + $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() + ->get(Serialize::class); $intercepted = $this->_cache->load($this->_cacheId); if ($intercepted !== false) { - $this->_intercepted = unserialize($intercepted); + $this->_intercepted = $this->serializer->unserialize($intercepted); } else { $this->initialize($this->_classDefinitions->getClasses()); } @@ -129,7 +142,7 @@ class Config implements \Magento\Framework\Interception\ConfigInterface foreach ($classDefinitions as $class) { $this->hasPlugins($class); } - $this->_cache->save(serialize($this->_intercepted), $this->_cacheId); + $this->_cache->save($this->serializer->serialize($this->_intercepted), $this->_cacheId); } /** diff --git a/lib/internal/Magento/Framework/Interception/Definition/Compiled.php b/lib/internal/Magento/Framework/Interception/Definition/Compiled.php deleted file mode 100644 index 6fbe9c99dce8637e8c31b9ce493b5b79c45e62c0..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/Interception/Definition/Compiled.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php -/** - * Compiled method plugin definitions. Must be used in production for maximum performance - * - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\Interception\Definition; - -use Magento\Framework\Interception\DefinitionInterface; - -class Compiled implements DefinitionInterface -{ - /** - * List of plugin definitions - * - * @var array - */ - protected $_definitions = []; - - /** - * @param array $definitions - */ - public function __construct(array $definitions) - { - $this->_definitions = $definitions; - } - - /** - * Retrieve list of methods - * - * @param string $type - * @return string[] - */ - public function getMethodList($type) - { - return $this->_definitions[$type]; - } -} diff --git a/lib/internal/Magento/Framework/Interception/PluginList/PluginList.php b/lib/internal/Magento/Framework/Interception/PluginList/PluginList.php index bae8f7c118c08b298bdc17b86db65181af075c3a..a84e23dc75548d059ea1007ab83a3d7728eeca40 100644 --- a/lib/internal/Magento/Framework/Interception/PluginList/PluginList.php +++ b/lib/internal/Magento/Framework/Interception/PluginList/PluginList.php @@ -1,7 +1,5 @@ <?php /** - * Plugin configuration storage. Provides list of plugins configured for type. - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ @@ -17,8 +15,12 @@ use Magento\Framework\Interception\ObjectManager\ConfigInterface; use Magento\Framework\ObjectManager\RelationsInterface; use Magento\Framework\ObjectManager\DefinitionInterface as ClassDefinitions; use Magento\Framework\ObjectManagerInterface; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Serialize\Serializer\Serialize; /** + * Plugin config, provides list of plugins for a type + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class PluginList extends Scoped implements InterceptionPluginList @@ -81,6 +83,13 @@ class PluginList extends Scoped implements InterceptionPluginList private $logger; /** + * @var SerializerInterface + */ + private $serializer; + + /** + * Constructor + * * @param ReaderInterface $reader * @param ScopeInterface $configScope * @param CacheInterface $cache @@ -90,7 +99,8 @@ class PluginList extends Scoped implements InterceptionPluginList * @param ObjectManagerInterface $objectManager * @param ClassDefinitions $classDefinitions * @param array $scopePriorityScheme - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -103,9 +113,11 @@ class PluginList extends Scoped implements InterceptionPluginList ObjectManagerInterface $objectManager, ClassDefinitions $classDefinitions, array $scopePriorityScheme = ['global'], - $cacheId = 'plugins' + $cacheId = 'plugins', + SerializerInterface $serializer = null ) { - parent::__construct($reader, $configScope, $cache, $cacheId); + $this->serializer = $serializer ?: $objectManager->get(Serialize::class); + parent::__construct($reader, $configScope, $cache, $cacheId, $this->serializer); $this->_omConfig = $omConfig; $this->_relations = $relations; $this->_definitions = $definitions; @@ -275,7 +287,7 @@ class PluginList extends Scoped implements InterceptionPluginList $cacheId = implode('|', $this->_scopePriorityScheme) . "|" . $this->_cacheId; $data = $this->_cache->load($cacheId); if ($data) { - list($this->_data, $this->_inherited, $this->_processed) = unserialize($data); + list($this->_data, $this->_inherited, $this->_processed) = $this->serializer->unserialize($data); foreach ($this->_scopePriorityScheme as $scopeCode) { $this->_loadedScopes[$scopeCode] = true; } @@ -307,7 +319,10 @@ class PluginList extends Scoped implements InterceptionPluginList foreach ($this->getClassDefinitions() as $class) { $this->_inheritPlugins($class); } - $this->_cache->save(serialize([$this->_data, $this->_inherited, $this->_processed]), $cacheId); + $this->_cache->save( + $this->serializer->serialize([$this->_data, $this->_inherited, $this->_processed]), + $cacheId + ); } $this->_pluginInstances = []; } @@ -371,10 +386,10 @@ class PluginList extends Scoped implements InterceptionPluginList } /** - * Returns logger instance + * Get logger * - * @deprecated * @return \Psr\Log\LoggerInterface + * @deprecated */ private function getLogger() { diff --git a/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php b/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php index 992ed838b7c522af706668ae6f8443edfea8ef8c..7d15d1029bda65837aacc94111132fdc1c34e829 100644 --- a/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php +++ b/lib/internal/Magento/Framework/Interception/Test/Unit/Config/ConfigTest.php @@ -6,6 +6,8 @@ // @codingStandardsIgnoreFile namespace Magento\Framework\Interception\Test\Unit\Config; +use Magento\Framework\Serialize\SerializerInterface; + require_once __DIR__ . '/../Custom/Module/Model/Item.php'; require_once __DIR__ . '/../Custom/Module/Model/Item/Enhanced.php'; require_once __DIR__ . '/../Custom/Module/Model/ItemContainer.php'; @@ -22,32 +24,38 @@ class ConfigTest extends \PHPUnit_Framework_TestCase /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $configScopeMock; + private $configScopeMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $readerMock; + private $readerMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $cacheMock; + private $cacheMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $omConfigMock; + private $omConfigMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $definitionMock; + private $definitionMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $relationsMock; + private $relationsMock; + + /** @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $serializerMock; + + /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ + private $objectManagerHelper; protected function setUp() { @@ -67,6 +75,8 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $this->relationsMock = $this->getMockForAbstractClass( \Magento\Framework\ObjectManager\RelationsInterface::class ); + $this->serializerMock = $this->getMock(SerializerInterface::class); + $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); } /** @@ -131,14 +141,22 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $this->relationsMock->expects($this->any())->method('has')->will($this->returnValue($expectedResult)); $this->relationsMock->expects($this->any())->method('getParents')->will($this->returnValue($entityParents)); - $model = new \Magento\Framework\Interception\Config\Config( - $this->readerMock, - $this->configScopeMock, - $this->cacheMock, - $this->relationsMock, - $this->omConfigMock, - $this->definitionMock, - 'interception' + $this->serializerMock->expects($this->once()) + ->method('serialize'); + + $this->serializerMock->expects($this->never())->method('unserialize'); + + $model = $this->objectManagerHelper->getObject( + \Magento\Framework\Interception\Config\Config::class, + [ + 'reader' => $this->readerMock, + 'scopeList' => $this->configScopeMock, + 'cache' => $this->cacheMock, + 'relations' => $this->relationsMock, + 'omConfig' => $this->omConfigMock, + 'classDefinitions' => $this->definitionMock, + 'serializer' => $this->serializerMock, + ] ); $this->assertEquals($expectedResult, $model->hasPlugins($type)); @@ -163,18 +181,32 @@ class ConfigTest extends \PHPUnit_Framework_TestCase ]; $this->readerMock->expects($this->never())->method('read'); $this->cacheMock->expects($this->never())->method('save'); + $serializedValue = 'serializedData'; $this->cacheMock->expects($this->any()) ->method('load') ->with($cacheId) - ->will($this->returnValue(serialize($interceptionData))); - $model = new \Magento\Framework\Interception\Config\Config( - $this->readerMock, - $this->configScopeMock, - $this->cacheMock, - new \Magento\Framework\ObjectManager\Relations\Runtime(), - $this->omConfigMock, - $this->definitionMock, - $cacheId + ->will($this->returnValue($serializedValue)); + + $this->serializerMock->expects($this->never())->method('serialize'); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($serializedValue) + ->willReturn($interceptionData); + + $model = $this->objectManagerHelper->getObject( + \Magento\Framework\Interception\Config\Config::class, + [ + 'reader' => $this->readerMock, + 'scopeList' => $this->configScopeMock, + 'cache' => $this->cacheMock, + 'relations' => $this->objectManagerHelper->getObject( + \Magento\Framework\ObjectManager\Relations\Runtime::class + ), + 'omConfig' => $this->omConfigMock, + 'classDefinitions' => $this->definitionMock, + 'cacheId' => $cacheId, + 'serializer' => $this->serializerMock, + ] ); $this->assertEquals($expectedResult, $model->hasPlugins($type)); diff --git a/lib/internal/Magento/Framework/Interception/Test/Unit/Definition/CompiledTest.php b/lib/internal/Magento/Framework/Interception/Test/Unit/Definition/CompiledTest.php deleted file mode 100644 index a64cd96b62966023daf9d910c58b6a1f526925c6..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/Interception/Test/Unit/Definition/CompiledTest.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\Interception\Test\Unit\Definition; - -class CompiledTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var array - */ - protected $_definitions = ['type' => 'definitions']; - - /** - * @covers \Magento\Framework\Interception\Definition\Compiled::getMethodList - * @covers \Magento\Framework\Interception\Definition\Compiled::__construct - */ - public function testGetMethodList() - { - $model = new \Magento\Framework\Interception\Definition\Compiled($this->_definitions); - $this->assertEquals('definitions', $model->getMethodList('type')); - } -} diff --git a/lib/internal/Magento/Framework/Interception/Test/Unit/PluginList/PluginListTest.php b/lib/internal/Magento/Framework/Interception/Test/Unit/PluginList/PluginListTest.php index ac1e510f28b226a9c6386a35ca31192b7900cdc4..11e8dabf6d924cb4c566746514af503091b85935 100644 --- a/lib/internal/Magento/Framework/Interception/Test/Unit/PluginList/PluginListTest.php +++ b/lib/internal/Magento/Framework/Interception/Test/Unit/PluginList/PluginListTest.php @@ -5,6 +5,9 @@ */ namespace Magento\Framework\Interception\Test\Unit\PluginList; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\ObjectManagerInterface; + require_once __DIR__ . '/../Custom/Module/Model/Item.php'; require_once __DIR__ . '/../Custom/Module/Model/Item/Enhanced.php'; require_once __DIR__ . '/../Custom/Module/Model/ItemContainer.php'; @@ -23,22 +26,32 @@ class PluginListTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\Interception\PluginList\PluginList */ - protected $_model; + private $object; + + /** + * @var \Magento\Framework\Config\ScopeInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $configScopeMock; + + /** + * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $cacheMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_configScopeMock; + private $loggerMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_objectManagerMock; + private $serializerMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var ObjectManagerInterface||\PHPUnit_Framework_MockObject_MockObject */ - protected $_cacheMock; + private $objectManagerMock; protected function setUp() { @@ -46,10 +59,10 @@ class PluginListTest extends \PHPUnit_Framework_TestCase $readerMock = $this->getMock(\Magento\Framework\ObjectManager\Config\Reader\Dom::class, [], [], '', false); $readerMock->expects($this->any())->method('read')->will($this->returnValueMap($readerMap)); - $this->_configScopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class); - $this->_cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); + $this->configScopeMock = $this->getMock(\Magento\Framework\Config\ScopeInterface::class); + $this->cacheMock = $this->getMock(\Magento\Framework\Config\CacheInterface::class); // turn cache off - $this->_cacheMock->expects($this->any()) + $this->cacheMock->expects($this->any()) ->method('get') ->will($this->returnValue(false)); @@ -59,62 +72,76 @@ class PluginListTest extends \PHPUnit_Framework_TestCase $omConfigMock->expects($this->any())->method('getOriginalInstanceType')->will($this->returnArgument(0)); - $this->_objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); + $this->objectManagerMock = $this->getMock(ObjectManagerInterface::class); + $this->objectManagerMock->expects($this->any()) + ->method('get') + ->willReturnArgument(0); + $this->serializerMock = $this->getMock(SerializerInterface::class); $definitions = new \Magento\Framework\ObjectManager\Definition\Runtime(); - $this->_model = new \Magento\Framework\Interception\PluginList\PluginList( - $readerMock, - $this->_configScopeMock, - $this->_cacheMock, - new \Magento\Framework\ObjectManager\Relations\Runtime(), - $omConfigMock, - new \Magento\Framework\Interception\Definition\Runtime(), - $this->_objectManagerMock, - $definitions, - ['global'], - 'interception' + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->object = $objectManagerHelper->getObject( + \Magento\Framework\Interception\PluginList\PluginList::class, + [ + 'reader' => $readerMock, + 'configScope' => $this->configScopeMock, + 'cache' => $this->cacheMock, + 'relations' => new \Magento\Framework\ObjectManager\Relations\Runtime(), + 'omConfig' => $omConfigMock, + 'definitions' => new \Magento\Framework\Interception\Definition\Runtime(), + 'objectManager' => $this->objectManagerMock, + 'classDefinitions' => $definitions, + 'scopePriorityScheme' => ['global'], + 'cacheId' => 'interception', + 'serializer' => $this->serializerMock + ] + ); + + $this->loggerMock = $this->getMock(\Psr\Log\LoggerInterface::class); + $objectManagerHelper->setBackwardCompatibleProperty( + $this->object, + 'logger', + $this->loggerMock ); } public function testGetPlugin() { - $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnArgument(0)); - $this->_configScopeMock->expects($this->any())->method('getCurrentScope')->will($this->returnValue('backend')); - $this->_model->getNext(\Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class, 'getName'); - $this->_model->getNext( + $this->configScopeMock->expects($this->any())->method('getCurrentScope')->will($this->returnValue('backend')); + $this->object->getNext(\Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class, 'getName'); + $this->object->getNext( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer::class, 'getName' ); - $this->_model->getNext( + $this->object->getNext( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\StartingBackslash::class, 'getName' ); - $this->assertEquals( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemPlugin\Simple::class, - $this->_model->getPlugin( + $this->object->getPlugin( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class, 'simple_plugin' ) ); $this->assertEquals( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemPlugin\Advanced::class, - $this->_model->getPlugin( + $this->object->getPlugin( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class, 'advanced_plugin' ) ); $this->assertEquals( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainerPlugin\Simple::class, - $this->_model->getPlugin( + $this->object->getPlugin( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemContainer::class, 'simple_plugin' ) ); $this->assertEquals( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\StartingBackslash\Plugin::class, - $this->_model->getPlugin( + $this->object->getPlugin( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\StartingBackslash::class, 'simple_plugin' ) @@ -131,15 +158,14 @@ class PluginListTest extends \PHPUnit_Framework_TestCase */ public function testGetPlugins($expectedResult, $type, $method, $scopeCode, $code = '__self') { - $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnArgument(0)); - $this->_configScopeMock->expects( + $this->configScopeMock->expects( $this->any() )->method( 'getCurrentScope' )->will( $this->returnValue($scopeCode) ); - $this->assertEquals($expectedResult, $this->_model->getNext($type, $method, $code)); + $this->assertEquals($expectedResult, $this->object->getNext($type, $method, $code)); } /** @@ -207,12 +233,26 @@ class PluginListTest extends \PHPUnit_Framework_TestCase */ public function testInheritPluginsWithNonExistingClass() { - $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnArgument(0)); - $this->_configScopeMock->expects($this->any()) + $this->configScopeMock->expects($this->any()) ->method('getCurrentScope') ->will($this->returnValue('frontend')); - $this->_model->getNext('SomeType', 'someMethod'); + $this->object->getNext('SomeType', 'someMethod'); + } + + public function testLoadScopedDataNotCached() + { + $this->configScopeMock->expects($this->exactly(3)) + ->method('getCurrentScope') + ->will($this->returnValue('scope')); + $this->serializerMock->expects($this->once()) + ->method('serialize'); + $this->serializerMock->expects($this->never()) + ->method('unserialize'); + $this->cacheMock->expects($this->once()) + ->method('save'); + + $this->assertEquals(null, $this->object->getNext('Type', 'method')); } /** @@ -221,19 +261,14 @@ class PluginListTest extends \PHPUnit_Framework_TestCase */ public function testInheritPluginsWithNotExistingPlugin() { - $loggerMock = $this->getMock(\Psr\Log\LoggerInterface::class); - $this->_objectManagerMock->expects($this->once()) - ->method('get') - ->with(\Psr\Log\LoggerInterface::class) - ->willReturn($loggerMock); - $loggerMock->expects($this->once()) + $this->loggerMock->expects($this->once()) ->method('info') ->with("Reference to undeclared plugin with name 'simple_plugin'."); - $this->_configScopeMock->expects($this->any()) + $this->configScopeMock->expects($this->any()) ->method('getCurrentScope') ->will($this->returnValue('frontend')); - $this->assertNull($this->_model->getNext('typeWithoutInstance', 'someMethod')); + $this->assertNull($this->object->getNext('typeWithoutInstance', 'someMethod')); } /** @@ -242,19 +277,24 @@ class PluginListTest extends \PHPUnit_Framework_TestCase */ public function testLoadScopedDataCached() { - $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnArgument(0)); - $this->_configScopeMock->expects($this->once()) + $this->configScopeMock->expects($this->once()) ->method('getCurrentScope') ->will($this->returnValue('scope')); $data = [['key'], ['key'], ['key']]; + $serializedData = 'serialized data'; - $this->_cacheMock->expects($this->once()) + $this->serializerMock->expects($this->never()) + ->method('serialize'); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->willReturn($data); + $this->cacheMock->expects($this->once()) ->method('load') ->with('global|scope|interception') - ->will($this->returnValue(serialize($data))); + ->willReturn($serializedData); - $this->assertEquals(null, $this->_model->getNext('Type', 'method')); + $this->assertEquals(null, $this->object->getNext('Type', 'method')); } /** @@ -263,23 +303,23 @@ class PluginListTest extends \PHPUnit_Framework_TestCase */ public function testLoadScopeDataWithEmptyData() { - $this->_objectManagerMock->expects($this->any()) + $this->objectManagerMock->expects($this->any()) ->method('get') ->will($this->returnArgument(0)); - $this->_configScopeMock->expects($this->any()) + $this->configScopeMock->expects($this->any()) ->method('getCurrentScope') ->will($this->returnValue('emptyscope')); $this->assertEquals( [4 => ['simple_plugin']], - $this->_model->getNext( + $this->object->getNext( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class, 'getName' ) ); $this->assertEquals( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\ItemPlugin\Simple::class, - $this->_model->getPlugin( + $this->object->getPlugin( \Magento\Framework\Interception\Test\Unit\Custom\Module\Model\Item::class, 'simple_plugin' ) diff --git a/lib/internal/Magento/Framework/Mview/Config/Data.php b/lib/internal/Magento/Framework/Mview/Config/Data.php index d2e4ee91bea2d8c6ad5712476d3af9910b818cd1..fed3021a161ee6280f7d3f0e01e7b5e15329d88a 100644 --- a/lib/internal/Magento/Framework/Mview/Config/Data.php +++ b/lib/internal/Magento/Framework/Mview/Config/Data.php @@ -5,6 +5,11 @@ */ namespace Magento\Framework\Mview\Config; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides materialized view configuration + */ class Data extends \Magento\Framework\Config\Data { /** @@ -13,22 +18,26 @@ class Data extends \Magento\Framework\Config\Data protected $stateCollection; /** - * @param \Magento\Framework\Mview\Config\Reader $reader + * Constructor + * + * @param Reader $reader * @param \Magento\Framework\Config\CacheInterface $cache * @param \Magento\Framework\Mview\View\State\CollectionInterface $stateCollection - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Mview\Config\Reader $reader, \Magento\Framework\Config\CacheInterface $cache, \Magento\Framework\Mview\View\State\CollectionInterface $stateCollection, - $cacheId = 'mview_config' + $cacheId = 'mview_config', + SerializerInterface $serializer = null ) { $this->stateCollection = $stateCollection; $isCacheExists = $cache->test($cacheId); - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); if (!$isCacheExists) { $this->deleteNonexistentStates(); diff --git a/lib/internal/Magento/Framework/Mview/Test/Unit/Config/DataTest.php b/lib/internal/Magento/Framework/Mview/Test/Unit/Config/DataTest.php index 244b1b1e1382dd962560dffdec638e16dc7d71a0..777c099d9b83844c9448f172ae07106f66a5ca13 100644 --- a/lib/internal/Magento/Framework/Mview/Test/Unit/Config/DataTest.php +++ b/lib/internal/Magento/Framework/Mview/Test/Unit/Config/DataTest.php @@ -10,32 +10,37 @@ class DataTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\Framework\Mview\Config\Data */ - protected $model; + private $config; /** * @var \Magento\Framework\Mview\Config\Reader|\PHPUnit_Framework_MockObject_MockObject */ - protected $reader; + private $reader; /** * @var \Magento\Framework\Config\CacheInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $cache; + private $cache; /** * @var \Magento\Framework\Mview\View\State\CollectionInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $stateCollection; + private $stateCollection; /** * @var string */ - protected $cacheId = 'mview_config'; + private $cacheId = 'mview_config'; /** * @var string */ - protected $views = ['view1' => [], 'view3' => []]; + private $views = ['view1' => [], 'view3' => []]; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; protected function setUp() { @@ -58,28 +63,29 @@ class DataTest extends \PHPUnit_Framework_TestCase true, ['getItems'] ); + + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); } public function testConstructorWithCache() { $this->cache->expects($this->once())->method('test')->with($this->cacheId)->will($this->returnValue(true)); - $this->cache->expects( - $this->once() - )->method( - 'load' - )->with( - $this->cacheId - )->will( - $this->returnValue(serialize($this->views)) - ); + $this->cache->expects($this->once()) + ->method('load') + ->with($this->cacheId); $this->stateCollection->expects($this->never())->method('getItems'); - $this->model = new \Magento\Framework\Mview\Config\Data( + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->willReturn($this->views); + + $this->config = new \Magento\Framework\Mview\Config\Data( $this->reader, $this->cache, $this->stateCollection, - $this->cacheId + $this->cacheId, + $this->serializerMock ); } @@ -114,11 +120,12 @@ class DataTest extends \PHPUnit_Framework_TestCase $this->stateCollection->expects($this->once())->method('getItems')->will($this->returnValue($states)); - $this->model = new \Magento\Framework\Mview\Config\Data( + $this->config = new \Magento\Framework\Mview\Config\Data( $this->reader, $this->cache, $this->stateCollection, - $this->cacheId + $this->cacheId, + $this->serializerMock ); } } diff --git a/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php b/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php index 779e8cf0a0e5ecf15b0fcb6da1e48b80a5bb3072..0260af34ef1089281b36e37b75906203d7780684 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php +++ b/lib/internal/Magento/Framework/ObjectManager/Config/Compiled.php @@ -6,9 +6,14 @@ namespace Magento\Framework\ObjectManager\Config; use Magento\Framework\ObjectManager\ConfigInterface; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Serialize\Serializer\Serialize; use Magento\Framework\ObjectManager\ConfigCacheInterface; use Magento\Framework\ObjectManager\RelationsInterface; +/** + * Provides object manager configuration when in compiled mode + */ class Compiled implements ConfigInterface { /** @@ -27,6 +32,13 @@ class Compiled implements ConfigInterface private $preferences; /** + * @var SerializerInterface + */ + private $serializer; + + /** + * Constructor + * * @param array $data */ public function __construct($data) @@ -72,7 +84,7 @@ class Compiled implements ConfigInterface { if (isset($this->arguments[$type])) { if (is_string($this->arguments[$type])) { - $this->arguments[$type] = unserialize($this->arguments[$type]); + $this->arguments[$type] = $this->getSerializer()->unserialize($this->arguments[$type]); } return $this->arguments[$type]; } else { @@ -159,4 +171,19 @@ class Compiled implements ConfigInterface { return $this->preferences; } + + /** + * Get serializer + * + * @return SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if (null === $this->serializer) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(Serialize::class); + } + return $this->serializer; + } } diff --git a/lib/internal/Magento/Framework/ObjectManager/Config/Config.php b/lib/internal/Magento/Framework/ObjectManager/Config/Config.php index 5dc02e6ba7d97cc0a1123572c7577ae767d369af..7ad196cdd34b4d90b1179ad8559b63ea8b1fa684 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Config/Config.php +++ b/lib/internal/Magento/Framework/ObjectManager/Config/Config.php @@ -5,6 +5,7 @@ */ namespace Magento\Framework\ObjectManager\Config; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Framework\ObjectManager\ConfigCacheInterface; use Magento\Framework\ObjectManager\DefinitionInterface; use Magento\Framework\ObjectManager\RelationsInterface; @@ -74,6 +75,11 @@ class Config implements \Magento\Framework\ObjectManager\ConfigInterface */ protected $_mergedArguments; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * @param RelationsInterface $relations * @param DefinitionInterface $definitions @@ -267,10 +273,12 @@ class Config implements \Magento\Framework\ObjectManager\ConfigInterface if ($this->_cache) { if (!$this->_currentCacheKey) { $this->_currentCacheKey = md5( - serialize([$this->_arguments, $this->_nonShared, $this->_preferences, $this->_virtualTypes]) + $this->getSerializer()->serialize( + [$this->_arguments, $this->_nonShared, $this->_preferences, $this->_virtualTypes] + ) ); } - $key = md5($this->_currentCacheKey . serialize($configuration)); + $key = md5($this->_currentCacheKey . $this->getSerializer()->serialize($configuration)); $cached = $this->_cache->get($key); if ($cached) { list( @@ -323,4 +331,19 @@ class Config implements \Magento\Framework\ObjectManager\ConfigInterface { return $this->_preferences; } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled.php b/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled.php deleted file mode 100644 index 2cb3b21211f23af76ab75ad6875b4cc6396f4a50..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\ObjectManager\Definition; - -/** - * Compiled class definitions. Should be used for maximum performance in production. - */ -abstract class Compiled implements \Magento\Framework\ObjectManager\DefinitionInterface -{ - /** - * Class definitions - * - * @var array - */ - protected $_definitions; - - /** - * @var \Magento\Framework\Code\Reader\ClassReaderInterface - */ - protected $reader ; - - /** - * @param array $definitions - * @param \Magento\Framework\Code\Reader\ClassReaderInterface $reader - */ - public function __construct(array $definitions, \Magento\Framework\Code\Reader\ClassReaderInterface $reader = null) - { - list($this->_signatures, $this->_definitions) = $definitions; - $this->reader = $reader ?: new \Magento\Framework\Code\Reader\ClassReader(); - } - - /** - * Unpack signature - * - * @param string $signature - * @return mixed - */ - abstract protected function _unpack($signature); - - /** - * Get list of method parameters - * - * Retrieve an ordered list of constructor parameters. - * Each value is an array with following entries: - * - * array( - * 0, // string: Parameter name - * 1, // string|null: Parameter type - * 2, // bool: whether this param is required - * 3, // mixed: default value - * ); - * - * @param string $className - * @return array|null - */ - public function getParameters($className) - { - // if the definition isn't found in the list gathered from the compiled file then using reflection to find it - if (!array_key_exists($className, $this->_definitions)) { - return $this->reader->getConstructor($className); - } - - $definition = $this->_definitions[$className]; - if ($definition !== null) { - if (is_string($this->_signatures[$definition])) { - $this->_signatures[$definition] = $this->_unpack($this->_signatures[$definition]); - } - return $this->_signatures[$definition]; - } - return null; - } - - /** - * Retrieve list of all classes covered with definitions - * - * @return array - */ - public function getClasses() - { - return array_keys($this->_definitions); - } -} diff --git a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Binary.php b/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Binary.php deleted file mode 100644 index bba816e072e6b78072c0c1297dcc70935c42a1e9..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Binary.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Igbinary serialized definition reader - * - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\ObjectManager\Definition\Compiled; - -class Binary extends \Magento\Framework\ObjectManager\Definition\Compiled -{ - /** - * Mode name - */ - const MODE_NAME = 'igbinary'; - - /** - * Unpack signature - * - * @param string $signature - * @return mixed - */ - protected function _unpack($signature) - { - return igbinary_unserialize($signature); - } -} diff --git a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Serialized.php b/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Serialized.php deleted file mode 100644 index a799725c390991676c4162384f69b4e4e8135933..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Definition/Compiled/Serialized.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Serialized definition reader - * - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\ObjectManager\Definition\Compiled; - -class Serialized extends \Magento\Framework\ObjectManager\Definition\Compiled -{ - /** - * Mode name - */ - const MODE_NAME = 'serialized'; - - /** - * Unpack signature - * - * @param string $signature - * @return mixed - */ - protected function _unpack($signature) - { - return unserialize($signature); - } -} diff --git a/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php b/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php index 40959aa19669425dbcc0eec15df5cb1bafae6738..29431b570bc6416e2f180ab86efb37be292be893 100644 --- a/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php +++ b/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php @@ -1,41 +1,22 @@ <?php /** - * Object manager definition factory - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. - * */ - -// @codingStandardsIgnoreFile - namespace Magento\Framework\ObjectManager; -use Magento\Framework\Api\Code\Generator\Mapper as MapperGenerator; -use Magento\Framework\Api\Code\Generator\SearchResults; use Magento\Framework\Filesystem\DriverInterface; use Magento\Framework\Interception\Code\Generator as InterceptionGenerator; -use Magento\Framework\ObjectManager\Code\Generator; -use Magento\Framework\ObjectManager\Code\Generator\Converter as ConverterGenerator; -use Magento\Framework\ObjectManager\Definition\Compiled\Binary; -use Magento\Framework\ObjectManager\Definition\Compiled\Serialized; use Magento\Framework\ObjectManager\Definition\Runtime; use Magento\Framework\ObjectManager\Profiler\Code\Generator as ProfilerGenerator; -use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator; -use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Code\Generator\Autoloader; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class DefinitionFactory { - /** - * Directory containing compiled class metadata - * - * @var string - */ - protected $_definitionDir; - /** * Class generation dir * @@ -43,13 +24,6 @@ class DefinitionFactory */ protected $_generationDir; - /** - * Format of definitions - * - * @var string - */ - protected $_definitionFormat; - /** * Filesystem Driver * @@ -57,16 +31,6 @@ class DefinitionFactory */ protected $_filesystemDriver; - /** - * List of definition models - * - * @var array - */ - protected static $definitionClasses = [ - Binary::MODE_NAME => \Magento\Framework\ObjectManager\Definition\Compiled\Binary::class, - Serialized::MODE_NAME => \Magento\Framework\ObjectManager\Definition\Compiled\Serialized::class, - ]; - /** * @var \Magento\Framework\Code\Generator */ @@ -74,39 +38,26 @@ class DefinitionFactory /** * @param DriverInterface $filesystemDriver - * @param string $definitionDir * @param string $generationDir - * @param string $definitionFormat */ - public function __construct(DriverInterface $filesystemDriver, $definitionDir, $generationDir, $definitionFormat) - { + public function __construct( + DriverInterface $filesystemDriver, + $generationDir + ) { $this->_filesystemDriver = $filesystemDriver; - $this->_definitionDir = $definitionDir; $this->_generationDir = $generationDir; - $this->_definitionFormat = $definitionFormat; } /** * Create class definitions * - * @param mixed $definitions - * @return Runtime + * @return DefinitionInterface */ - public function createClassDefinition($definitions = false) + public function createClassDefinition() { - if ($definitions) { - if (is_string($definitions)) { - $definitions = $this->_unpack($definitions); - } - $definitionModel = self::$definitionClasses[$this->_definitionFormat]; - $result = new $definitionModel($definitions); - } else { - $autoloader = new \Magento\Framework\Code\Generator\Autoloader($this->getCodeGenerator()); - spl_autoload_register([$autoloader, 'load']); - - $result = new Runtime(); - } - return $result; + $autoloader = new Autoloader($this->getCodeGenerator()); + spl_autoload_register([$autoloader, 'load']); + return new Runtime(); } /** @@ -116,14 +67,7 @@ class DefinitionFactory */ public function createPluginDefinition() { - $path = $this->_definitionDir . '/plugins.ser'; - if ($this->_filesystemDriver->isReadable($path)) { - return new \Magento\Framework\Interception\Definition\Compiled( - $this->_unpack($this->_filesystemDriver->fileGetContents($path)) - ); - } else { - return new \Magento\Framework\Interception\Definition\Runtime(); - } + return new \Magento\Framework\Interception\Definition\Runtime(); } /** @@ -133,36 +77,7 @@ class DefinitionFactory */ public function createRelations() { - $path = $this->_definitionDir . '/' . 'relations.ser'; - if ($this->_filesystemDriver->isReadable($path)) { - return new \Magento\Framework\ObjectManager\Relations\Compiled( - $this->_unpack($this->_filesystemDriver->fileGetContents($path)) - ); - } else { - return new \Magento\Framework\ObjectManager\Relations\Runtime(); - } - } - - /** - * Gets supported definition formats - * - * @return array - */ - public static function getSupportedFormats() - { - return array_keys(self::$definitionClasses); - } - - /** - * Un-compress definitions - * - * @param string $definitions - * @return mixed - */ - protected function _unpack($definitions) - { - $extractor = $this->_definitionFormat == Binary::MODE_NAME ? 'igbinary_unserialize' : 'unserialize'; - return $extractor($definitions); + return new \Magento\Framework\ObjectManager\Relations\Runtime(); } /** diff --git a/lib/internal/Magento/Framework/ObjectManager/Relations/Compiled.php b/lib/internal/Magento/Framework/ObjectManager/Relations/Compiled.php deleted file mode 100644 index 71455dbf9acd49e7e7c6d93699934a89ede5827a..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Relations/Compiled.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * List of parent classes with their parents and interfaces - * - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\ObjectManager\Relations; - -class Compiled implements \Magento\Framework\ObjectManager\RelationsInterface -{ - /** - * List of class relations - * - * @var array - */ - protected $_relations; - - /** - * Default relation list - * - * @var array - */ - protected $_default = []; - - /** - * @param array $relations - */ - public function __construct(array $relations) - { - $this->_relations = $relations; - } - - /** - * Check whether requested type is available for read - * - * @param string $type - * @return bool - */ - public function has($type) - { - return isset($this->_relations[$type]); - } - - /** - * Retrieve parents for class - * - * @param string $type - * @return array - */ - public function getParents($type) - { - return $this->_relations[$type]; - } -} diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php index 1fcf3176540db6279e3fec6754fb3a7a22b3cc59..489dc9d814e1183432e174601b9a650bd0690eea 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/CompiledTest.php @@ -5,87 +5,93 @@ */ namespace Magento\Framework\ObjectManager\Test\Unit\Config; -use Magento\Framework\ObjectManager\Config\Compiled as CompiledConfig; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use Magento\Framework\ObjectManager\Config\Compiled; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; class CompiledTest extends \PHPUnit_Framework_TestCase { /** - * @var ObjectManagerHelper + * @var ObjectManager */ - private $objectManagerHelper; - - protected function setUp() - { - $this->objectManagerHelper = new ObjectManagerHelper($this); - } + private $objectManager; /** - * @param array $initialData - * @param array $configuration - * @param array $expectedArguments - * @param array $expectedVirtualTypes - * @param array $expectedPreferences - * - * @dataProvider extendDataProvider + * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ - public function testExtend( - array $initialData, - array $configuration, - array $expectedArguments, - array $expectedVirtualTypes, - array $expectedPreferences - ) { - /** @var CompiledConfig $compiledConfig */ - $compiledConfig = $this->objectManagerHelper->getObject(CompiledConfig::class, ['data' => $initialData]); - $compiledConfig->extend($configuration); + private $serializerMock; - foreach ($expectedArguments as $type => $arguments) { - $this->assertEquals($arguments, $compiledConfig->getArguments($type)); - } - - $this->assertEquals($expectedVirtualTypes, $compiledConfig->getVirtualTypes()); - $this->assertEquals($expectedPreferences, $compiledConfig->getPreferences()); + protected function setUp() + { + $this->objectManager = new ObjectManager($this); + $this->serializerMock = $this->getMock(SerializerInterface::class); } - /** - * @return array - */ - public function extendDataProvider() + public function testExtend() { - return [ - [ - 'initialData' => [ - 'arguments' => [ - 'type1' => serialize(['argument1_1' => 'argumentValue1_1', 'argument1_2' => 'argumentValue1_2']) - ], - 'instanceTypes' => [ - 'instanceType1' => 'instanceTypeValue1', 'instanceType2' => 'instanceTypeValue2' - ], - 'preferences' => ['preference1' => 'preferenceValue1', 'preference2' => 'preferenceValue2'] - ], - 'configuration' => [ - 'arguments' => [ - 'type1' => serialize(['argument1_1' => 'newArgumentValue1_1']), - 'type2' => serialize(['argument2_1' => 'newArgumentValue2_1']) - ], - 'instanceTypes' => [ - 'instanceType2' => 'newInstanceTypeValue2', 'instanceType3' => 'newInstanceTypeValue3' - ], - 'preferences' => ['preference1' => 'newPreferenceValue1'] - ], - 'expectedArguments' => [ - 'type1' => ['argument1_1' => 'newArgumentValue1_1'], - 'type2' => ['argument2_1' => 'newArgumentValue2_1'] - ], - 'expectedVirtualTypes' => [ - 'instanceType1' => 'instanceTypeValue1', 'instanceType2' => 'newInstanceTypeValue2', - 'instanceType3' => 'newInstanceTypeValue3' - ], - 'expectedPreferences' => [ - 'preference1' => 'newPreferenceValue1', 'preference2' => 'preferenceValue2' - ] + $initialData = [ + 'arguments' => [ + 'type1' => 'initial serialized configuration for type1' + ], + 'instanceTypes' => [ + 'instanceType1' => 'instanceTypeValue1', + 'instanceType2' => 'instanceTypeValue2' + ], + 'preferences' => [ + 'preference1' => 'preferenceValue1', + 'preference2' => 'preferenceValue2' + ] + ]; + $configuration = [ + 'arguments' => [ + 'type1' => 'serialized configuration for type1', + 'type2' => 'serialized configuration for type2' + ], + 'instanceTypes' => [ + 'instanceType2' => 'newInstanceTypeValue2', + 'instanceType3' => 'newInstanceTypeValue3' + ], + 'preferences' => [ + 'preference1' => 'newPreferenceValue1' ] ]; + $expectedArguments = [ + 'type1' => [ + 'argument1_1' => 'newArgumentValue1_1' + ], + 'type2' => [ + 'argument2_1' => 'newArgumentValue2_1' + ] + ]; + $expectedVirtualTypes = [ + 'instanceType1' => 'instanceTypeValue1', + 'instanceType2' => 'newInstanceTypeValue2', + 'instanceType3' => 'newInstanceTypeValue3' + ]; + $expectedPreferences = [ + 'preference1' => 'newPreferenceValue1', + 'preference2' => 'preferenceValue2' + ]; + $this->serializerMock->expects($this->at(0)) + ->method('unserialize') + ->with($configuration['arguments']['type1']) + ->willReturn($expectedArguments['type1']); + $this->serializerMock->expects($this->at(1)) + ->method('unserialize') + ->with($configuration['arguments']['type2']) + ->willReturn($expectedArguments['type2']); + $compiled = $this->objectManager->getObject( + Compiled::class, + [ + 'data' => $initialData, + 'serializer' => $this->serializerMock + ] + ); + $compiled->extend($configuration); + foreach ($expectedArguments as $type => $arguments) { + $this->assertEquals($arguments, $compiled->getArguments($type)); + } + $this->assertEquals($expectedVirtualTypes, $compiled->getVirtualTypes()); + $this->assertEquals($expectedPreferences, $compiled->getPreferences()); } } diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/ConfigTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/ConfigTest.php index 844d5fa94a62728e7f1bbbce850affd764214021..4cc51652fdb74454fde50182a3062b53b5616dc5 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/ConfigTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Config/ConfigTest.php @@ -5,10 +5,19 @@ */ namespace Magento\Framework\ObjectManager\Test\Unit\Config; +use Magento\Framework\Serialize\SerializerInterface; use \Magento\Framework\ObjectManager\Config\Config; class ConfigTest extends \PHPUnit_Framework_TestCase { + /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ + private $objectManagerHelper; + + protected function setUp() + { + $this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + } + public function testGetArgumentsEmpty() { $config = new Config(); @@ -42,6 +51,14 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $cache->expects($this->once())->method('get')->will($this->returnValue(false)); $config = new Config(null, $definitions); + $serializerMock = $this->getMock(SerializerInterface::class); + $serializerMock->expects($this->exactly(2)) + ->method('serialize'); + $this->objectManagerHelper->setBackwardCompatibleProperty( + $config, + 'serializer', + $serializerMock + ); $config->setCache($cache); $this->_assertFooTypeArguments($config); diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/BinaryTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/BinaryTest.php deleted file mode 100644 index 80cf73a44e7ac694a58646bb902690d9d00ab012..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/BinaryTest.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\ObjectManager\Test\Unit\Definition\Compiled; - -class BinaryTest extends \PHPUnit_Framework_TestCase -{ - public function testGetParametersWithUnpacking() - { - if (!function_exists('igbinary_serialize')) { - $this->markTestSkipped('This test requires igbinary PHP extension'); - } - $checkString = 'packed code'; - $signatures = ['wonderfulClass' => igbinary_serialize($checkString)]; - $definitions = ['wonderful' => 'wonderfulClass']; - $model = new \Magento\Framework\ObjectManager\Definition\Compiled\Binary([$signatures, $definitions]); - $this->assertEquals($checkString, $model->getParameters('wonderful')); - } -} diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/SerializedTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/SerializedTest.php deleted file mode 100644 index 9454377c3b7207dbfc355f022e1faedb75b61a52..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/Compiled/SerializedTest.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\ObjectManager\Test\Unit\Definition\Compiled; - -class SerializedTest extends \PHPUnit_Framework_TestCase -{ - public function testGetParametersWithoutDefinition() - { - $signatures = []; - $definitions = ['wonderful' => null]; - $model = new \Magento\Framework\ObjectManager\Definition\Compiled\Serialized([$signatures, $definitions]); - $this->assertEquals(null, $model->getParameters('wonderful')); - } - - public function testGetParametersWithSignatureObject() - { - $wonderfulSignature = new \stdClass(); - $signatures = ['wonderfulClass' => $wonderfulSignature]; - $definitions = ['wonderful' => 'wonderfulClass']; - $model = new \Magento\Framework\ObjectManager\Definition\Compiled\Serialized([$signatures, $definitions]); - $this->assertEquals($wonderfulSignature, $model->getParameters('wonderful')); - } - - public function testGetParametersWithUnpacking() - { - $checkString = 'code to pack'; - $signatures = ['wonderfulClass' => serialize($checkString)]; - $definitions = ['wonderful' => 'wonderfulClass']; - $model = new \Magento\Framework\ObjectManager\Definition\Compiled\Serialized([$signatures, $definitions]); - $this->assertEquals($checkString, $model->getParameters('wonderful')); - } -} diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledStub.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledStub.php deleted file mode 100644 index 16b8436a0c41aa7bf6506d34e61b58827032d5c1..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledStub.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\ObjectManager\Test\Unit\Definition; - -use \Magento\Framework\ObjectManager\Definition\Compiled; - -/** - * Stub class for abstract Magento\Framework\ObjectManager\DefinitionInterface - */ -class CompiledStub extends Compiled -{ - /** - * Unpack signature - * - * @param string $signature - * @return mixed - */ - protected function _unpack($signature) - { - return unserialize($signature); - } -} diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledTest.php deleted file mode 100644 index 0e7c79e8571d2686f561df97ed6832d93768d2fa..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Definition/CompiledTest.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Framework\ObjectManager\Test\Unit\Definition; - -use \Magento\Framework\ObjectManager\Definition\Compiled; - -class CompiledTest extends \PHPUnit_Framework_TestCase -{ - public function testGetParametersWithUndefinedDefinition() - { - $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $undefinedDefinitionSignature = new \stdClass(); - $className = 'undefinedDefinition'; - $readerMock = $this->getMock( - \Magento\Framework\Code\Reader\ClassReader::class, - ['getConstructor'], - [], - '', - false - ); - $readerMock->expects($this->once()) - ->method('getConstructor') - ->with($className) - ->willReturn($undefinedDefinitionSignature); - $model = $objectManager->getObject( - \Magento\Framework\ObjectManager\Test\Unit\Definition\CompiledStub::class, - [ - 'definitions' => [[], []], - 'reader' => $readerMock - ] - ); - $this->assertEquals($undefinedDefinitionSignature, $model->getParameters($className)); - } -} diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/DefinitionFactoryTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/DefinitionFactoryTest.php index 468e01ce80aba618d1b7447b3ca2a720c52cbe85..8c587cec4351ce1156f4043af8d16e7d827895d4 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/DefinitionFactoryTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/DefinitionFactoryTest.php @@ -3,119 +3,56 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Framework\ObjectManager\Test\Unit; -use Magento\Framework\ObjectManager\Definition\Compiled\Serialized; +use Magento\Framework\Filesystem\Driver\File; +use Magento\Framework\ObjectManager\DefinitionFactory; +use Magento\Framework\ObjectManager\DefinitionInterface; +use Magento\Framework\Interception\DefinitionInterface as InterceptionDefinitionInterface; +use Magento\Framework\ObjectManager\RelationsInterface; class DefinitionFactoryTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Framework\Filesystem\DriverInterface | \PHPUnit_Framework_MockObject_MockObject - */ - protected $filesystemDriverMock; - - /** - * @var \Magento\Framework\ObjectManager\DefinitionFactory + * @var File|\PHPUnit_Framework_MockObject_MockObject */ - protected $model; + private $filesystemDriverMock; /** - * @var string + * @var DefinitionFactory */ - protected $sampleContent; + private $definitionFactory; protected function setUp() { - $this->sampleContent = serialize([1, 2, 3]); - $this->filesystemDriverMock = $this->getMock( - \Magento\Framework\Filesystem\Driver\File::class, - [], - [], - '', - false - ); - $this->model = new \Magento\Framework\ObjectManager\DefinitionFactory( + $this->filesystemDriverMock = $this->getMock(File::class); + $this->definitionFactory = new DefinitionFactory( $this->filesystemDriverMock, - 'DefinitionDir', - 'GenerationDir', - Serialized::MODE_NAME + 'generation dir' ); } - public function testCreateClassDefinitionFromString() + public function testCreateClassDefinition() { $this->assertInstanceOf( - \Magento\Framework\ObjectManager\Definition\Compiled\Serialized::class, - $this->model->createClassDefinition($this->sampleContent) + DefinitionInterface::class, + $this->definitionFactory->createClassDefinition() ); } - /** - * @param string $path - * @param string $callMethod - * @param string $expectedClass - * @dataProvider createPluginsAndRelationsReadableDataProvider - */ - public function testCreatePluginsAndRelationsReadable($path, $callMethod, $expectedClass) - { - $this->filesystemDriverMock->expects($this->once())->method('isReadable') - ->with($path) - ->will($this->returnValue(true)); - $this->filesystemDriverMock->expects($this->once())->method('fileGetContents') - ->with($path) - ->will($this->returnValue($this->sampleContent)); - $this->assertInstanceOf($expectedClass, $this->model->$callMethod()); - } - - public function createPluginsAndRelationsReadableDataProvider() - { - return [ - 'relations' => [ - 'DefinitionDir/relations.ser', - 'createRelations', \Magento\Framework\ObjectManager\Relations\Compiled::class, - ], - 'plugins' => [ - 'DefinitionDir/plugins.ser', - 'createPluginDefinition', \Magento\Framework\Interception\Definition\Compiled::class, - ], - ]; - } - - /** - * @param string $path - * @param string $callMethod - * @param string $expectedClass - * @dataProvider createPluginsAndRelationsNotReadableDataProvider - */ - public function testCreatePluginsAndRelationsNotReadable($path, $callMethod, $expectedClass) + public function testCreatePluginDefinition() { - $this->filesystemDriverMock->expects($this->once())->method('isReadable') - ->with($path) - ->will($this->returnValue(false)); - $this->assertInstanceOf($expectedClass, $this->model->$callMethod()); - } - - public function createPluginsAndRelationsNotReadableDataProvider() - { - return [ - 'relations' => [ - 'DefinitionDir/relations.ser', - 'createRelations', \Magento\Framework\ObjectManager\Relations\Runtime::class, - ], - 'plugins' => [ - 'DefinitionDir/plugins.ser', - 'createPluginDefinition', \Magento\Framework\Interception\Definition\Runtime::class, - ], - ]; + $this->assertInstanceOf( + InterceptionDefinitionInterface::class, + $this->definitionFactory->createPluginDefinition() + ); } - public function testGetSupportedFormats() + public function testCreateRelations() { - $actual = \Magento\Framework\ObjectManager\DefinitionFactory::getSupportedFormats(); - $this->assertInternalType('array', $actual); - foreach ($actual as $className) { - $this->assertInternalType('string', $className); - } + $this->assertInstanceOf( + RelationsInterface::class, + $this->definitionFactory->createRelations() + ); } } diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/CompiledTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/CompiledTest.php deleted file mode 100644 index 336a798df100e156895ea5cd20768650909b2722..0000000000000000000000000000000000000000 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/Relations/CompiledTest.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Framework\ObjectManager\Test\Unit\Relations; - -class CompiledTest extends \PHPUnit_Framework_TestCase -{ - public function testHas() - { - $relations = ['amazing' => 'yes']; - - $model = new \Magento\Framework\ObjectManager\Relations\Compiled($relations); - $this->assertEquals(true, $model->has('amazing')); - $this->assertEquals(false, $model->has('fuzzy')); - } - - public function testGetParents() - { - $relations = ['amazing' => 'parents']; - - $model = new \Magento\Framework\ObjectManager\Relations\Compiled($relations); - $this->assertEquals('parents', $model->getParents('amazing')); - } -} diff --git a/lib/internal/Magento/Framework/Reflection/MethodsMap.php b/lib/internal/Magento/Framework/Reflection/MethodsMap.php index f7f402ae4b8a00c905e65678105f8461922d8571..c7a9183a78ee5e903355b06507402744349f83fc 100644 --- a/lib/internal/Magento/Framework/Reflection/MethodsMap.php +++ b/lib/internal/Magento/Framework/Reflection/MethodsMap.php @@ -6,6 +6,7 @@ namespace Magento\Framework\Reflection; +use Magento\Framework\Serialize\SerializerInterface; use Zend\Code\Reflection\ClassReflection; use Zend\Code\Reflection\MethodReflection; use Zend\Code\Reflection\ParameterReflection; @@ -45,6 +46,11 @@ class MethodsMap */ private $fieldNamer; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\Cache\FrontendInterface $cache * @param TypeProcessor $typeProcessor @@ -95,11 +101,11 @@ class MethodsMap if (!isset($this->serviceInterfaceMethodsMap[$key])) { $methodMap = $this->cache->load($key); if ($methodMap) { - $this->serviceInterfaceMethodsMap[$key] = unserialize($methodMap); + $this->serviceInterfaceMethodsMap[$key] = $this->getSerializer()->unserialize($methodMap); } else { $methodMap = $this->getMethodMapViaReflection($interfaceName); $this->serviceInterfaceMethodsMap[$key] = $methodMap; - $this->cache->save(serialize($this->serviceInterfaceMethodsMap[$key]), $key); + $this->cache->save($this->getSerializer()->serialize($this->serviceInterfaceMethodsMap[$key]), $key); } } return $this->serviceInterfaceMethodsMap[$key]; @@ -117,7 +123,7 @@ class MethodsMap $cacheId = self::SERVICE_METHOD_PARAMS_CACHE_PREFIX . hash('md5', $serviceClassName . $serviceMethodName); $params = $this->cache->load($cacheId); if ($params !== false) { - return unserialize($params); + return $this->getSerializer()->unserialize($params); } $serviceClass = new ClassReflection($serviceClassName); /** @var MethodReflection $serviceMethod */ @@ -133,7 +139,7 @@ class MethodsMap self::METHOD_META_DEFAULT_VALUE => $isDefaultValueAvailable ? $paramReflection->getDefaultValue() : null ]; } - $this->cache->save(serialize($params), $cacheId, [ReflectionCache::CACHE_TAG]); + $this->cache->save($this->getSerializer()->serialize($params), $cacheId, [ReflectionCache::CACHE_TAG]); return $params; } @@ -217,4 +223,19 @@ class MethodsMap $methods = $this->getMethodsMap($type); return $methods[$methodName]['isRequired']; } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/lib/internal/Magento/Framework/Reflection/Test/Unit/MethodsMapTest.php b/lib/internal/Magento/Framework/Reflection/Test/Unit/MethodsMapTest.php index 6f4dc37b8faff83791030ddbdee16e80a1fdfb02..67a372c4d33ca754d7d35e9005730c55a55e4a19 100644 --- a/lib/internal/Magento/Framework/Reflection/Test/Unit/MethodsMapTest.php +++ b/lib/internal/Magento/Framework/Reflection/Test/Unit/MethodsMapTest.php @@ -6,9 +6,9 @@ namespace Magento\Framework\Reflection\Test\Unit; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Framework\Reflection\MethodsMap; use Magento\Framework\Reflection\TypeProcessor; -use Magento\Framework\Reflection\FieldNamer; /** * MethodsMap test @@ -18,7 +18,10 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase /** * @var MethodsMap */ - private $model; + private $object; + + /** @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $serializerMock; /** * Set up helper. @@ -39,7 +42,7 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase ->getMockForAbstractClass(); $fieldNamerMock = $this->getMockBuilder(\Magento\Framework\Reflection\FieldNamer::class) ->getMockForAbstractClass(); - $this->model = $objectManager->getObject( + $this->object = $objectManager->getObject( \Magento\Framework\Reflection\MethodsMap::class, [ 'cache' => $cacheMock, @@ -48,27 +51,33 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase 'fieldNamer' => $fieldNamerMock, ] ); + $this->serializerMock = $this->getMock(SerializerInterface::class); + $objectManager->setBackwardCompatibleProperty( + $this->object, + 'serializer', + $this->serializerMock + ); } public function testGetMethodReturnType() { $this->assertEquals( 'string', - $this->model->getMethodReturnType( + $this->object->getMethodReturnType( \Magento\Framework\Reflection\FieldNamer::class, 'getFieldNameForMethodName' ) ); $this->assertEquals( 'mixed', - $this->model->getMethodReturnType( + $this->object->getMethodReturnType( \Magento\Framework\Reflection\TypeCaster::class, 'castValueToType' ) ); $this->assertEquals( 'array', - $this->model->getMethodReturnType( + $this->object->getMethodReturnType( \Magento\Framework\Reflection\MethodsMap::class, 'getMethodsMap' ) @@ -77,42 +86,46 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase public function testGetMethodsMap() { - $methodsMap = $this->model->getMethodsMap(\Magento\Framework\Reflection\MethodsMap::class); - $this->assertEquals( - [ - 'getMethodReturnType' => [ - 'type' => 'string', - 'isRequired' => true, - 'description' => null, - 'parameterCount' => 2, - ], - 'getMethodsMap' => [ - 'type' => 'array', - 'isRequired' => true, - 'description' => "<pre> Service methods' reflection data stored in cache as 'methodName' => " - . "'returnType' ex. [ 'create' => '\Magento\Customer\Api\Data\Customer', 'validatePassword' " - . "=> 'boolean' ] </pre>", - 'parameterCount' => 1, - ], - 'getMethodParams' => [ - 'type' => 'array', - 'isRequired' => true, - 'description' => null, - 'parameterCount' => 2 - ], - 'isMethodValidForDataField' => [ - 'type' => 'bool', - 'isRequired' => true, - 'description' => null, - 'parameterCount' => 2, - ], - 'isMethodReturnValueRequired' => [ - 'type' => 'bool', - 'isRequired' => true, - 'description' => null, - 'parameterCount' => 2, - ], + $data = [ + 'getMethodReturnType' => [ + 'type' => 'string', + 'isRequired' => true, + 'description' => null, + 'parameterCount' => 2, + ], + 'getMethodsMap' => [ + 'type' => 'array', + 'isRequired' => true, + 'description' => "<pre> Service methods' reflection data stored in cache as 'methodName' => " + . "'returnType' ex. [ 'create' => '\Magento\Customer\Api\Data\Customer', 'validatePassword' " + . "=> 'boolean' ] </pre>", + 'parameterCount' => 1, ], + 'getMethodParams' => [ + 'type' => 'array', + 'isRequired' => true, + 'description' => null, + 'parameterCount' => 2 + ], + 'isMethodValidForDataField' => [ + 'type' => 'bool', + 'isRequired' => true, + 'description' => null, + 'parameterCount' => 2, + ], + 'isMethodReturnValueRequired' => [ + 'type' => 'bool', + 'isRequired' => true, + 'description' => null, + 'parameterCount' => 2, + ], + ]; + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($data); + $methodsMap = $this->object->getMethodsMap(\Magento\Framework\Reflection\MethodsMap::class); + $this->assertEquals( + $data, $methodsMap ); } @@ -125,7 +138,7 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase */ public function testIsMethodValidForDataField($type, $methodName, $expectedResult) { - $this->assertEquals($this->model->isMethodValidForDataField($type, $methodName), $expectedResult); + $this->assertEquals($this->object->isMethodValidForDataField($type, $methodName), $expectedResult); } /** @@ -157,7 +170,7 @@ class MethodsMapTest extends \PHPUnit_Framework_TestCase */ public function testIsMethodReturnValueRequired($type, $methodName, $expectedResult) { - $this->assertEquals($this->model->isMethodValidForDataField($type, $methodName), $expectedResult); + $this->assertEquals($this->object->isMethodValidForDataField($type, $methodName), $expectedResult); } /** diff --git a/lib/internal/Magento/Framework/Search/Request/Config.php b/lib/internal/Magento/Framework/Search/Request/Config.php index b348f214dd4c2f1496224651854a2aad16264186..80a963af39b41e0ca6327383dcff1c50132510d0 100644 --- a/lib/internal/Magento/Framework/Search/Request/Config.php +++ b/lib/internal/Magento/Framework/Search/Request/Config.php @@ -5,21 +5,32 @@ */ namespace Magento\Framework\Search\Request; +use Magento\Framework\Serialize\SerializerInterface; + +/** + * Provides search request configuration + */ class Config extends \Magento\Framework\Config\Data { - /** Cache ID for Search Request*/ + /** + * Cache identifier + */ const CACHE_ID = 'request_declaration'; /** + * Constructor + * * @param \Magento\Framework\Search\Request\Config\FilesystemReader $reader * @param \Magento\Framework\Config\CacheInterface $cache - * @param string $cacheId + * @param string|null $cacheId + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\Framework\Search\Request\Config\FilesystemReader $reader, \Magento\Framework\Config\CacheInterface $cache, - $cacheId = self::CACHE_ID + $cacheId = self::CACHE_ID, + SerializerInterface $serializer = null ) { - parent::__construct($reader, $cache, $cacheId); + parent::__construct($reader, $cache, $cacheId, $serializer); } } diff --git a/lib/internal/Magento/Framework/Test/Unit/TranslateTest.php b/lib/internal/Magento/Framework/Test/Unit/TranslateTest.php index 8d1692dd9cdc147bc76d0fa425cba4436e31ef5e..a8199768a365f5b638124b428ae6338ea9864cd3 100644 --- a/lib/internal/Magento/Framework/Test/Unit/TranslateTest.php +++ b/lib/internal/Magento/Framework/Test/Unit/TranslateTest.php @@ -5,6 +5,7 @@ */ namespace Magento\Framework\Test\Unit; +use Magento\Framework\Serialize\SerializerInterface; use \Magento\Framework\Translate; /** @@ -59,6 +60,7 @@ class TranslateTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->viewDesign = $this->getMock(\Magento\Framework\View\DesignInterface::class, [], [], '', false); $this->cache = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class, [], [], '', false); $this->viewFileSystem = $this->getMock(\Magento\Framework\View\FileSystem::class, [], [], '', false); @@ -104,6 +106,21 @@ class TranslateTest extends \PHPUnit_Framework_TestCase $this->csvParser, $this->packDictionary ); + + $serializerMock = $this->getMock(SerializerInterface::class); + $serializerMock->method('serialize') + ->willReturnCallback(function ($data) { + return json_encode($data); + }); + $serializerMock->method('unserialize') + ->willReturnCallback(function ($string) { + return json_decode($string, true); + }); + $objectManager->setBackwardCompatibleProperty( + $this->translate, + 'serializer', + $serializerMock + ); } /** @@ -119,7 +136,7 @@ class TranslateTest extends \PHPUnit_Framework_TestCase $this->cache->expects($this->exactly($forceReload ? 0 : 1)) ->method('load') - ->will($this->returnValue(serialize($cachedData))); + ->will($this->returnValue(json_encode($cachedData))); if (!$forceReload && $cachedData !== false) { $this->translate->loadData($area, $forceReload); @@ -222,7 +239,7 @@ class TranslateTest extends \PHPUnit_Framework_TestCase { $this->cache->expects($this->once()) ->method('load') - ->will($this->returnValue(serialize($data))); + ->will($this->returnValue(json_encode($data))); $this->expectsSetConfig('themeId'); $this->translate->loadData('frontend'); $this->assertEquals($result, $this->translate->getData()); diff --git a/lib/internal/Magento/Framework/Translate.php b/lib/internal/Magento/Framework/Translate.php index 36f693270f42f6f8e4ceda68e13cb45bde426c42..c5571ab0b8edb282ba164e5ec36f9a3b9e2c9f96 100644 --- a/lib/internal/Magento/Framework/Translate.php +++ b/lib/internal/Magento/Framework/Translate.php @@ -108,6 +108,11 @@ class Translate implements \Magento\Framework\TranslateInterface */ protected $packDictionary; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * @param \Magento\Framework\View\DesignInterface $viewDesign * @param \Magento\Framework\Cache\FrontendInterface $cache @@ -474,7 +479,7 @@ class Translate implements \Magento\Framework\TranslateInterface { $data = $this->_cache->load($this->getCacheId()); if ($data) { - $data = unserialize($data); + $data = $this->getSerializer()->unserialize($data); } return $data; } @@ -486,7 +491,22 @@ class Translate implements \Magento\Framework\TranslateInterface */ protected function _saveCache() { - $this->_cache->save(serialize($this->getData()), $this->getCacheId(true), [], false); + $this->_cache->save($this->getSerializer()->serialize($this->getData()), $this->getCacheId(true), [], false); return $this; } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(Serialize\SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/lib/internal/Magento/Framework/Unserialize/README.md b/lib/internal/Magento/Framework/Unserialize/README.md index 971bd6980abb136c2246e4618a8776be8bdaa16d..2dbf7436aa60fbc23b378102418ef4dbc8634e85 100644 --- a/lib/internal/Magento/Framework/Unserialize/README.md +++ b/lib/internal/Magento/Framework/Unserialize/README.md @@ -1,2 +1 @@ -Library provides custom unserialize method. Method checks if serialized string contains serialized object and do not -unserialize it. If string doesn't contain serialized object, method calls native PHP function unserialize. \ No newline at end of file +This library is deprecated, please use Magento\Framework\Serialize\SerializerInterface instead. \ No newline at end of file diff --git a/lib/internal/Magento/Framework/Unserialize/Unserialize.php b/lib/internal/Magento/Framework/Unserialize/Unserialize.php index 9d4785915a6dd6b8e3a03b7108fecb21b3b4712a..cfd3e81ca6b0942c879f24994feeb391e3e4cf0b 100644 --- a/lib/internal/Magento/Framework/Unserialize/Unserialize.php +++ b/lib/internal/Magento/Framework/Unserialize/Unserialize.php @@ -6,6 +6,9 @@ namespace Magento\Framework\Unserialize; +/** + * @deprecated + */ class Unserialize { /** diff --git a/lib/internal/Magento/Framework/Validator/Factory.php b/lib/internal/Magento/Framework/Validator/Factory.php index d2e3837d131382becdf07413b373a944bea75f4e..76633f48dfe0b96fcbe473aa579817339173685e 100644 --- a/lib/internal/Magento/Framework/Validator/Factory.php +++ b/lib/internal/Magento/Framework/Validator/Factory.php @@ -1,20 +1,20 @@ <?php /** - * Magento validator config factory - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - -// @codingStandardsIgnoreFile - namespace Magento\Framework\Validator; use Magento\Framework\Cache\FrontendInterface; +/** + * @codingStandardsIgnoreFile + */ class Factory { - /** cache key */ + /** + * Cache key + */ const CACHE_KEY = __CLASS__; /** @@ -44,6 +44,16 @@ class Factory */ private $cache; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + + /** + * @var \Magento\Framework\Config\FileIteratorFactory + */ + private $fileIteratorFactory; + /** * Initialize dependencies * @@ -70,9 +80,10 @@ class Factory $this->_configFiles = $this->cache->load(self::CACHE_KEY); if (!$this->_configFiles) { $this->_configFiles = $this->moduleReader->getConfigurationFiles('validation.xml'); - $this->cache->save(serialize($this->_configFiles), self::CACHE_KEY); + $this->cache->save($this->getSerializer()->serialize($this->_configFiles->toArray()), self::CACHE_KEY); } else { - $this->_configFiles = unserialize($this->_configFiles); + $filesArray = $this->getSerializer()->unserialize($this->_configFiles); + $this->_configFiles = $this->getFileIteratorFactory()->create(array_keys($filesArray)); } } } @@ -109,7 +120,7 @@ class Factory { $this->_initializeConfigList(); $this->_initializeDefaultTranslator(); - return $this->_objectManager->create( + return $this->_objectManager->create( \Magento\Framework\Validator\Config::class, ['configFiles' => $this->_configFiles]); } @@ -140,4 +151,33 @@ class Factory $this->_initializeDefaultTranslator(); return $this->getValidatorConfig()->createValidator($entityName, $groupName, $builderConfig); } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = $this->_objectManager->get(\Magento\Framework\Serialize\SerializerInterface::class); + } + return $this->serializer; + } + + /** + * Get file iterator factory + * + * @return \Magento\Framework\Config\FileIteratorFactory + * @deprecated + */ + private function getFileIteratorFactory() + { + if ($this->fileIteratorFactory === null) { + $this->fileIteratorFactory = $this->_objectManager + ->get(\Magento\Framework\Config\FileIteratorFactory::class); + } + return $this->fileIteratorFactory; + } } diff --git a/lib/internal/Magento/Framework/Validator/Test/Unit/FactoryTest.php b/lib/internal/Magento/Framework/Validator/Test/Unit/FactoryTest.php index bb829010795e85957dce379405fa4111300dbb36..4c4ef93bc15be7102347c06917e8806eb7aefd5d 100644 --- a/lib/internal/Magento/Framework/Validator/Test/Unit/FactoryTest.php +++ b/lib/internal/Magento/Framework/Validator/Test/Unit/FactoryTest.php @@ -1,98 +1,139 @@ <?php /** - * Unit test for \Magento\Framework\Validator\Factory - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\Validator\Test\Unit; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class FactoryTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Framework\ObjectManagerInterface + * @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $objectManagerMock; + + /** + * @var \Magento\Framework\Module\Dir\Reader|\PHPUnit_Framework_MockObject_MockObject + */ + private $readerMock; + + /** + * @var \Magento\Framework\Validator\Config|\PHPUnit_Framework_MockObject_MockObject + */ + private $validatorConfigMock; + + /** + * @var \Magento\Framework\Cache\FrontendInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $cacheMock; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_objectManager; + private $serializerMock; /** - * @var \Magento\Framework\Module\Dir\Reader + * @var \Magento\Framework\Config\FileIteratorFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $_config; + private $fileIteratorFactoryMock; /** - * @var \Magento\Framework\TranslateInterface + * @var \Magento\Framework\Config\FileIterator|\PHPUnit_Framework_MockObject_MockObject */ - protected $_translateAdapter; + private $fileIteratorMock; /** - * @var \Magento\Framework\Validator\Config + * @var \Magento\Framework\Translate\AdapterInterface */ - protected $_validatorConfig; + private $defaultTranslator; - private $cache; + /** + * @var \Magento\Framework\Validator\Factory + */ + private $factory; /** - * @var \Magento\Framework\Translate\AdapterInterface|null + * @var string */ - protected $_defaultTranslator = null; + private $jsonString = '["\/tmp\/moduleOne\/etc\/validation.xml"]'; /** - * Save default translator + * @var array */ + private $data = ['/tmp/moduleOne/etc/validation.xml']; + protected function setUp() { - $this->_defaultTranslator = \Magento\Framework\Validator\AbstractValidator::getDefaultTranslator(); - $this->_objectManager = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); - $this->_validatorConfig = $this->getMockBuilder( - \Magento\Framework\Validator\Config::class - )->setMethods( - ['createValidatorBuilder', 'createValidator'] - )->disableOriginalConstructor()->getMock(); - - $this->_objectManager->expects( - $this->at(0) - )->method( - 'create' - )->with( - \Magento\Framework\Translate\Adapter::class - )->will( - $this->returnValue(new \Magento\Framework\Translate\Adapter()) - ); + $this->defaultTranslator = \Magento\Framework\Validator\AbstractValidator::getDefaultTranslator(); - $this->_objectManager->expects( - $this->at(1) - )->method( - 'create' - )->with( + $this->objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); + $this->validatorConfigMock = $this->getMock( \Magento\Framework\Validator\Config::class, - ['configFiles' => ['/tmp/moduleOne/etc/validation.xml']] - )->will( - $this->returnValue($this->_validatorConfig) + ['createValidatorBuilder', 'createValidator'], + [], + '', + false ); - - // Config mock - $this->_config = $this->getMockBuilder( - \Magento\Framework\Module\Dir\Reader::class - )->setMethods( - ['getConfigurationFiles'] - )->disableOriginalConstructor()->getMock(); - $this->_config->expects( - $this->once() - )->method( - 'getConfigurationFiles' - )->with( - 'validation.xml' - )->will( - $this->returnValue(['/tmp/moduleOne/etc/validation.xml']) + $translateAdapterMock = $this->getMock(\Magento\Framework\Translate\Adapter::class, [], [], '', false); + $this->objectManagerMock->expects($this->at(0)) + ->method('create') + ->with(\Magento\Framework\Translate\Adapter::class) + ->willReturn($translateAdapterMock); + $this->fileIteratorMock = $this->getMock( + \Magento\Framework\Config\FileIterator::class, + [], + [], + '', + false + ); + $this->objectManagerMock->expects($this->at(1)) + ->method('create') + ->with( + \Magento\Framework\Validator\Config::class, + ['configFiles' => $this->fileIteratorMock] + ) + ->willReturn($this->validatorConfigMock); + $this->readerMock = $this->getMock( + \Magento\Framework\Module\Dir\Reader::class, + ['getConfigurationFiles'], + [], + '', + false ); + $this->cacheMock = $this->getMock(\Magento\Framework\Cache\FrontendInterface::class); - // Translate adapter mock - $this->_translateAdapter = $this->getMockBuilder( - \Magento\Framework\TranslateInterface::class - )->disableOriginalConstructor()->getMock(); + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->factory = $objectManager->getObject( + \Magento\Framework\Validator\Factory::class, + [ + 'objectManager' => $this->objectManagerMock, + 'moduleReader' => $this->readerMock, + 'cache' => $this->cacheMock + ] + ); - $this->cache = $this->getMockBuilder(\Magento\Framework\Cache\FrontendInterface::class) - ->getMockForAbstractClass(); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class); + $this->fileIteratorFactoryMock = $this->getMock( + \Magento\Framework\Config\FileIteratorFactory::class, + [], + [], + '', + false + ); + $objectManager->setBackwardCompatibleProperty( + $this->factory, + 'serializer', + $this->serializerMock + ); + $objectManager->setBackwardCompatibleProperty( + $this->factory, + 'fileIteratorFactory', + $this->fileIteratorFactoryMock + ); } /** @@ -100,87 +141,103 @@ class FactoryTest extends \PHPUnit_Framework_TestCase */ protected function tearDown() { - \Magento\Framework\Validator\AbstractValidator::setDefaultTranslator($this->_defaultTranslator); - unset($this->_defaultTranslator); + \Magento\Framework\Validator\AbstractValidator::setDefaultTranslator($this->defaultTranslator); + unset($this->defaultTranslator); } - /** - * Test getValidatorConfig created correct validator config. Check that validator translator was initialized. - */ public function testGetValidatorConfig() { - $factory = new \Magento\Framework\Validator\Factory( - $this->_objectManager, - $this->_config, - $this->cache - ); - $actualConfig = $factory->getValidatorConfig(); + $this->readerMock->method('getConfigurationFiles') + ->with('validation.xml') + ->willReturn($this->fileIteratorMock); + $this->fileIteratorMock->method('toArray') + ->willReturn($this->data); + $actualConfig = $this->factory->getValidatorConfig(); $this->assertInstanceOf( \Magento\Framework\Validator\Config::class, $actualConfig, 'Object of incorrect type was created' ); - - // Check that validator translator was correctly instantiated - $validatorTranslator = \Magento\Framework\Validator\AbstractValidator::getDefaultTranslator(); $this->assertInstanceOf( \Magento\Framework\Translate\Adapter::class, - $validatorTranslator, + \Magento\Framework\Validator\AbstractValidator::getDefaultTranslator(), 'Default validator translate adapter was not set correctly' ); } - /** - * Test createValidatorBuilder call - */ + public function testGetValidatorConfigCacheNotExist() + { + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn(false); + $this->readerMock->expects($this->once()) + ->method('getConfigurationFiles') + ->willReturn($this->fileIteratorMock); + $this->fileIteratorMock->method('toArray') + ->willReturn($this->data); + $this->cacheMock->expects($this->once()) + ->method('save') + ->with($this->jsonString); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with($this->data) + ->willReturn($this->jsonString); + $this->factory->getValidatorConfig(); + $this->factory->getValidatorConfig(); + } + + public function testGetValidatorConfigCacheExist() + { + $this->cacheMock->expects($this->once()) + ->method('load') + ->willReturn($this->jsonString); + $this->readerMock->expects($this->never()) + ->method('getConfigurationFiles'); + $this->cacheMock->expects($this->never()) + ->method('save'); + $this->serializerMock->expects($this->once()) + ->method('unserialize') + ->with($this->jsonString) + ->willReturn($this->data); + $this->fileIteratorFactoryMock->method('create') + ->willReturn($this->fileIteratorMock); + $this->factory->getValidatorConfig(); + $this->factory->getValidatorConfig(); + } + public function testCreateValidatorBuilder() { - $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->_validatorConfig->expects( - $this->once() - )->method( - 'createValidatorBuilder' - )->with( - 'test', - 'class', - [] - )->will( - $this->returnValue( - $objectManager->getObject(\Magento\Framework\Validator\Builder::class, ['constraints' => []]) - ) - ); - $factory = new \Magento\Framework\Validator\Factory( - $this->_objectManager, - $this->_config, - $this->cache - ); + $this->readerMock->method('getConfigurationFiles') + ->with('validation.xml') + ->willReturn($this->fileIteratorMock); + $this->fileIteratorMock->method('toArray') + ->willReturn($this->data); + $builderMock = $this->getMock(\Magento\Framework\Validator\Builder::class, [], [], '', false); + $this->validatorConfigMock->expects($this->once()) + ->method('createValidatorBuilder') + ->with('test', 'class', []) + ->willReturn($builderMock); $this->assertInstanceOf( \Magento\Framework\Validator\Builder::class, - $factory->createValidatorBuilder('test', 'class', []) + $this->factory->createValidatorBuilder('test', 'class', []) ); } - /** - * Test createValidatorBuilder call - */ public function testCreateValidator() { - $this->_validatorConfig->expects( - $this->once() - )->method( - 'createValidator' - )->with( - 'test', - 'class', - [] - )->will( - $this->returnValue(new \Magento\Framework\Validator()) - ); - $factory = new \Magento\Framework\Validator\Factory( - $this->_objectManager, - $this->_config, - $this->cache + $this->readerMock->method('getConfigurationFiles') + ->with('validation.xml') + ->willReturn($this->fileIteratorMock); + $this->fileIteratorMock->method('toArray') + ->willReturn($this->data); + $validatorMock = $this->getMock(\Magento\Framework\Validator::class, [], [], '', false); + $this->validatorConfigMock->expects($this->once()) + ->method('createValidator') + ->with('test', 'class', []) + ->willReturn($validatorMock); + $this->assertInstanceOf( + \Magento\Framework\Validator::class, + $this->factory->createValidator('test', 'class', []) ); - $this->assertInstanceOf(\Magento\Framework\Validator::class, $factory->createValidator('test', 'class', [])); } } diff --git a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php index 1980da578c248cb8ccc8cc95e2e41c6097b0c45c..3778839894adbb93edc2d65dc4e1cdf088212d04 100644 --- a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php +++ b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php @@ -39,6 +39,11 @@ class Definition */ protected $componentData; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * Constructor * @@ -56,9 +61,9 @@ class Definition $cachedData = $this->cache->load(static::CACHE_ID); if ($cachedData === false) { $data = $uiReader->read(); - $this->cache->save(serialize($data), static::CACHE_ID); + $this->cache->save($this->getSerializer()->serialize($data), static::CACHE_ID); } else { - $data = unserialize($cachedData); + $data = $this->getSerializer()->unserialize($cachedData); } $this->prepareComponentData($data); } @@ -109,4 +114,19 @@ class Definition $this->setComponentData($name, reset($data)); } } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Serialize\SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Template.php b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Template.php index 79d185b2b26a700ea82734bc037f8fda4c082d1c..f740a2e403bb8f86da3501e7d9716567b93917b2 100644 --- a/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Template.php +++ b/lib/internal/Magento/Framework/View/Element/UiComponent/Config/Provider/Template.php @@ -5,9 +5,6 @@ */ namespace Magento\Framework\View\Element\UiComponent\Config\Provider; -use Magento\Framework\Config\CacheInterface; -use Magento\Framework\View\Element\UiComponent\Config\ReaderFactory; -use Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface; use Magento\Framework\View\Element\UiComponent\Config\FileCollector\AggregatedFileCollector; use Magento\Framework\View\Element\UiComponent\Config\FileCollector\AggregatedFileCollectorFactory; @@ -32,19 +29,19 @@ class Template protected $aggregatedFileCollector; /** - * @var DomMergerInterface + * @var \Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface */ protected $domMerger; /** - * @var CacheInterface + * @var \Magento\Framework\Config\CacheInterface */ protected $cache; /** * Factory for UI config reader * - * @var ReaderFactory + * @var \Magento\Framework\View\Element\UiComponent\Config\ReaderFactory */ protected $readerFactory; @@ -58,20 +55,25 @@ class Template */ protected $cachedTemplates = []; + /** + * @var \Magento\Framework\Serialize\SerializerInterface + */ + private $serializer; + /** * Constructor * * @param AggregatedFileCollector $aggregatedFileCollector - * @param DomMergerInterface $domMerger - * @param CacheInterface $cache - * @param ReaderFactory $readerFactory + * @param \Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface $domMerger + * @param \Magento\Framework\Config\CacheInterface $cache + * @param \Magento\Framework\View\Element\UiComponent\Config\ReaderFactory $readerFactory * @param AggregatedFileCollectorFactory $aggregatedFileCollectorFactory */ public function __construct( AggregatedFileCollector $aggregatedFileCollector, - DomMergerInterface $domMerger, - CacheInterface $cache, - ReaderFactory $readerFactory, + \Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface $domMerger, + \Magento\Framework\Config\CacheInterface $cache, + \Magento\Framework\View\Element\UiComponent\Config\ReaderFactory $readerFactory, AggregatedFileCollectorFactory $aggregatedFileCollectorFactory ) { $this->aggregatedFileCollector = $aggregatedFileCollector; @@ -81,7 +83,9 @@ class Template $this->aggregatedFileCollectorFactory = $aggregatedFileCollectorFactory; $cachedTemplates = $this->cache->load(static::CACHE_ID); - $this->cachedTemplates = $cachedTemplates === false ? [] : unserialize($cachedTemplates); + $this->cachedTemplates = $cachedTemplates === false ? [] : $this->getSerializer()->unserialize( + $cachedTemplates + ); } /** @@ -104,8 +108,23 @@ class Template 'domMerger' => $this->domMerger ] )->getContent(); - $this->cache->save(serialize($this->cachedTemplates), static::CACHE_ID); + $this->cache->save($this->getSerializer()->serialize($this->cachedTemplates), static::CACHE_ID); return $this->cachedTemplates[$hash]; } + + /** + * Get serializer + * + * @return \Magento\Framework\Serialize\SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if ($this->serializer === null) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(\Magento\Framework\Serialize\SerializerInterface::class); + } + return $this->serializer; + } } diff --git a/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php b/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php index 0ebb6d9be4f3dfb55cfa6650e7714519fd96748f..658755d38a4e86ea8ffcc4e8333e30e4f6507658 100644 --- a/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php +++ b/lib/internal/Magento/Framework/Webapi/Test/Unit/ServiceInputProcessorTest.php @@ -8,6 +8,7 @@ namespace Magento\Framework\Webapi\Test\Unit; +use Magento\Framework\Serialize\SerializerInterface; use Magento\Framework\Webapi\ServiceInputProcessor; use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\WebapiBuilderFactory; use Magento\Framework\Webapi\Test\Unit\ServiceInputProcessor\AssociativeArray; @@ -97,6 +98,16 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase 'fieldNamer' => $this->fieldNamer ] ); + $serializerMock = $this->getMock(SerializerInterface::class); + $serializerMock->method('serialize') + ->willReturn('serializedData'); + $serializerMock->method('unserialize') + ->willReturn('unserializedData'); + $objectManager->setBackwardCompatibleProperty( + $this->methodsMap, + 'serializer', + $serializerMock + ); $this->serviceInputProcessor = $objectManager->getObject( \Magento\Framework\Webapi\ServiceInputProcessor::class, @@ -111,10 +122,11 @@ class ServiceInputProcessorTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Framework\Reflection\NameFinder $nameFinder */ $nameFinder = $objectManager->getObject(\Magento\Framework\Reflection\NameFinder::class); - $serviceInputProcessorReflection = new \ReflectionClass(get_class($this->serviceInputProcessor)); - $typeResolverReflection = $serviceInputProcessorReflection->getProperty('nameFinder'); - $typeResolverReflection->setAccessible(true); - $typeResolverReflection->setValue($this->serviceInputProcessor, $nameFinder); + $objectManager->setBackwardCompatibleProperty( + $this->serviceInputProcessor, + 'nameFinder', + $nameFinder + ); } public function testSimpleProperties() diff --git a/lib/web/css/source/components/_modals.less b/lib/web/css/source/components/_modals.less index daf325efd3a0276e7ad7e7318e75451b8474cb78..ea866d4775ac23728d62bf2782be416d314cc06d 100644 --- a/lib/web/css/source/components/_modals.less +++ b/lib/web/css/source/components/_modals.less @@ -189,6 +189,8 @@ // If applied, switching outer popup scroll to inner &._inner-scroll { overflow-y: visible; + + .ie11 &, .ie10 &, .ie9 & { overflow-y: auto; @@ -196,6 +198,8 @@ .modal-inner-wrap { max-height: 90%; + + .ie11 &, .ie10 &, .ie9 & { max-height: none; diff --git a/lib/web/mage/adminhtml/wysiwyg/tiny_mce/setup.js b/lib/web/mage/adminhtml/wysiwyg/tiny_mce/setup.js index 2c4ab52b896cb8fd8bf01974d7f39cfc8f11e4f4..057f492509192292022cf7290f6d18dc872c62b1 100755 --- a/lib/web/mage/adminhtml/wysiwyg/tiny_mce/setup.js +++ b/lib/web/mage/adminhtml/wysiwyg/tiny_mce/setup.js @@ -329,8 +329,9 @@ define([ encodeDirectives: function(content) { // collect all HTML tags with attributes that contain directives - return content.gsub(/<([a-z0-9\-\_]+.+?)([a-z0-9\-\_]+=".*?\{\{.+?\}\}.*?".+?)>/i, function(match) { + return content.gsub(/<([a-z0-9\-\_]+.+?)([a-z0-9\-\_]+=".*?\{\{.+?\}\}.*?".*?)>/i, function(match) { var attributesString = match[2]; + // process tag attributes string attributesString = attributesString.gsub(/([a-z0-9\-\_]+)="(.*?)(\{\{.+?\}\})(.*?)"/i, function(m) { return m[1] + '="' + m[2] + this.makeDirectiveUrl(Base64.mageEncode(m[3])) + m[4] + '"'; diff --git a/app/code/Magento/Deploy/Console/Command/DeployStaticContentCommand.php b/setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php similarity index 96% rename from app/code/Magento/Deploy/Console/Command/DeployStaticContentCommand.php rename to setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php index 8a006c8154b4b97eb6d39c1d41f8363b3e4df761..e7badbf908b1015c5a47034e2aae99397451a1a3 100644 --- a/app/code/Magento/Deploy/Console/Command/DeployStaticContentCommand.php +++ b/setup/src/Magento/Setup/Console/Command/DeployStaticContentCommand.php @@ -3,15 +3,15 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Deploy\Console\Command; +namespace Magento\Setup\Console\Command; use Magento\Framework\App\Utility\Files; +use Magento\Setup\Model\ObjectManagerProvider; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputArgument; -use Magento\Framework\App\ObjectManagerFactory; use Magento\Framework\ObjectManagerInterface; use Magento\Framework\Validator\Locale; use Magento\Framework\Exception\LocalizedException; @@ -64,13 +64,6 @@ class DeployStaticContentCommand extends Command */ private $validator; - /** - * Factory to get object manager - * - * @var ObjectManagerFactory - */ - private $objectManagerFactory; - /** * object manager to create various objects * @@ -85,19 +78,16 @@ class DeployStaticContentCommand extends Command /** * Inject dependencies * - * @param ObjectManagerFactory $objectManagerFactory * @param Locale $validator - * @param ObjectManagerInterface $objectManager + * @param ObjectManagerProvider $objectManagerProvider * @throws \LogicException When the command name is empty */ public function __construct( - ObjectManagerFactory $objectManagerFactory, Locale $validator, - ObjectManagerInterface $objectManager + ObjectManagerProvider $objectManagerProvider ) { - $this->objectManagerFactory = $objectManagerFactory; $this->validator = $validator; - $this->objectManager = $objectManager; + $this->objectManager = $objectManagerProvider->get(); parent::__construct(); } diff --git a/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php b/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php deleted file mode 100644 index ac6a43189d7abe247be6ac87b91b60b3967314ed..0000000000000000000000000000000000000000 --- a/setup/src/Magento/Setup/Console/Command/DiCompileMultiTenantCommand.php +++ /dev/null @@ -1,493 +0,0 @@ -<?php -/** - * Copyright © 2016 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Setup\Console\Command; - -use Magento\Framework\Filesystem\DriverInterface; -use Magento\Setup\Model\ObjectManagerProvider; -use Magento\Framework\App\ObjectManager; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Input\InputOption; -use Magento\Framework\Api\Code\Generator\Mapper; -use Magento\Framework\Api\Code\Generator\SearchResults; -use Magento\Framework\Autoload\AutoloaderRegistry; -use Magento\Framework\Component\ComponentRegistrar; -use Magento\Framework\Interception\Code\Generator\Interceptor; -use Magento\Framework\ObjectManager\Code\Generator\Converter; -use Magento\Framework\ObjectManager\Code\Generator\Factory; -use Magento\Framework\ObjectManager\Code\Generator\Proxy; -use Magento\Framework\ObjectManager\Code\Generator\Repository; -use Magento\Framework\ObjectManager\Code\Generator\Persistor; -use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator; -use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator; -use Magento\Setup\Module\Di\Code\Scanner; -use Magento\Setup\Module\Di\Compiler\Log\Log; -use Magento\Setup\Module\Di\Compiler\Log\Writer; -use Magento\Setup\Module\Di\Definition\Compressor; -use Magento\Setup\Module\Di\Definition\Serializer\Igbinary; -use Magento\Setup\Module\Di\Definition\Serializer\Standard; -use \Magento\Framework\App\Filesystem\DirectoryList; -use Magento\Framework\Code\Generator as CodeGenerator; - -/** - * Command to generate all non-existing proxies and factories, and pre-compile class definitions, - * inheritance information and plugin definitions - * - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ -class DiCompileMultiTenantCommand extends AbstractSetupCommand -{ - /**#@+ - * Names of input options - */ - const INPUT_KEY_SERIALIZER = 'serializer'; - const INPUT_KEY_EXTRA_CLASSES_FILE = 'extra-classes-file'; - const INPUT_KEY_GENERATION = 'generation'; - const INPUT_KEY_DI= 'di'; - const INPUT_KEY_EXCLUDE_PATTERN= 'exclude-pattern'; - /**#@- */ - - /**#@+ - * Possible values for serializer - */ - const SERIALIZER_VALUE_SERIALIZE = 'serialize'; - const SERIALIZER_VALUE_IGBINARY = 'igbinary'; - /**#@- */ - - /** Command name */ - const NAME = 'setup:di:compile-multi-tenant'; - - /** - * Object Manager - * - * @var ObjectManager - */ - private $objectManager; - - /** - * Filesystem Directory List - * - * @var DirectoryList - */ - private $directoryList; - - /** - * - * @var array - */ - private $entities; - - /** - * - * @var array - */ - private $files = []; - - /** - * - * @var CodeGenerator - */ - private $generator; - - /** - * - * @var Log - */ - private $log; - - /** - * @var ComponentRegistrar - */ - private $componentRegistrar; - - /** - * Constructor - * - * @param ObjectManagerProvider $objectManagerProvider - * @param DirectoryList $directoryList - * @param ComponentRegistrar $componentRegistrar - */ - public function __construct( - ObjectManagerProvider $objectManagerProvider, - DirectoryList $directoryList, - ComponentRegistrar $componentRegistrar - ) { - $this->objectManager = $objectManagerProvider->get(); - $this->directoryList = $directoryList; - $this->componentRegistrar = $componentRegistrar; - parent::__construct(); - } - - /** - * {@inheritdoc} - */ - protected function configure() - { - $options = [ - new InputOption( - self::INPUT_KEY_SERIALIZER, - null, - InputOption::VALUE_REQUIRED, - 'Serializer function that should be used (' . self::SERIALIZER_VALUE_SERIALIZE . '|' - . self::SERIALIZER_VALUE_IGBINARY . ') default: ' . self::SERIALIZER_VALUE_SERIALIZE - ), - new InputOption( - self::INPUT_KEY_EXTRA_CLASSES_FILE, - null, - InputOption::VALUE_REQUIRED, - 'Path to file with extra proxies and factories to generate' - ), - new InputOption( - self::INPUT_KEY_GENERATION, - null, - InputOption::VALUE_REQUIRED, - 'Absolute path to generated classes, <magento_root>/var/generation by default' - ), - new InputOption( - self::INPUT_KEY_DI, - null, - InputOption::VALUE_REQUIRED, - 'Absolute path to DI definitions directory, <magento_root>/var/di by default' - ), - new InputOption( - self::INPUT_KEY_EXCLUDE_PATTERN, - null, - InputOption::VALUE_REQUIRED, - 'Allows to exclude Paths from compilation (default is #[\\\\/]m1[\\\\/]#i)' - ), - ]; - $this->setName(self::NAME) - ->setDescription( - 'Generates all non-existing proxies and factories, and pre-compile class definitions, ' - . 'inheritance information and plugin definitions' - ) - ->setDefinition($options); - parent::configure(); - } - - /** - * Get module directories exclude patterns - * - * @return array - */ - private function getModuleExcludePatterns() - { - $modulesExcludePatterns = []; - foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $modulePath) { - $modulesExcludePatterns[] = "#^" . $modulePath . "/Test#"; - } - return $modulesExcludePatterns; - } - - /** - * Get library directories exclude patterns - * - * @return array - */ - private function getLibraryExcludePatterns() - { - $libraryExcludePatterns = []; - foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::LIBRARY) as $libraryPath) { - $libraryExcludePatterns[] = "#^" . $libraryPath . "/([\\w]+/)?Test#"; - } - return $libraryExcludePatterns; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $errors = $this->validate($input); - if ($errors) { - $output->writeln($errors); - return; - } - - $generationDir = $input->getOption(self::INPUT_KEY_GENERATION) ? $input->getOption(self::INPUT_KEY_GENERATION) - : $this->directoryList->getPath(DirectoryList::GENERATION); - $modulesExcludePatterns = $this->getModuleExcludePatterns(); - $testExcludePatterns = [ - "#^" . $this->directoryList->getPath(DirectoryList::SETUP) . "/[\\w]+/[\\w]+/Test#", - "#^" . $this->directoryList->getRoot() . "/dev/tools/Magento/Tools/[\\w]+/Test#" - ]; - $librariesExcludePatterns = $this->getLibraryExcludePatterns(); - $testExcludePatterns = array_merge($testExcludePatterns, $modulesExcludePatterns, $librariesExcludePatterns); - $fileExcludePatterns = $input->getOption('exclude-pattern') ? - [$input->getOption(self::INPUT_KEY_EXCLUDE_PATTERN)] : ['#[\\\\/]M1[\\\\/]#i']; - $fileExcludePatterns = array_merge($fileExcludePatterns, $testExcludePatterns); - /** @var Writer\Console logWriter Writer model for success messages */ - $logWriter = new Writer\Console($output); - $this->log = new Log($logWriter, $logWriter); - AutoloaderRegistry::getAutoloader()->addPsr4('Magento\\', $generationDir . '/Magento/'); - // 1 Code generation - $this->generateCode($generationDir, $fileExcludePatterns, $input); - // 2. Compilation - $this->compileCode($generationDir, $fileExcludePatterns, $input); - //Reporter - $this->log->report(); - if (!$this->log->hasError()) { - $output->writeln( - '<info>On *nix systems, verify the Magento application has permissions to modify files ' - . 'created by the compiler in the "var" directory. For instance, if you run the Magento application ' - . 'using Apache, the owner of the files in the "var" directory should be the Apache user (example ' - . 'command: "chown -R www-data:www-data <MAGENTO_ROOT>/var" where MAGENTO_ROOT is the Magento ' - . 'root directory).</info>' - ); - } - } - - /** - * Generate Code - * - * @param string $generationDir - * @param array $fileExcludePatterns - * @param InputInterface $input - * @return void - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.NPathComplexity) - */ - public function generateCode($generationDir, $fileExcludePatterns, $input) - { - // 1.1 Code scan - $filePatterns = ['php' => '/.*\.php$/', 'di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/']; - $directoryScanner = new Scanner\DirectoryScanner(); - foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $codeScanDir) { - $this->files = array_merge_recursive( - $this->files, - $directoryScanner->scan($codeScanDir, $filePatterns, $fileExcludePatterns) - ); - } - $this->files['di'][] = $this->directoryList->getPath( - \Magento\Framework\App\Filesystem\DirectoryList::CONFIG - ) . '/di.xml'; - $this->files['additional'] = [$input->getOption(self::INPUT_KEY_EXTRA_CLASSES_FILE)]; - $repositoryScanner = new Scanner\RepositoryScanner(); - $repositories = $repositoryScanner->collectEntities($this->files['di']); - $scanner = new Scanner\CompositeScanner(); - $scanner->addChild(new Scanner\PhpScanner($this->log), 'php'); - $scanner->addChild(new Scanner\XmlScanner($this->log), 'di'); - $scanner->addChild(new Scanner\ArrayScanner(), 'additional'); - $this->entities = $scanner->collectEntities($this->files); - $interceptorScanner = new Scanner\XmlInterceptorScanner(); - $this->entities['interceptors'] = $interceptorScanner->collectEntities($this->files['di']); - // 1.2 Generation of Factory and Additional Classes - $generatorIo = $this->objectManager->create( - \Magento\Framework\Code\Generator\Io::class, - ['generationDirectory' => $generationDir] - ); - $this->generator = $this->objectManager->create( - \Magento\Framework\Code\Generator::class, - ['ioObject' => $generatorIo] - ); - /** Initialize object manager for code generation based on configs */ - $this->generator->setObjectManager($this->objectManager); - $generatorAutoloader = new \Magento\Framework\Code\Generator\Autoloader($this->generator); - spl_autoload_register([$generatorAutoloader, 'load']); - - foreach ($repositories as $entityName) { - switch ($this->generator->generateClass($entityName)) { - case CodeGenerator::GENERATION_SUCCESS: - $this->log->add(Log::GENERATION_SUCCESS, $entityName); - break; - case CodeGenerator::GENERATION_ERROR: - $this->log->add(Log::GENERATION_ERROR, $entityName); - break; - case CodeGenerator::GENERATION_SKIP: - default: - //no log - break; - } - } - foreach (['php', 'additional'] as $type) { - sort($this->entities[$type]); - foreach ($this->entities[$type] as $entityName) { - switch ($this->generator->generateClass($entityName)) { - case CodeGenerator::GENERATION_SUCCESS: - $this->log->add(Log::GENERATION_SUCCESS, $entityName); - break; - case CodeGenerator::GENERATION_ERROR: - $this->log->add(Log::GENERATION_ERROR, $entityName); - break; - case CodeGenerator::GENERATION_SKIP: - default: - //no log - break; - } - } - } - } - - /** - * Compile Code - * - * @param string $generationDir - * @param array $fileExcludePatterns - * @param InputInterface $input - * @return void - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.NPathComplexity) - */ - private function compileCode($generationDir, $fileExcludePatterns, $input) - { - $diDir = $input->getOption(self::INPUT_KEY_DI) ? $input->getOption(self::INPUT_KEY_DI) : - $this->directoryList->getPath(DirectoryList::DI); - $relationsFile = $diDir . '/relations.ser'; - $pluginDefFile = $diDir . '/plugins.ser'; - $compilationDirs = [ - $this->directoryList->getPath(DirectoryList::SETUP) . '/Magento/Setup/Module', - $this->directoryList->getRoot() . '/dev/tools/Magento/Tools', - ]; - $compilationDirs = array_merge( - $compilationDirs, - $this->componentRegistrar->getPaths(ComponentRegistrar::MODULE), - $this->componentRegistrar->getPaths(ComponentRegistrar::LIBRARY) - ); - $serializer = $input->getOption(self::INPUT_KEY_SERIALIZER) == Igbinary::NAME ? new Igbinary() : new Standard(); - // 2.1 Code scan - $validator = new \Magento\Framework\Code\Validator(); - $validator->add(new \Magento\Framework\Code\Validator\ConstructorIntegrity()); - $validator->add(new \Magento\Framework\Code\Validator\ContextAggregation()); - $classesScanner = new \Magento\Setup\Module\Di\Code\Reader\ClassesScanner(); - $classesScanner->addExcludePatterns($fileExcludePatterns); - $directoryInstancesNamesList = new \Magento\Setup\Module\Di\Code\Reader\Decorator\Directory( - $this->log, - new \Magento\Framework\Code\Reader\ClassReader(), - $classesScanner, - $validator, - $generationDir - ); - foreach ($compilationDirs as $path) { - if (is_readable($path)) { - $directoryInstancesNamesList->getList($path); - } - } - $inheritanceScanner = new Scanner\InheritanceInterceptorScanner( - new \Magento\Framework\ObjectManager\InterceptableValidator() - ); - $this->entities['interceptors'] = $inheritanceScanner->collectEntities( - get_declared_classes(), - $this->entities['interceptors'] - ); - // 2.1.1 Generation of Proxy and Interceptor Classes - foreach (['interceptors', 'di'] as $type) { - foreach ($this->entities[$type] as $entityName) { - switch ($this->generator->generateClass($entityName)) { - case CodeGenerator::GENERATION_SUCCESS: - $this->log->add(Log::GENERATION_SUCCESS, $entityName); - break; - case CodeGenerator::GENERATION_ERROR: - $this->log->add(Log::GENERATION_ERROR, $entityName); - break; - case CodeGenerator::GENERATION_SKIP: - default: - //no log - break; - } - } - } - //2.1.2 Compile relations for Proxy/Interceptor classes - $directoryInstancesNamesList->getList($generationDir); - $relations = $directoryInstancesNamesList->getRelations(); - // 2.2 Compression - $relationsFileDir = dirname($relationsFile); - if (!file_exists($relationsFileDir)) { - mkdir($relationsFileDir, 0777, true); - } - $relations = array_filter($relations); - file_put_contents($relationsFile, $serializer->serialize($relations)); - // 3. Plugin Definition Compilation - $pluginScanner = new Scanner\CompositeScanner(); - $pluginScanner->addChild(new Scanner\PluginScanner(), 'di'); - $pluginDefinitions = []; - $pluginList = $pluginScanner->collectEntities($this->files); - $pluginDefinitionList = new \Magento\Framework\Interception\Definition\Runtime(); - foreach ($pluginList as $type => $entityList) { - foreach ($entityList as $entity) { - $pluginDefinitions[ltrim($entity, '\\')] = $pluginDefinitionList->getMethodList($entity); - } - } - $outputContent = $serializer->serialize($pluginDefinitions); - $pluginDefFileDir = dirname($pluginDefFile); - if (!file_exists($pluginDefFileDir)) { - mkdir($pluginDefFileDir, 0777, true); - } - file_put_contents($pluginDefFile, $outputContent); - } - - /** - * Check if all option values provided by the user are valid - * - * @param InputInterface $input - * @return string[] - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - private function validate(InputInterface $input) - { - $errors = []; - $options = $input->getOptions(); - foreach ($options as $key => $value) { - if (!$value) { - continue; - } - switch ($key) { - case self::INPUT_KEY_SERIALIZER: - if (($value !== self::SERIALIZER_VALUE_SERIALIZE) && ($value !== self::SERIALIZER_VALUE_IGBINARY)) { - $errors[] = '<error>Invalid value for command option \'' . self::INPUT_KEY_SERIALIZER - . '\'. Possible values (' . self::SERIALIZER_VALUE_SERIALIZE . '|' - . self::SERIALIZER_VALUE_IGBINARY . ').</error>'; - } - break; - case self::INPUT_KEY_EXTRA_CLASSES_FILE: - if (!file_exists($value)) { - $errors[] = '<error>Path does not exist for the value of command option \'' - . self::INPUT_KEY_EXTRA_CLASSES_FILE . '\'.</error>'; - } - break; - case self::INPUT_KEY_GENERATION: - $errorMsg = $this->validateOutputPath($value, self::INPUT_KEY_GENERATION); - if ($errorMsg !== '') { - $errors[] = $errorMsg; - } - break; - case self::INPUT_KEY_DI: - $errorMsg = $this->validateOutputPath($value, self::INPUT_KEY_DI); - if ($errorMsg !== '') { - $errors[] = $errorMsg; - } - break; - case self::INPUT_KEY_EXCLUDE_PATTERN: - if (@preg_match($value, null) === false) { - $errors[] = '<error>Invalid pattern for command option \'' . self::INPUT_KEY_EXCLUDE_PATTERN - . '\'.</error>'; - } - break; - } - } - return $errors; - } - - /** - * Validate output path based on type - * - * @param string $value - * @param string $type - * @return string - */ - private function validateOutputPath($value, $type) - { - $errorMsg = ''; - if (!file_exists($value)) { - $errorMsg = '<error>Path does not exist for the value of command option \'' . $type . '\'.</error>'; - } - if (file_exists($value) && !is_writeable($value)) { - $errorMsg .= '<error>Non-writable directory is provided by the value of command option \'' - . $type . '\'.</error>'; - - } - return $errorMsg; - } -} diff --git a/setup/src/Magento/Setup/Console/CommandList.php b/setup/src/Magento/Setup/Console/CommandList.php index 4bb5ac0181a794b575b420499908d1cb3871b383..e025de44602503c004bcdcd009111a31a6624a7e 100644 --- a/setup/src/Magento/Setup/Console/CommandList.php +++ b/setup/src/Magento/Setup/Console/CommandList.php @@ -72,6 +72,7 @@ class CommandList \Magento\Setup\Console\Command\RollbackCommand::class, \Magento\Setup\Console\Command\UpgradeCommand::class, \Magento\Setup\Console\Command\UninstallCommand::class, + \Magento\Setup\Console\Command\DeployStaticContentCommand::class ]; } diff --git a/setup/src/Magento/Setup/Model/ConfigGenerator.php b/setup/src/Magento/Setup/Model/ConfigGenerator.php index 140f5a739889c829efe34689c044310a4d7d62a3..ce86ce4dd471f01876fbc3ba87d6697b5156eea7 100644 --- a/setup/src/Magento/Setup/Model/ConfigGenerator.php +++ b/setup/src/Magento/Setup/Model/ConfigGenerator.php @@ -116,19 +116,12 @@ class ConfigGenerator * * @param array $data * @return ConfigData + * @deprecated + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function createDefinitionsConfig(array $data) { - $configData = new ConfigData(ConfigFilePool::APP_ENV); - - if (!empty($data[ConfigOptionsListConstants::INPUT_KEY_DEFINITION_FORMAT])) { - $configData->set( - ObjectManagerFactory::CONFIG_PATH_DEFINITION_FORMAT, - $data[ConfigOptionsListConstants::INPUT_KEY_DEFINITION_FORMAT] - ); - } - - return $configData; + return null; } /** diff --git a/setup/src/Magento/Setup/Model/ConfigOptionsList.php b/setup/src/Magento/Setup/Model/ConfigOptionsList.php index 4e8374aabb4e6b647aca8c34ca67041ca3532c54..0c1419a73cb8ebdb805dde29cc3412203dab7b07 100644 --- a/setup/src/Magento/Setup/Model/ConfigOptionsList.php +++ b/setup/src/Magento/Setup/Model/ConfigOptionsList.php @@ -72,13 +72,6 @@ class ConfigOptionsList implements ConfigOptionsListInterface 'Session save handler', ConfigOptionsListConstants::SESSION_SAVE_FILES ), - new SelectConfigOption( - ConfigOptionsListConstants::INPUT_KEY_DEFINITION_FORMAT, - SelectConfigOption::FRONTEND_WIZARD_SELECT, - DefinitionFactory::getSupportedFormats(), - ObjectManagerFactory::CONFIG_PATH_DEFINITION_FORMAT, - 'Type of definitions used by Object Manager' - ), new TextConfigOption( ConfigOptionsListConstants::INPUT_KEY_DB_HOST, TextConfigOption::FRONTEND_WIZARD_TEXT, diff --git a/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php b/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php index 703cbced8e33a637b5548eae93539d4e1f7b4ab8..851bfa8c36313852a8d7c876f4abe195a7b2ffdf 100644 --- a/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php +++ b/setup/src/Magento/Setup/Module/Di/Code/Generator/PluginList.php @@ -1,14 +1,15 @@ <?php /** - * * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Setup\Module\Di\Code\Generator; use Magento\Framework\Interception; +/** + * Provides plugin list configuration + */ class PluginList extends Interception\PluginList\PluginList { /** diff --git a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php index daf8425802ac535dd6255085d55c9637b62c5656..342b26a22e32ba941429d0e1dc9299af08472f49 100644 --- a/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php +++ b/setup/src/Magento/Setup/Module/Di/Compiler/Config/Writer/Filesystem.php @@ -8,8 +8,9 @@ namespace Magento\Setup\Module\Di\Compiler\Config\Writer; use Magento\Framework\App\Filesystem\DirectoryList; -use Magento\Framework\Filesystem\DriverInterface; use Magento\Setup\Module\Di\Compiler\Config\WriterInterface; +use Magento\Framework\Serialize\SerializerInterface; +use Magento\Framework\Serialize\Serializer\Serialize; class Filesystem implements WriterInterface { @@ -18,6 +19,11 @@ class Filesystem implements WriterInterface */ private $directoryList; + /** + * @var SerializerInterface + */ + private $serializer; + /** * Constructor * @@ -39,8 +45,10 @@ class Filesystem implements WriterInterface { $this->initialize(); - $serialized = serialize($config); - file_put_contents($this->directoryList->getPath(DirectoryList::DI) . '/' . $key . '.ser', $serialized); + file_put_contents( + $this->directoryList->getPath(DirectoryList::DI) . '/' . $key . '.ser', + $this->getSerializer()->serialize($config) + ); } /** @@ -54,4 +62,19 @@ class Filesystem implements WriterInterface mkdir($this->directoryList->getPath(DirectoryList::DI)); } } + + /** + * Get serializer + * + * @return SerializerInterface + * @deprecated + */ + private function getSerializer() + { + if (null === $this->serializer) { + $this->serializer = \Magento\Framework\App\ObjectManager::getInstance() + ->get(Serialize::class); + } + return $this->serializer; + } } diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/DeployStaticContentCommandTest.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php similarity index 98% rename from app/code/Magento/Deploy/Test/Unit/Console/Command/DeployStaticContentCommandTest.php rename to setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php index c8fa2138e7c81fb69d562fb5ec55e049cb5deabc..82777bb6b7aee697ba5a77df1a9dfcc95d93dedc 100644 --- a/app/code/Magento/Deploy/Test/Unit/Console/Command/DeployStaticContentCommandTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Console/Command/DeployStaticContentCommandTest.php @@ -3,9 +3,9 @@ * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Deploy\Test\Unit\Console\Command; +namespace Magento\Setup\Test\Unit\Console\Command; -use Magento\Deploy\Console\Command\DeployStaticContentCommand; +use Magento\Setup\Console\Command\DeployStaticContentCommand; use Symfony\Component\Console\Tester\CommandTester; use Magento\Framework\Validator\Locale; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/FunctionExistMock.php b/setup/src/Magento/Setup/Test/Unit/Console/Command/FunctionExistMock.php similarity index 100% rename from app/code/Magento/Deploy/Test/Unit/Console/Command/FunctionExistMock.php rename to setup/src/Magento/Setup/Test/Unit/Console/Command/FunctionExistMock.php diff --git a/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php b/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php index 1e37d351d8f039014ae35a9fdfbe3aaa725375fe..eaab4d28d7620ebdc31c97b9a938afdb59957f55 100644 --- a/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsListTest.php @@ -48,32 +48,30 @@ class ConfigOptionsListTest extends \PHPUnit_Framework_TestCase $this->assertSame('Encryption key', $options[0]->getDescription()); $this->assertInstanceOf(\Magento\Framework\Setup\Option\SelectConfigOption::class, $options[1]); $this->assertSame('Session save handler', $options[1]->getDescription()); - $this->assertInstanceOf(\Magento\Framework\Setup\Option\SelectConfigOption::class, $options[2]); - $this->assertSame('Type of definitions used by Object Manager', $options[2]->getDescription()); + $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[2]); + $this->assertSame('Database server host', $options[2]->getDescription()); $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[3]); - $this->assertSame('Database server host', $options[3]->getDescription()); + $this->assertSame('Database name', $options[3]->getDescription()); $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[4]); - $this->assertSame('Database name', $options[4]->getDescription()); + $this->assertSame('Database server username', $options[4]->getDescription()); $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[5]); - $this->assertSame('Database server username', $options[5]->getDescription()); + $this->assertSame('Database server engine', $options[5]->getDescription()); $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[6]); - $this->assertSame('Database server engine', $options[6]->getDescription()); + $this->assertSame('Database server password', $options[6]->getDescription()); $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[7]); - $this->assertSame('Database server password', $options[7]->getDescription()); + $this->assertSame('Database table prefix', $options[7]->getDescription()); $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[8]); - $this->assertSame('Database table prefix', $options[8]->getDescription()); + $this->assertSame('Database type', $options[8]->getDescription()); $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[9]); - $this->assertSame('Database type', $options[9]->getDescription()); - $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[10]); - $this->assertSame('Database initial set of commands', $options[10]->getDescription()); - $this->assertInstanceOf(\Magento\Framework\Setup\Option\FlagConfigOption::class, $options[11]); + $this->assertSame('Database initial set of commands', $options[9]->getDescription()); + $this->assertInstanceOf(\Magento\Framework\Setup\Option\FlagConfigOption::class, $options[10]); $this->assertSame( 'If specified, then db connection validation will be skipped', - $options[11]->getDescription() + $options[10]->getDescription() ); - $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[12]); - $this->assertSame('http Cache hosts', $options[12]->getDescription()); - $this->assertEquals(13, count($options)); + $this->assertInstanceOf(\Magento\Framework\Setup\Option\TextConfigOption::class, $options[11]); + $this->assertSame('http Cache hosts', $options[11]->getDescription()); + $this->assertEquals(12, count($options)); } public function testCreateOptions() diff --git a/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php b/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php index caca5509d1e14ee4500803d05275d543692393f1..238bf7ea3db9f2f48be1414aaa2f7ad9783ce78c 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/ConfigGeneratorTest.php @@ -66,14 +66,6 @@ class ConfigGeneratorTest extends \PHPUnit_Framework_TestCase $this->assertEquals([], $returnValue->getData()); } - public function testCreateDefinitionsConfig() - { - $testData = [ConfigOptionsListConstants::INPUT_KEY_DEFINITION_FORMAT => 'test-format']; - $returnValue = $this->configGeneratorObject->createDefinitionsConfig($testData); - $this->assertEquals(ConfigFilePool::APP_ENV, $returnValue->getFileKey()); - $this->assertEquals(['definition' => ['format' => 'test-format']], $returnValue->getData()); - } - public function testCreateDbConfig() { $testData = [