TemporaryTableServiceTest.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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\TemporaryTableService;
  8. use Magento\Framework\DB\Adapter\AdapterInterface;
  9. use Magento\Framework\DB\Select;
  10. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  11. use Magento\Framework\Math\Random;
  12. class TemporaryTableServiceTest extends \PHPUnit\Framework\TestCase
  13. {
  14. /**
  15. * @var TemporaryTableService|\PHPUnit_Framework_MockObject_MockObject
  16. */
  17. private $temporaryTableService;
  18. /**
  19. * @var AdapterInterface|\PHPUnit_Framework_MockObject_MockObject
  20. */
  21. private $adapterMock;
  22. /**
  23. * @var Random|\PHPUnit_Framework_MockObject_MockObject
  24. */
  25. private $randomMock;
  26. /**
  27. * @var Select|\PHPUnit_Framework_MockObject_MockObject
  28. */
  29. private $selectMock;
  30. /**
  31. * Set up
  32. *
  33. * @return void
  34. */
  35. protected function setUp()
  36. {
  37. $this->adapterMock = $this->createMock(AdapterInterface::class);
  38. $this->selectMock = $this->createMock(Select::class);
  39. $this->randomMock = $this->createMock(Random::class);
  40. $this->temporaryTableService = (new ObjectManager($this))->getObject(
  41. TemporaryTableService::class,
  42. [
  43. 'random' => $this->randomMock,
  44. 'allowedIndexMethods' => ['HASH'],
  45. 'allowedEngines' => ['INNODB']
  46. ]
  47. );
  48. }
  49. /**
  50. * Run test createFromSelect method
  51. *
  52. * @return void
  53. */
  54. public function testCreateFromSelectWithException()
  55. {
  56. $this->expectException(\InvalidArgumentException::class);
  57. $random = 'random_table';
  58. $indexes = [
  59. ['PRIMARY' => ['primary_column_name']],
  60. 'CREATE TEMPORARY TABLE random_table (PRIMARY KEY(primary_column_name)) ENGINE=INNODB IGNORE '
  61. . '(select * from sometable)'
  62. ];
  63. $this->assertEquals(
  64. $random,
  65. $this->temporaryTableService->createFromSelect(
  66. $this->selectMock,
  67. $this->adapterMock,
  68. $indexes,
  69. TemporaryTableService::INDEX_METHOD_HASH . "Other",
  70. TemporaryTableService::DB_ENGINE_INNODB . "Other"
  71. )
  72. );
  73. }
  74. /**
  75. * Run test createFromSelect method
  76. *
  77. * @param array $indexes
  78. * @param string $expectedSelect
  79. * @dataProvider createFromSelectDataProvider
  80. * @return void
  81. */
  82. public function testCreateFromSelect($indexes, $expectedSelect)
  83. {
  84. $selectString = 'select * from sometable';
  85. $random = 'random_table';
  86. $this->randomMock->expects($this->once())
  87. ->method('getUniqueHash')
  88. ->willReturn($random);
  89. $this->adapterMock->expects($this->once())
  90. ->method('query')
  91. ->with($expectedSelect)
  92. ->willReturnSelf();
  93. $this->adapterMock->expects($this->once())
  94. ->method('query')
  95. ->willReturnSelf();
  96. $this->adapterMock->expects($this->any())
  97. ->method('quoteIdentifier')
  98. ->willReturnArgument(0);
  99. $this->selectMock->expects($this->once())
  100. ->method('getBind')
  101. ->willReturn(['bind']);
  102. $this->selectMock->expects($this->any())
  103. ->method('__toString')
  104. ->willReturn($selectString);
  105. $this->assertEquals(
  106. $random,
  107. $this->temporaryTableService->createFromSelect(
  108. $this->selectMock,
  109. $this->adapterMock,
  110. $indexes
  111. )
  112. );
  113. }
  114. /**
  115. * Run test dropTable method when createdTables array of TemporaryTableService is empty
  116. *
  117. * @return void
  118. */
  119. public function testDropTableWhenCreatedTablesArrayIsEmpty()
  120. {
  121. $this->assertFalse($this->temporaryTableService->dropTable('tmp_select_table'));
  122. }
  123. /**
  124. * Run test dropTable method when data exists in createdTables array of TemporaryTableService
  125. *
  126. * @param string $tableName
  127. * @param bool $assertion
  128. *
  129. * @dataProvider dropTableWhenCreatedTablesArrayNotEmptyDataProvider
  130. * @return void
  131. */
  132. public function testDropTableWhenCreatedTablesArrayNotEmpty($tableName, $assertion)
  133. {
  134. $createdTableAdapters = new \ReflectionProperty($this->temporaryTableService, 'createdTableAdapters');
  135. $createdTableAdapters->setAccessible(true);
  136. $createdTableAdapters->setValue($this->temporaryTableService, ['tmp_select_table' => $this->adapterMock]);
  137. $createdTableAdapters->setAccessible(false);
  138. $this->adapterMock->expects($this->any())
  139. ->method('dropTemporaryTable')
  140. ->willReturn(true);
  141. $this->assertEquals($this->temporaryTableService->dropTable($tableName), $assertion);
  142. }
  143. /**
  144. * @return array
  145. */
  146. public function createFromSelectDataProvider()
  147. {
  148. return [
  149. [
  150. ['PRIMARY' => ['primary_column_name']],
  151. 'CREATE TEMPORARY TABLE random_table (PRIMARY KEY(primary_column_name)) ENGINE=INNODB IGNORE '
  152. . '(select * from sometable)'
  153. ],
  154. [
  155. ['UNQ_INDX' => ['column1', 'column2']],
  156. 'CREATE TEMPORARY TABLE random_table (UNIQUE UNQ_INDX(column1,column2)) ENGINE=INNODB IGNORE '
  157. . '(select * from sometable)'
  158. ],
  159. [
  160. ['OTH_INDX' => ['column3', 'column4']],
  161. 'CREATE TEMPORARY TABLE random_table (INDEX OTH_INDX USING HASH(column3,column4)) ENGINE=INNODB IGNORE '
  162. . '(select * from sometable)'
  163. ],
  164. [
  165. [
  166. 'PRIMARY' => ['primary_column_name'],
  167. 'OTH_INDX' => ['column3', 'column4'],
  168. 'UNQ_INDX' => ['column1', 'column2']
  169. ],
  170. 'CREATE TEMPORARY TABLE random_table '
  171. . '(PRIMARY KEY(primary_column_name),'
  172. . 'INDEX OTH_INDX USING HASH(column3,column4),UNIQUE UNQ_INDX(column1,column2)) ENGINE=INNODB IGNORE '
  173. . '(select * from sometable)'
  174. ],
  175. ];
  176. }
  177. /**
  178. * @return array
  179. */
  180. public function dropTableWhenCreatedTablesArrayNotEmptyDataProvider()
  181. {
  182. return [
  183. ['tmp_select_table_1', false],
  184. ['tmp_select_table', true],
  185. ];
  186. }
  187. }