ColumnsResolverTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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\DB;
  7. use Magento\Analytics\ReportXml\DB\ColumnsResolver;
  8. use Magento\Analytics\ReportXml\DB\NameResolver;
  9. use Magento\Analytics\ReportXml\DB\SelectBuilder;
  10. use Magento\Framework\DB\Sql\ColumnValueExpression;
  11. use Magento\Framework\App\ResourceConnection;
  12. use Magento\Framework\DB\Adapter\AdapterInterface;
  13. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
  14. class ColumnsResolverTest extends \PHPUnit\Framework\TestCase
  15. {
  16. /**
  17. * @var SelectBuilder|\PHPUnit_Framework_MockObject_MockObject
  18. */
  19. private $selectBuilderMock;
  20. /**
  21. * @var ColumnsResolver
  22. */
  23. private $columnsResolver;
  24. /**
  25. * @var ResourceConnection|\PHPUnit_Framework_MockObject_MockObject
  26. */
  27. private $resourceConnectionMock;
  28. /**
  29. * @var AdapterInterface|\PHPUnit_Framework_MockObject_MockObject
  30. */
  31. private $connectionMock;
  32. /**
  33. * @return void
  34. */
  35. protected function setUp()
  36. {
  37. $this->selectBuilderMock = $this->getMockBuilder(SelectBuilder::class)
  38. ->disableOriginalConstructor()
  39. ->getMock();
  40. $this->resourceConnectionMock = $this->getMockBuilder(ResourceConnection::class)
  41. ->disableOriginalConstructor()
  42. ->getMock();
  43. $this->connectionMock = $this->getMockBuilder(AdapterInterface::class)
  44. ->disableOriginalConstructor()
  45. ->getMock();
  46. $objectManager = new ObjectManagerHelper($this);
  47. $this->columnsResolver = $objectManager->getObject(
  48. ColumnsResolver::class,
  49. [
  50. 'nameResolver' => new NameResolver(),
  51. 'resourceConnection' => $this->resourceConnectionMock
  52. ]
  53. );
  54. }
  55. public function testGetColumnsWithoutAttributes()
  56. {
  57. $this->assertEquals($this->columnsResolver->getColumns($this->selectBuilderMock, []), []);
  58. }
  59. /**
  60. * @dataProvider getColumnsDataProvider
  61. */
  62. public function testGetColumnsWithFunction($expectedColumns, $expectedGroup, $entityConfig)
  63. {
  64. $this->resourceConnectionMock->expects($this->any())
  65. ->method('getConnection')
  66. ->willReturn($this->connectionMock);
  67. $this->connectionMock->expects($this->any())
  68. ->method('quoteIdentifier')
  69. ->with('cpe.name')
  70. ->willReturn('`cpe`.`name`');
  71. $this->selectBuilderMock->expects($this->once())
  72. ->method('getColumns')
  73. ->willReturn([]);
  74. $this->selectBuilderMock->expects($this->once())
  75. ->method('getGroup')
  76. ->willReturn([]);
  77. $this->selectBuilderMock->expects($this->once())
  78. ->method('setGroup')
  79. ->with($expectedGroup);
  80. $this->assertEquals(
  81. $expectedColumns,
  82. $this->columnsResolver->getColumns(
  83. $this->selectBuilderMock,
  84. $entityConfig
  85. )
  86. );
  87. }
  88. /**
  89. * @return array
  90. */
  91. public function getColumnsDataProvider()
  92. {
  93. return [
  94. 'COUNT( DISTINCT `cpe`.`name`) AS name' => [
  95. 'expectedColumns' => [
  96. 'name' => new ColumnValueExpression('COUNT( DISTINCT `cpe`.`name`)')
  97. ],
  98. 'expectedGroup' => [
  99. 'name' => new ColumnValueExpression('COUNT( DISTINCT `cpe`.`name`)')
  100. ],
  101. 'entityConfig' =>
  102. [
  103. 'name' => 'catalog_product_entity',
  104. 'alias' => 'cpe',
  105. 'attribute' => [
  106. [
  107. 'name' => 'name',
  108. 'function' => 'COUNT',
  109. 'distinct' => true,
  110. 'group' => true
  111. ]
  112. ],
  113. ],
  114. ],
  115. 'AVG(`cpe`.`name`) AS avg_name' => [
  116. 'expectedColumns' => [
  117. 'avg_name' => new ColumnValueExpression('AVG(`cpe`.`name`)')
  118. ],
  119. 'expectedGroup' => [],
  120. 'entityConfig' =>
  121. [
  122. 'name' => 'catalog_product_entity',
  123. 'alias' => 'cpe',
  124. 'attribute' => [
  125. [
  126. 'name' => 'name',
  127. 'alias' => 'avg_name',
  128. 'function' => 'AVG',
  129. ]
  130. ],
  131. ],
  132. ]
  133. ];
  134. }
  135. }