1<?php 2/* 3 * $Id$ 4 * 5 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 6 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 7 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 8 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 9 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 10 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 11 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 12 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 13 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 14 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 15 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 16 * 17 * This software consists of voluntary contributions made by many individuals 18 * and is licensed under the LGPL. For more information, see 19 * <http://www.doctrine-project.org>. 20 */ 21 22/** 23 * Doctrine_Ticket_DC828_TestCase 24 * 25 * @package Doctrine 26 * @author Enrico Stahn <mail@enricostahn.com> 27 * @license http://www.opensource.org/licenses/lgpl-license.php LGPL 28 * @category Object Relational Mapping 29 * @link www.doctrine-project.org 30 * @since 1.0 31 * @version $Revision$ 32 */ 33class Doctrine_Ticket_DC828_TestCase extends Doctrine_UnitTestCase 34{ 35 private $sqlStackCounter = 0; 36 37 public function prepareTables() 38 { 39 $this->tables[] = 'Ticket_DC828_Model'; 40 parent::prepareTables(); 41 } 42 43 public function testInit() 44 { 45 $this->dbh = new Doctrine_Adapter_Mock('mssql'); 46 $this->conn = Doctrine_Manager::getInstance()->openConnection($this->dbh, 'DC828'); 47 } 48 49 public function testLimit() 50 { 51 Doctrine_Query::create()->select()->from('Ticket_DC828_Model')->limit(10)->execute(); 52 53 $expected = 'SELECT TOP 10 [t].[model_id] AS [t__model_id], [t].[username] AS [t__username], [t].[password] AS [t__password] FROM [ticket__d_c828__model] [t]'; 54 $sql = current(array_slice($this->dbh->getAll(), $this->sqlStackCounter++, 1)); 55 56 $this->assertEqual($expected, $sql); 57 } 58 59 public function testLimitOffsetWithoutOrderBy() 60 { 61 $exception = false; 62 63 try { 64 Doctrine_Query::create()->select()->from('Ticket_DC828_Model')->limit(10)->offset(5)->execute(); 65 } catch (Doctrine_Connection_Exception $e) { 66 $exception = true; 67 $this->assertEqual($e->getMessage(), 'OFFSET cannot be used in MSSQL without ORDER BY due to emulation reasons.'); 68 } 69 70 $this->assertTrue($exception); 71 } 72 73 public function testOrderBy() 74 { 75 Doctrine_Query::create()->select()->from('Ticket_DC828_Model')->orderBy('username')->execute(); 76 77 $expected = 'SELECT [t].[model_id] AS [t__model_id], [t].[username] AS [t__username], [t].[password] AS [t__password] FROM [ticket__d_c828__model] [t] ORDER BY [t].[username]'; 78 $sql = current(array_slice($this->dbh->getAll(), $this->sqlStackCounter++, 1)); 79 80 $this->assertEqual($expected, $sql); 81 } 82 83 public function testOrderByLimit() 84 { 85 Doctrine_Query::create()->select()->from('Ticket_DC828_Model')->orderBy('username')->limit(10)->execute(); 86 87 $expected = 'SELECT TOP 10 [t].[model_id] AS [t__model_id], [t].[username] AS [t__username], [t].[password] AS [t__password] FROM [ticket__d_c828__model] [t] ORDER BY [t].[username]'; 88 $sql = current(array_slice($this->dbh->getAll(), $this->sqlStackCounter++, 1)); 89 90 $this->assertEqual($expected, $sql); 91 } 92 93 public function testOrderByLimitOffset() 94 { 95 Doctrine_Query::create()->select()->from('Ticket_DC828_Model')->orderBy('username')->limit(10)->offset(5)->execute(); 96 97 $expected = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY [t].[username]) AS [DOCTRINE_ROWNUM], [t].[model_id] AS [t__model_id], [t].[username] AS [t__username], [t].[password] AS [t__password] FROM [ticket__d_c828__model] [t] ) AS [doctrine_tbl] WHERE [DOCTRINE_ROWNUM] BETWEEN 6 AND 15'; 98 $sql = current(array_slice($this->dbh->getAll(), $this->sqlStackCounter++, 1)); 99 100 $this->assertEqual($expected, $sql); 101 } 102 103 public function testMultipleOrderByFields() 104 { 105 Doctrine_Query::create()->select()->from('Ticket_DC828_Model')->orderBy('username, password')->limit(10)->offset(5)->execute(); 106 107 $expected = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY [t].[username], [t].[password]) AS [DOCTRINE_ROWNUM], [t].[model_id] AS [t__model_id], [t].[username] AS [t__username], [t].[password] AS [t__password] FROM [ticket__d_c828__model] [t] ) AS [doctrine_tbl] WHERE [DOCTRINE_ROWNUM] BETWEEN 6 AND 15'; 108 $sql = current(array_slice($this->dbh->getAll(), $this->sqlStackCounter++, 1)); 109 110 $this->assertEqual($expected, $sql); 111 } 112} 113 114class Ticket_DC828_Model extends Doctrine_Record 115{ 116 public function setTableDefinition() 117 { 118 $this->hasColumn('model_id as id', 'integer', null, array( 119 'type' => 'integer', 120 'unsigned' => false, 121 'primary' => true, 122 'autoincrement' => true, 123 )); 124 $this->hasColumn('username', 'string', 255); 125 $this->hasColumn('password', 'string', 255); 126 } 127} 128