PageRenderTime 39ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/magento/framework/TestFramework/Unit/Helper/ObjectManager.php

https://gitlab.com/yousafsyed/easternglamor
PHP | 316 lines | 199 code | 26 blank | 91 comment | 20 complexity | 770d92b5d98ff4b85f9dfed47082fe40 MD5 | raw file
  1. <?php
  2. /**
  3. * Copyright © 2016 Magento. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. /**
  7. * Helper class for basic object retrieving, such as blocks, models etc...
  8. */
  9. namespace Magento\Framework\TestFramework\Unit\Helper;
  10. class ObjectManager
  11. {
  12. /**
  13. * Special cases configuration
  14. *
  15. * @var array
  16. */
  17. protected $_specialCases = [
  18. 'Magento\Framework\Model\ResourceModel\AbstractResource' => '_getResourceModelMock',
  19. 'Magento\Framework\TranslateInterface' => '_getTranslatorMock',
  20. ];
  21. /**
  22. * Test object
  23. *
  24. * @var \PHPUnit_Framework_TestCase
  25. */
  26. protected $_testObject;
  27. /**
  28. * Class constructor
  29. *
  30. * @param \PHPUnit_Framework_TestCase $testObject
  31. */
  32. public function __construct(\PHPUnit_Framework_TestCase $testObject)
  33. {
  34. $this->_testObject = $testObject;
  35. }
  36. /**
  37. * Get mock for argument
  38. *
  39. * @param string $argClassName
  40. * @param array $originalArguments
  41. * @return null|object|\PHPUnit_Framework_MockObject_MockObject
  42. */
  43. protected function _createArgumentMock($argClassName, array $originalArguments)
  44. {
  45. $object = null;
  46. if ($argClassName) {
  47. $object = $this->_processSpecialCases($argClassName, $originalArguments);
  48. if (null === $object) {
  49. $object = $this->_getMockWithoutConstructorCall($argClassName);
  50. }
  51. }
  52. return $object;
  53. }
  54. /**
  55. * Process special cases
  56. *
  57. * @param string $className
  58. * @param array $arguments
  59. * @return null|object
  60. */
  61. protected function _processSpecialCases($className, $arguments)
  62. {
  63. $object = null;
  64. $interfaces = class_implements($className);
  65. if (in_array('Magento\Framework\ObjectManager\ContextInterface', $interfaces)) {
  66. $object = $this->getObject($className, $arguments);
  67. } elseif (isset($this->_specialCases[$className])) {
  68. $method = $this->_specialCases[$className];
  69. $object = $this->{$method}($className);
  70. }
  71. return $object;
  72. }
  73. /**
  74. * Retrieve specific mock of core resource model
  75. *
  76. * @return \Magento\Framework\Module\ResourceInterface|\PHPUnit_Framework_MockObject_MockObject
  77. */
  78. protected function _getResourceModelMock()
  79. {
  80. $resourceMock = $this->_testObject->getMock(
  81. 'Magento\Framework\Module\ModuleResource',
  82. ['getIdFieldName', '__sleep', '__wakeup'],
  83. [],
  84. '',
  85. false
  86. );
  87. $resourceMock->expects(
  88. $this->_testObject->any()
  89. )->method(
  90. 'getIdFieldName'
  91. )->will(
  92. $this->_testObject->returnValue('id')
  93. );
  94. return $resourceMock;
  95. }
  96. /**
  97. * Retrieve mock of core translator model
  98. *
  99. * @param string $className
  100. * @return \Magento\Framework\TranslateInterface|\PHPUnit_Framework_MockObject_MockObject
  101. */
  102. protected function _getTranslatorMock($className)
  103. {
  104. $translator = $this->_testObject->getMockBuilder($className)->disableOriginalConstructor()->getMock();
  105. $translateCallback = function ($arguments) {
  106. return is_array($arguments) ? vsprintf(array_shift($arguments), $arguments) : '';
  107. };
  108. $translator->expects(
  109. $this->_testObject->any()
  110. )->method(
  111. 'translate'
  112. )->will(
  113. $this->_testObject->returnCallback($translateCallback)
  114. );
  115. return $translator;
  116. }
  117. /**
  118. * Get mock without call of original constructor
  119. *
  120. * @param string $className
  121. * @return \PHPUnit_Framework_MockObject_MockObject
  122. */
  123. protected function _getMockWithoutConstructorCall($className)
  124. {
  125. $class = new \ReflectionClass($className);
  126. $mock = null;
  127. if ($class->isAbstract()) {
  128. $mock = $this->_testObject->getMockForAbstractClass($className, [], '', false, false);
  129. } else {
  130. $mock = $this->_testObject->getMock($className, [], [], '', false, false);
  131. }
  132. return $mock;
  133. }
  134. /**
  135. * Get class instance
  136. *
  137. * @param string $className
  138. * @param array $arguments
  139. * @return object
  140. */
  141. public function getObject($className, array $arguments = [])
  142. {
  143. if (is_subclass_of($className, '\Magento\Framework\Api\AbstractSimpleObjectBuilder')
  144. || is_subclass_of($className, '\Magento\Framework\Api\Builder')
  145. ) {
  146. return $this->getBuilder($className, $arguments);
  147. }
  148. $constructArguments = $this->getConstructArguments($className, $arguments);
  149. $reflectionClass = new \ReflectionClass($className);
  150. return $reflectionClass->newInstanceArgs($constructArguments);
  151. }
  152. /**
  153. * Get data object builder
  154. *
  155. * @param string $className
  156. * @param array $arguments
  157. * @return object
  158. */
  159. protected function getBuilder($className, array $arguments)
  160. {
  161. $objectFactory = $this->_testObject->getMock('Magento\Framework\Api\ObjectFactory', [], [], '', false);
  162. if (!isset($arguments['objectFactory'])) {
  163. $arguments['objectFactory'] = $objectFactory;
  164. }
  165. $constructArguments = $this->getConstructArguments($className, $arguments);
  166. $reflectionClass = new \ReflectionClass($className);
  167. $builderObject = $reflectionClass->newInstanceArgs($constructArguments);
  168. $objectFactory->expects($this->_testObject->any())
  169. ->method('populateWithArray')
  170. ->will($this->_testObject->returnSelf());
  171. $objectFactory->expects($this->_testObject->any())
  172. ->method('populate')
  173. ->will($this->_testObject->returnSelf());
  174. $objectFactory->expects($this->_testObject->any())
  175. ->method('create')
  176. ->will($this->_testObject->returnCallback(
  177. function ($className, $arguments) {
  178. $reflectionClass = new \ReflectionClass($className);
  179. $constructorMethod = $reflectionClass->getConstructor();
  180. $parameters = $constructorMethod->getParameters();
  181. $args = [];
  182. foreach ($parameters as $parameter) {
  183. $parameterName = $parameter->getName();
  184. if (isset($arguments[$parameterName])) {
  185. $args[] = $arguments[$parameterName];
  186. } else {
  187. if ($parameter->isArray()) {
  188. $args[] = [];
  189. } elseif ($parameter->allowsNull()) {
  190. $args[] = null;
  191. } else {
  192. $mock = $this->_getMockWithoutConstructorCall($parameter->getClass()->getName());
  193. $args[] = $mock;
  194. }
  195. }
  196. }
  197. return $reflectionClass->newInstanceArgs($args);
  198. }
  199. ));
  200. return $builderObject;
  201. }
  202. /**
  203. * Retrieve list of arguments that used for new object instance creation
  204. *
  205. * @param string $className
  206. * @param array $arguments
  207. * @return array
  208. */
  209. public function getConstructArguments($className, array $arguments = [])
  210. {
  211. $constructArguments = [];
  212. if (!method_exists($className, '__construct')) {
  213. return $constructArguments;
  214. }
  215. $method = new \ReflectionMethod($className, '__construct');
  216. foreach ($method->getParameters() as $parameter) {
  217. $parameterName = $parameter->getName();
  218. $argClassName = null;
  219. $defaultValue = null;
  220. if (array_key_exists($parameterName, $arguments)) {
  221. $constructArguments[$parameterName] = $arguments[$parameterName];
  222. continue;
  223. }
  224. if ($parameter->isDefaultValueAvailable()) {
  225. $defaultValue = $parameter->getDefaultValue();
  226. }
  227. try {
  228. if ($parameter->getClass()) {
  229. $argClassName = $parameter->getClass()->getName();
  230. }
  231. $object = $this->_getMockObject($argClassName, $arguments);
  232. } catch (\ReflectionException $e) {
  233. $parameterString = $parameter->__toString();
  234. $firstPosition = strpos($parameterString, '<required>');
  235. if ($firstPosition !== false) {
  236. $parameterString = substr($parameterString, $firstPosition + 11);
  237. $parameterString = substr($parameterString, 0, strpos($parameterString, ' '));
  238. $object = $this->_testObject->getMock($parameterString, [], [], '', false);
  239. }
  240. }
  241. $constructArguments[$parameterName] = null === $object ? $defaultValue : $object;
  242. }
  243. return $constructArguments;
  244. }
  245. /**
  246. * Get collection mock
  247. *
  248. * @param string $className
  249. * @param array $data
  250. * @return \PHPUnit_Framework_MockObject_MockObject
  251. * @throws \InvalidArgumentException
  252. */
  253. public function getCollectionMock($className, array $data)
  254. {
  255. if (!is_subclass_of($className, '\Magento\Framework\Data\Collection')) {
  256. throw new \InvalidArgumentException(
  257. $className . ' does not instance of \Magento\Framework\Data\Collection'
  258. );
  259. }
  260. $mock = $this->_testObject->getMock($className, [], [], '', false, false);
  261. $iterator = new \ArrayIterator($data);
  262. $mock->expects(
  263. $this->_testObject->any()
  264. )->method(
  265. 'getIterator'
  266. )->will(
  267. $this->_testObject->returnValue($iterator)
  268. );
  269. return $mock;
  270. }
  271. /**
  272. * Helper function that creates a mock object for a given class name.
  273. *
  274. * Will return a real object in some cases to assist in testing.
  275. *
  276. * @param string $argClassName
  277. * @param array $arguments
  278. * @return null|object|\PHPUnit_Framework_MockObject_MockObject
  279. */
  280. private function _getMockObject($argClassName, array $arguments)
  281. {
  282. if (is_subclass_of($argClassName, '\Magento\Framework\Api\ExtensibleObjectBuilder')) {
  283. $object = $this->getBuilder($argClassName, $arguments);
  284. return $object;
  285. } else {
  286. $object = $this->_createArgumentMock($argClassName, $arguments);
  287. return $object;
  288. }
  289. }
  290. }