/tests/ZendTest/Db/Sql/Platform/SqlServer/SelectDecoratorTest.php

https://github.com/Ocramius/zf2 · PHP · 107 lines · 72 code · 15 blank · 20 comment · 0 complexity · ca41fd6ce4c217fd13567369a16044f5 MD5 · raw file

  1. <?php
  2. /**
  3. * Zend Framework (http://framework.zend.com/)
  4. *
  5. * @link http://github.com/zendframework/zf2 for the canonical source repository
  6. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  7. * @license http://framework.zend.com/license/new-bsd New BSD License
  8. */
  9. namespace ZendTest\Db\Sql\Platform\SqlServer;
  10. use Zend\Db\Sql\Platform\SqlServer\SelectDecorator;
  11. use Zend\Db\Sql\Select;
  12. use Zend\Db\Adapter\ParameterContainer;
  13. use Zend\Db\Adapter\Platform\SqlServer as SqlServerPlatform;
  14. class SelectDecoratorTest extends \PHPUnit_Framework_TestCase
  15. {
  16. /**
  17. * @testdox integration test: Testing SelectDecorator will use Select an internal state to prepare a proper limit/offset sql statement
  18. * @covers Zend\Db\Sql\Platform\SqlServer\SelectDecorator::prepareStatement
  19. * @covers Zend\Db\Sql\Platform\SqlServer\SelectDecorator::processLimitOffset
  20. * @dataProvider dataProvider
  21. */
  22. public function testPrepareStatement(Select $select, $expectedSql, $expectedParams, $notUsed, $expectedFormatParamCount)
  23. {
  24. $driver = $this->getMock('Zend\Db\Adapter\Driver\DriverInterface');
  25. $driver->expects($this->exactly($expectedFormatParamCount))->method('formatParameterName')->will($this->returnValue('?'));
  26. // test
  27. $adapter = $this->getMock(
  28. 'Zend\Db\Adapter\Adapter',
  29. null,
  30. array(
  31. $driver,
  32. new SqlServerPlatform()
  33. )
  34. );
  35. $parameterContainer = new ParameterContainer;
  36. $statement = $this->getMock('Zend\Db\Adapter\Driver\StatementInterface');
  37. $statement->expects($this->any())->method('getParameterContainer')->will($this->returnValue($parameterContainer));
  38. $statement->expects($this->once())->method('setSql')->with($expectedSql);
  39. $selectDecorator = new SelectDecorator;
  40. $selectDecorator->setSubject($select);
  41. $selectDecorator->prepareStatement($adapter, $statement);
  42. $this->assertEquals($expectedParams, $parameterContainer->getNamedArray());
  43. }
  44. /**
  45. * @testdox integration test: Testing SelectDecorator will use Select an internal state to prepare a proper limit/offset sql statement
  46. * @covers Zend\Db\Sql\Platform\SqlServer\SelectDecorator::getSqlString
  47. * @covers Zend\Db\Sql\Platform\SqlServer\SelectDecorator::processLimitOffset
  48. * @dataProvider dataProvider
  49. */
  50. public function testGetSqlString(Select $select, $notUsed, $notUsed, $expectedSql)
  51. {
  52. $parameterContainer = new ParameterContainer;
  53. $statement = $this->getMock('Zend\Db\Adapter\Driver\StatementInterface');
  54. $statement->expects($this->any())->method('getParameterContainer')->will($this->returnValue($parameterContainer));
  55. $selectDecorator = new SelectDecorator;
  56. $selectDecorator->setSubject($select);
  57. $this->assertEquals($expectedSql, $selectDecorator->getSqlString(new SqlServerPlatform));
  58. }
  59. public function dataProvider()
  60. {
  61. $select0 = new Select;
  62. $select0->from('foo')->columns(array('bar', 'baz'))->order('bar')->limit(5)->offset(10);
  63. $expectedPrepareSql0 = 'SELECT [bar], [baz] FROM ( SELECT [foo].[bar] AS [bar], [foo].[baz] AS [baz], ROW_NUMBER() OVER (ORDER BY [bar] ASC) AS [__ZEND_ROW_NUMBER] FROM [foo] ) AS [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION] WHERE [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION].[__ZEND_ROW_NUMBER] BETWEEN ?+1 AND ?+?';
  64. $expectedParams0 = array('offset' => 10, 'limit' => 5, 'offsetForSum' => 10);
  65. $expectedSql0 = 'SELECT [bar], [baz] FROM ( SELECT [foo].[bar] AS [bar], [foo].[baz] AS [baz], ROW_NUMBER() OVER (ORDER BY [bar] ASC) AS [__ZEND_ROW_NUMBER] FROM [foo] ) AS [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION] WHERE [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION].[__ZEND_ROW_NUMBER] BETWEEN 10+1 AND 5+10';
  66. $expectedFormatParamCount0 = 3;
  67. $select1 = new Select;
  68. $select1->from('foo')->columns(array('bar', 'bam' => 'baz'))->limit(5)->offset(10);
  69. $expectedPrepareSql1 = 'SELECT [bar], [bam] FROM ( SELECT [foo].[bar] AS [bar], [foo].[baz] AS [bam], ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [__ZEND_ROW_NUMBER] FROM [foo] ) AS [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION] WHERE [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION].[__ZEND_ROW_NUMBER] BETWEEN ?+1 AND ?+?';
  70. $expectedParams1 = array('offset' => 10, 'limit' => 5, 'offsetForSum' => 10);
  71. $expectedSql1 = 'SELECT [bar], [bam] FROM ( SELECT [foo].[bar] AS [bar], [foo].[baz] AS [bam], ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [__ZEND_ROW_NUMBER] FROM [foo] ) AS [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION] WHERE [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION].[__ZEND_ROW_NUMBER] BETWEEN 10+1 AND 5+10';
  72. $expectedFormatParamCount1 = 3;
  73. $select2 = new Select;
  74. $select2->from('foo')->order('bar')->limit(5)->offset(10);
  75. $expectedPrepareSql2 = 'SELECT * FROM ( SELECT [foo].*, ROW_NUMBER() OVER (ORDER BY [bar] ASC) AS [__ZEND_ROW_NUMBER] FROM [foo] ) AS [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION] WHERE [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION].[__ZEND_ROW_NUMBER] BETWEEN ?+1 AND ?+?';
  76. $expectedParams2 = array('offset' => 10, 'limit' => 5, 'offsetForSum' => 10);
  77. $expectedSql2 = 'SELECT * FROM ( SELECT [foo].*, ROW_NUMBER() OVER (ORDER BY [bar] ASC) AS [__ZEND_ROW_NUMBER] FROM [foo] ) AS [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION] WHERE [ZEND_SQL_SERVER_LIMIT_OFFSET_EMULATION].[__ZEND_ROW_NUMBER] BETWEEN 10+1 AND 5+10';
  78. $expectedFormatParamCount2 = 3;
  79. $select3 = new Select;
  80. $select3->from('foo');
  81. $expectedPrepareSql3 = 'SELECT [foo].* FROM [foo]';
  82. $expectedParams3 = array();
  83. $expectedSql3 = 'SELECT [foo].* FROM [foo]';
  84. $expectedFormatParamCount3 = 0;
  85. return array(
  86. array($select0, $expectedPrepareSql0, $expectedParams0, $expectedSql0, $expectedFormatParamCount0),
  87. array($select1, $expectedPrepareSql1, $expectedParams1, $expectedSql1, $expectedFormatParamCount1),
  88. array($select2, $expectedPrepareSql2, $expectedParams2, $expectedSql2, $expectedFormatParamCount2),
  89. array($select3, $expectedPrepareSql3, $expectedParams3, $expectedSql3, $expectedFormatParamCount3)
  90. );
  91. }
  92. }