SelectHydratorTest.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Analytics\Test\Unit\ReportXml;
  7. use Magento\Analytics\ReportXml\SelectHydrator;
  8. use Magento\Framework\App\ResourceConnection;
  9. use Magento\Framework\DB\Adapter\AdapterInterface;
  10. use Magento\Framework\DB\Select;
  11. use Magento\Framework\DB\Sql\JsonSerializableExpression;
  12. use Magento\Framework\ObjectManagerInterface;
  13. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
  14. class SelectHydratorTest extends \PHPUnit\Framework\TestCase
  15. {
  16. /**
  17. * @var SelectHydrator
  18. */
  19. private $selectHydrator;
  20. /**
  21. * @var ResourceConnection|\PHPUnit_Framework_MockObject_MockObject
  22. */
  23. private $resourceConnectionMock;
  24. /**
  25. * @var AdapterInterface|\PHPUnit_Framework_MockObject_MockObject
  26. */
  27. private $connectionMock;
  28. /**
  29. * @var Select|\PHPUnit_Framework_MockObject_MockObject
  30. */
  31. private $selectMock;
  32. /**
  33. * @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject
  34. */
  35. private $objectManagerMock;
  36. /**
  37. * @var ObjectManagerHelper
  38. */
  39. private $objectManagerHelper;
  40. /**
  41. * @return void
  42. */
  43. protected function setUp()
  44. {
  45. $this->resourceConnectionMock = $this->getMockBuilder(ResourceConnection::class)
  46. ->disableOriginalConstructor()
  47. ->getMock();
  48. $this->connectionMock = $this->getMockBuilder(AdapterInterface::class)
  49. ->disableOriginalConstructor()
  50. ->getMock();
  51. $this->selectMock = $this->getMockBuilder(Select::class)
  52. ->disableOriginalConstructor()
  53. ->getMock();
  54. $this->objectManagerMock = $this->getMockBuilder(ObjectManagerInterface::class)
  55. ->disableOriginalConstructor()
  56. ->getMock();
  57. $this->objectManagerHelper = new ObjectManagerHelper($this);
  58. $this->selectHydrator = $this->objectManagerHelper->getObject(
  59. SelectHydrator::class,
  60. [
  61. 'resourceConnection' => $this->resourceConnectionMock,
  62. 'objectManager' => $this->objectManagerMock,
  63. ]
  64. );
  65. }
  66. public function testExtract()
  67. {
  68. $selectParts =
  69. [
  70. Select::DISTINCT,
  71. Select::COLUMNS,
  72. Select::UNION,
  73. Select::FROM,
  74. Select::WHERE,
  75. Select::GROUP,
  76. Select::HAVING,
  77. Select::ORDER,
  78. Select::LIMIT_COUNT,
  79. Select::LIMIT_OFFSET,
  80. Select::FOR_UPDATE
  81. ];
  82. $result = [];
  83. foreach ($selectParts as $part) {
  84. $result[$part] = "Part";
  85. }
  86. $this->selectMock->expects($this->any())
  87. ->method('getPart')
  88. ->willReturn("Part");
  89. $this->assertEquals($this->selectHydrator->extract($this->selectMock), $result);
  90. }
  91. /**
  92. * @dataProvider recreateWithoutExpressionDataProvider
  93. * @param array $selectParts
  94. * @param array $parts
  95. * @param array $partValues
  96. */
  97. public function testRecreateWithoutExpression($selectParts, $parts, $partValues)
  98. {
  99. $this->resourceConnectionMock->expects($this->once())
  100. ->method('getConnection')
  101. ->willReturn($this->connectionMock);
  102. $this->connectionMock->expects($this->once())
  103. ->method('select')
  104. ->willReturn($this->selectMock);
  105. foreach ($parts as $key => $part) {
  106. $this->selectMock->expects($this->at($key))
  107. ->method('setPart')
  108. ->with($part, $partValues[$key]);
  109. }
  110. $this->assertSame($this->selectMock, $this->selectHydrator->recreate($selectParts));
  111. }
  112. /**
  113. * @return array
  114. */
  115. public function recreateWithoutExpressionDataProvider()
  116. {
  117. return [
  118. 'Select without expressions' => [
  119. [
  120. Select::COLUMNS => [
  121. [
  122. 'table_name',
  123. 'field_name',
  124. 'alias',
  125. ],
  126. [
  127. 'table_name',
  128. 'field_name_2',
  129. 'alias_2',
  130. ],
  131. ]
  132. ],
  133. [Select::COLUMNS],
  134. [[
  135. [
  136. 'table_name',
  137. 'field_name',
  138. 'alias',
  139. ],
  140. [
  141. 'table_name',
  142. 'field_name_2',
  143. 'alias_2',
  144. ],
  145. ]],
  146. ],
  147. ];
  148. }
  149. /**
  150. * @dataProvider recreateWithExpressionDataProvider
  151. * @param array $selectParts
  152. * @param array $expectedParts
  153. * @param \PHPUnit_Framework_MockObject_MockObject[] $expressionMocks
  154. */
  155. public function testRecreateWithExpression(
  156. array $selectParts,
  157. array $expectedParts,
  158. array $expressionMocks
  159. ) {
  160. $this->objectManagerMock
  161. ->expects($this->exactly(count($expressionMocks)))
  162. ->method('create')
  163. ->with($this->isType('string'), $this->isType('array'))
  164. ->willReturnOnConsecutiveCalls(...$expressionMocks);
  165. $this->resourceConnectionMock
  166. ->expects($this->once())
  167. ->method('getConnection')
  168. ->with()
  169. ->willReturn($this->connectionMock);
  170. $this->connectionMock
  171. ->expects($this->once())
  172. ->method('select')
  173. ->with()
  174. ->willReturn($this->selectMock);
  175. foreach (array_keys($selectParts) as $key => $partName) {
  176. $this->selectMock
  177. ->expects($this->at($key))
  178. ->method('setPart')
  179. ->with($partName, $expectedParts[$partName]);
  180. }
  181. $this->assertSame($this->selectMock, $this->selectHydrator->recreate($selectParts));
  182. }
  183. /**
  184. * @return array
  185. */
  186. public function recreateWithExpressionDataProvider()
  187. {
  188. $expressionMock = $this->getMockBuilder(JsonSerializableExpression::class)
  189. ->disableOriginalConstructor()
  190. ->getMock();
  191. return [
  192. 'Select without expressions' => [
  193. 'Parts' => [
  194. Select::COLUMNS => [
  195. [
  196. 'table_name',
  197. 'field_name',
  198. 'alias',
  199. ],
  200. [
  201. 'table_name',
  202. [
  203. 'class' => 'Some_class',
  204. 'arguments' => [
  205. 'expression' => ['some(expression)']
  206. ]
  207. ],
  208. 'alias_2',
  209. ],
  210. ]
  211. ],
  212. 'expectedParts' => [
  213. Select::COLUMNS => [
  214. [
  215. 'table_name',
  216. 'field_name',
  217. 'alias',
  218. ],
  219. [
  220. 'table_name',
  221. $expressionMock,
  222. 'alias_2',
  223. ],
  224. ]
  225. ],
  226. 'expectedExpressions' => [
  227. $expressionMock
  228. ]
  229. ],
  230. ];
  231. }
  232. }