AbstractMapperTest.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\DB\Test\Unit;
  7. use Magento\Framework\DB\Select;
  8. /**
  9. * Class AbstractMapperTest
  10. */
  11. class AbstractMapperTest extends \PHPUnit\Framework\TestCase
  12. {
  13. /**
  14. * @var \Magento\Framework\Model\ResourceModel\Db\AbstractDb|\PHPUnit_Framework_MockObject_MockObject
  15. */
  16. protected $resourceMock;
  17. /**
  18. * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject
  19. */
  20. protected $connectionMock;
  21. /**
  22. * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject
  23. */
  24. protected $selectMock;
  25. /**
  26. * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject
  27. */
  28. protected $loggerMock;
  29. /**
  30. * @var \Magento\Framework\Data\Collection\Db\FetchStrategyInterface|\PHPUnit_Framework_MockObject_MockObject
  31. */
  32. protected $fetchStrategyMock;
  33. /**
  34. * @var \Magento\Framework\Data\ObjectFactory|\PHPUnit_Framework_MockObject_MockObject
  35. */
  36. protected $objectFactoryMock;
  37. /**
  38. * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject
  39. */
  40. protected $mapperFactoryMock;
  41. /**
  42. * @var \Magento\Framework\DB\AbstractMapper|\PHPUnit_Framework_MockObject_MockObject
  43. */
  44. protected $mapper;
  45. /**
  46. * Set up
  47. *
  48. * @return void
  49. */
  50. protected function setUp()
  51. {
  52. $this->resourceMock = $this->getMockForAbstractClass(
  53. \Magento\Framework\Model\ResourceModel\Db\AbstractDb::class,
  54. [],
  55. '',
  56. false,
  57. true,
  58. true,
  59. []
  60. );
  61. $this->connectionMock = $this->getMockForAbstractClass(
  62. \Magento\Framework\DB\Adapter\AdapterInterface::class,
  63. [],
  64. '',
  65. false,
  66. true,
  67. true,
  68. []
  69. );
  70. $this->selectMock = $this->createMock(\Magento\Framework\DB\Select::class);
  71. $this->loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
  72. $this->fetchStrategyMock = $this->getMockForAbstractClass(
  73. \Magento\Framework\Data\Collection\Db\FetchStrategyInterface::class,
  74. [],
  75. '',
  76. false,
  77. true,
  78. true,
  79. []
  80. );
  81. $this->objectFactoryMock = $this->createMock(\Magento\Framework\Data\ObjectFactory::class);
  82. $this->mapperFactoryMock = $this->createMock(\Magento\Framework\DB\MapperFactory::class);
  83. }
  84. /**
  85. * Run test map method
  86. *
  87. * @param array $mapperMethods
  88. * @param array $criteriaParts
  89. * @return void
  90. *
  91. * @dataProvider dataProviderMap
  92. */
  93. public function testMap(array $mapperMethods, array $criteriaParts)
  94. {
  95. /** @var \Magento\Framework\DB\AbstractMapper|\PHPUnit_Framework_MockObject_MockObject $mapper */
  96. $mapper = $this->getMockForAbstractClass(
  97. \Magento\Framework\DB\AbstractMapper::class,
  98. [
  99. 'logger' => $this->loggerMock,
  100. 'fetchStrategy' => $this->fetchStrategyMock,
  101. 'objectFactory' => $this->objectFactoryMock,
  102. 'mapperFactory' => $this->mapperFactoryMock,
  103. 'select' => $this->selectMock
  104. ],
  105. '',
  106. true,
  107. true,
  108. true,
  109. $mapperMethods
  110. );
  111. $criteriaMock = $this->getMockForAbstractClass(
  112. \Magento\Framework\Api\CriteriaInterface::class,
  113. [],
  114. '',
  115. false,
  116. true,
  117. true,
  118. ['toArray']
  119. );
  120. $criteriaMock->expects($this->once())
  121. ->method('toArray')
  122. ->will($this->returnValue($criteriaParts));
  123. foreach ($mapperMethods as $value => $method) {
  124. $mapper->expects($this->once())
  125. ->method($method)
  126. ->with($value);
  127. }
  128. $this->assertEquals($this->selectMock, $mapper->map($criteriaMock));
  129. }
  130. public function testMapException()
  131. {
  132. $mapperMethods = [
  133. 'my-test-value1' => 'mapMyMapperMethodOne'
  134. ];
  135. $criteriaParts = [
  136. 'my_mapper_method_one' => 'my-test-value1'
  137. ];
  138. /** @var \Magento\Framework\DB\AbstractMapper|\PHPUnit_Framework_MockObject_MockObject $mapper */
  139. $mapper = $this->getMockForAbstractClass(
  140. \Magento\Framework\DB\AbstractMapper::class,
  141. [
  142. 'logger' => $this->loggerMock,
  143. 'fetchStrategy' => $this->fetchStrategyMock,
  144. 'objectFactory' => $this->objectFactoryMock,
  145. 'mapperFactory' => $this->mapperFactoryMock,
  146. 'select' => $this->selectMock
  147. ],
  148. '',
  149. true,
  150. true,
  151. true,
  152. $mapperMethods
  153. );
  154. $criteriaMock = $this->getMockForAbstractClass(
  155. \Magento\Framework\Api\CriteriaInterface::class,
  156. [],
  157. '',
  158. false,
  159. true,
  160. true,
  161. ['toArray']
  162. );
  163. $criteriaMock->expects($this->once())
  164. ->method('toArray')
  165. ->will($this->returnValue($criteriaParts));
  166. $this->expectException(\InvalidArgumentException::class);
  167. $mapper->map($criteriaMock);
  168. }
  169. /**
  170. * Run test addExpressionFieldToSelect method
  171. *
  172. * @return void
  173. */
  174. public function testAddExpressionFieldToSelect()
  175. {
  176. $fields = [
  177. 'key-attribute' => 'value-attribute',
  178. ];
  179. /** @var \Magento\Framework\DB\AbstractMapper|\PHPUnit_Framework_MockObject_MockObject $mapper */
  180. $mapper = $this->getMockForAbstractClass(
  181. \Magento\Framework\DB\AbstractMapper::class,
  182. [
  183. 'logger' => $this->loggerMock,
  184. 'fetchStrategy' => $this->fetchStrategyMock,
  185. 'objectFactory' => $this->objectFactoryMock,
  186. 'mapperFactory' => $this->mapperFactoryMock,
  187. 'select' => $this->selectMock
  188. ],
  189. '',
  190. true,
  191. true,
  192. true,
  193. []
  194. );
  195. $this->selectMock->expects($this->once())
  196. ->method('columns')
  197. ->with(['my-alias' => "('sub_total', 'SUM(value-attribute)', 'revenue')"]);
  198. $mapper->addExpressionFieldToSelect('my-alias', "('sub_total', 'SUM({{key-attribute}})', 'revenue')", $fields);
  199. }
  200. /**
  201. * Run test addExpressionFieldToSelect method
  202. *
  203. * @param mixed $field
  204. * @param mixed $condition
  205. * @return void
  206. *
  207. * @dataProvider dataProviderAddFieldToFilter
  208. */
  209. public function testAddFieldToFilter($field, $condition)
  210. {
  211. $resultCondition = 'sql-condition-value';
  212. /** @var \Magento\Framework\DB\AbstractMapper|\PHPUnit_Framework_MockObject_MockObject $mapper */
  213. $mapper = $this->getMockForAbstractClass(
  214. \Magento\Framework\DB\AbstractMapper::class,
  215. [
  216. 'logger' => $this->loggerMock,
  217. 'fetchStrategy' => $this->fetchStrategyMock,
  218. 'objectFactory' => $this->objectFactoryMock,
  219. 'mapperFactory' => $this->mapperFactoryMock,
  220. 'select' => $this->selectMock
  221. ],
  222. '',
  223. true,
  224. true,
  225. true,
  226. ['getConnection']
  227. );
  228. $connectionMock = $this->getMockForAbstractClass(
  229. \Magento\Framework\DB\Adapter\AdapterInterface::class,
  230. [],
  231. '',
  232. true,
  233. true,
  234. true,
  235. ['quoteIdentifier', 'prepareSqlCondition']
  236. );
  237. $mapper->expects($this->any())
  238. ->method('getConnection')
  239. ->will($this->returnValue($connectionMock));
  240. $connectionMock->expects($this->any())
  241. ->method('quoteIdentifier')
  242. ->with('my-field')
  243. ->will($this->returnValue('quote-field'));
  244. $connectionMock->expects($this->any())
  245. ->method('prepareSqlCondition')
  246. ->with('quote-field', $condition)
  247. ->will($this->returnValue($resultCondition));
  248. if (is_array($field)) {
  249. $resultCondition = '(' . implode(
  250. ') ' . \Magento\Framework\DB\Select::SQL_OR . ' (',
  251. array_fill(0, count($field), $resultCondition)
  252. ) . ')';
  253. }
  254. $this->selectMock->expects($this->once())
  255. ->method('where')
  256. ->with($resultCondition, null, Select::TYPE_CONDITION);
  257. $mapper->addFieldToFilter($field, $condition);
  258. }
  259. /**
  260. * Data provider for map method
  261. *
  262. * @return array
  263. */
  264. public function dataProviderMap()
  265. {
  266. return [
  267. [
  268. 'mapperMethods' => [
  269. 'my-test-value1' => 'mapMyMapperMethodOne',
  270. 'my-test-value2' => 'mapMyMapperMethodTwo',
  271. ],
  272. 'criteriaParts' => [
  273. 'my_mapper_method_one' => ['my-test-value1'],
  274. 'my_mapper_method_two' => ['my-test-value2'],
  275. ],
  276. ]
  277. ];
  278. }
  279. /**
  280. * Data provider for addFieldToFilter method
  281. *
  282. * @return array
  283. */
  284. public function dataProviderAddFieldToFilter()
  285. {
  286. return [
  287. [
  288. 'field' => 'my-field',
  289. 'condition' => ['condition'],
  290. ],
  291. [
  292. 'field' => ['my-field', 'my-field'],
  293. 'condition' => null
  294. ],
  295. ];
  296. }
  297. }