SelectTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 SelectTest
  10. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  11. */
  12. class SelectTest extends \PHPUnit\Framework\TestCase
  13. {
  14. public function testWhere()
  15. {
  16. $quote = new \Magento\Framework\DB\Platform\Quote();
  17. $renderer = new \Magento\Framework\DB\Select\SelectRenderer(
  18. [
  19. 'distinct' => [
  20. 'renderer' => new \Magento\Framework\DB\Select\DistinctRenderer(),
  21. 'sort' => 100,
  22. 'part' => 'distinct'
  23. ],
  24. 'columns' => [
  25. 'renderer' => new \Magento\Framework\DB\Select\ColumnsRenderer($quote),
  26. 'sort' => 200,
  27. 'part' => 'columns'
  28. ],
  29. 'union' => [
  30. 'renderer' => new \Magento\Framework\DB\Select\UnionRenderer(),
  31. 'sort' => 300,
  32. 'part' => 'union'
  33. ],
  34. 'from' => [
  35. 'renderer' => new \Magento\Framework\DB\Select\FromRenderer($quote),
  36. 'sort' => 400,
  37. 'part' => 'from'
  38. ],
  39. 'where' => [
  40. 'renderer' => new \Magento\Framework\DB\Select\WhereRenderer(),
  41. 'sort' => 500,
  42. 'part' => 'where'
  43. ],
  44. 'group' => [
  45. 'renderer' => new \Magento\Framework\DB\Select\GroupRenderer($quote),
  46. 'sort' => 600,
  47. 'part' => 'group'
  48. ],
  49. 'having' => [
  50. 'renderer' => new \Magento\Framework\DB\Select\HavingRenderer(),
  51. 'sort' => 700,
  52. 'part' => 'having'
  53. ],
  54. 'order' => [
  55. 'renderer' => new \Magento\Framework\DB\Select\OrderRenderer($quote),
  56. 'sort' => 800,
  57. 'part' => 'order'
  58. ],
  59. 'limit' => [
  60. 'renderer' => new \Magento\Framework\DB\Select\LimitRenderer(),
  61. 'sort' => 900,
  62. 'part' => 'limitcount'
  63. ],
  64. 'for_update' => [
  65. 'renderer' => new \Magento\Framework\DB\Select\ForUpdateRenderer(),
  66. 'sort' => 1000,
  67. 'part' => 'forupdate'
  68. ],
  69. ]
  70. );
  71. $select = new Select($this->_getConnectionMockWithMockedQuote(1, "'5'"), $renderer);
  72. $select->from('test')->where('field = ?', 5);
  73. $this->assertEquals("SELECT `test`.* FROM `test` WHERE (field = '5')", $select->assemble());
  74. $select = new Select($this->_getConnectionMockWithMockedQuote(1, "''"), $renderer);
  75. $select->from('test')->where('field = ?');
  76. $this->assertEquals("SELECT `test`.* FROM `test` WHERE (field = '')", $select->assemble());
  77. $select = new Select($this->_getConnectionMockWithMockedQuote(1, "'%?%'"), $renderer);
  78. $select->from('test')->where('field LIKE ?', '%value?%');
  79. $this->assertEquals("SELECT `test`.* FROM `test` WHERE (field LIKE '%?%')", $select->assemble());
  80. $select = new Select($this->_getConnectionMockWithMockedQuote(0), $renderer);
  81. $select->from('test')->where("field LIKE '%value?%'", null, Select::TYPE_CONDITION);
  82. $this->assertEquals("SELECT `test`.* FROM `test` WHERE (field LIKE '%value?%')", $select->assemble());
  83. $select = new Select($this->_getConnectionMockWithMockedQuote(1, "'1', '2', '4', '8'"), $renderer);
  84. $select->from('test')->where("id IN (?)", [1, 2, 4, 8]);
  85. $this->assertEquals("SELECT `test`.* FROM `test` WHERE (id IN ('1', '2', '4', '8'))", $select->assemble());
  86. }
  87. /**
  88. * Retrieve mock of adapter with mocked quote method
  89. *
  90. * @param int $callCount
  91. * @param string|null $returnValue
  92. * @return \Magento\Framework\DB\Adapter\Pdo\Mysql|PHPUnit_Framework_MockObject_MockObject
  93. */
  94. protected function _getConnectionMockWithMockedQuote($callCount, $returnValue = null)
  95. {
  96. $connection = $this->createPartialMock(
  97. \Magento\Framework\DB\Adapter\Pdo\Mysql::class,
  98. ['supportStraightJoin', 'quote']
  99. );
  100. $method = $connection->expects($this->exactly($callCount))->method('quote');
  101. if ($callCount > 0) {
  102. $method->will($this->returnValue($returnValue));
  103. }
  104. return $connection;
  105. }
  106. }