<?php 
/** 
 * Copyright (c) 2004-2015, EMESA BV 
 * All rights reserved. 
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are PROHIBITED without prior written permission from 
 * the author. This product may NOT be used anywhere and on any computer 
 * except the server platform of EMESA BV. If you received this code 
 * accidentally and without intent to use it, please report this 
 * incident to the author by email. 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
 * SUCH DAMAGE. 
 */ 
/** 
 * ${DESCRIPTION} 
 * 
 * @author Victor Bolshov <[email protected]> 
 * @phpcs 
 */ 
 
 
namespace tinyorm\test; 
 
use tinyorm\Bind; 
use tinyorm\Select; 
 
class SelectTest extends BaseTestCase 
{ 
    const ROWCOUNT = 10; 
    const DENOMINATOR = 3; 
    const ZEROS = 4; 
    const ONES = 3; 
    const TWOS = 3; 
    const THREES = 3; 
    protected function setUp() 
    { 
        parent::setUp(); 
        $this->connection->exec("ALTER TABLE test AUTO_INCREMENT = 1"); 
        $this->connection->exec("ALTER TABLE test2 AUTO_INCREMENT = 1"); 
        for ($i = 0; $i < self::ROWCOUNT; $i++) { 
            $c_int = $i % self::DENOMINATOR; 
            $c_varchar = "varchar " . $c_int; 
            $c_unique = "unique " . $i; 
            $this->connection->exec("INSERT INTO test (c_varchar, c_int, c_unique) 
              VALUES ('$c_varchar', $c_int, '$c_unique')"); 
            $this->connection->exec("INSERT INTO test2 (c_varchar, c_int, c_unique) 
              VALUES ('$c_varchar', $c_int, '$c_unique')"); 
        } 
    } 
 
    function testBasicSelect() 
    { 
        $rows = $this->createSelect("test")->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(self::ROWCOUNT, count($rows)); 
    } 
 
    function testBasicCount() 
    { 
        $rowCount = $this->createSelect("test")->count(); 
        $this->assertEquals(self::ROWCOUNT, $rowCount); 
    } 
 
    function testWhereCondition() 
    { 
        $select = $this->createSelect("test")->where("c_int = ?", 0); 
        $this->assertEquals(self::ZEROS, $select->count()); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(self::ZEROS, count($rows)); 
    } 
 
    function testWhereConditionWithBind() 
    { 
        $select = $this->createSelect("test")->where("c_int = ?", Bind::int(0)); 
        $this->assertEquals(self::ZEROS, $select->count()); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(self::ZEROS, count($rows)); 
    } 
 
    function testLimit() 
    { 
        $select = $this->createSelect("test")->limit(1); 
        $this->assertEquals(self::ROWCOUNT, $select->count()); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(1, count($rows)); 
    } 
 
    function testOrderBy() 
    { 
        $select = $this->createSelect("test")->orderBy("c_unique"); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        for ($i = 0; $i < self::ROWCOUNT; $i++) { 
            $this->assertEquals("unique $i", $rows[$i]["c_unique"]); 
        } 
    } 
 
    function testOffset() 
    { 
        $offset = 5; 
        $select = $this->createSelect("test")->orderBy("c_unique")->limit(10)->offset($offset); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        for ($i = 0; $i < self::ROWCOUNT - $offset; $i++) { 
            $val = "unique " . ($i + $offset); 
            $this->assertEquals($val, $rows[$i]["c_unique"]); 
        } 
    } 
 
    function testGroupBy() 
    { 
        $select = $this->createSelect("test")->groupBy("c_int"); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(self::DENOMINATOR, count($rows)); 
    } 
 
    function testCountWithExpression() 
    { 
        $select = $this->createSelect("test")->groupBy("c_int"); 
        $this->assertEquals(self::DENOMINATOR, $select->count("DISTINCT c_int")); 
    } 
 
    function testHaving() 
    { 
        $select = $this->createSelect("test")->groupBy("c_int")->having("c_int = 0"); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(1, count($rows)); 
    } 
 
    function testJoin() 
    { 
        $select = $this->createSelect("test")->join("JOIN test2 USING (c_unique)"); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(self::ROWCOUNT, count($rows)); 
    } 
 
    function testInClause() 
    { 
        $select = $this->createSelect("test")->where("c_int IN (?)", [0, 1]); 
        $expectedRowCount = self::ZEROS + self::ONES; 
        $this->assertEquals($expectedRowCount, $select->count()); 
    } 
 
    function testGroupByWithParameters() 
    { 
        $select = $this->createSelect("test")->groupBy("c_int = ?", 0); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(2, count($rows)); 
    } 
 
    function testHavingWithParameters() 
    { 
        $select = $this->createSelect("test")->groupBy("c_int")->having("c_int = ?", 0); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(1, count($rows)); 
    } 
 
    function testJoinWithParameters() 
    { 
        $select = $this->createSelect("test")->join("JOIN test2 ON (test.id = test2.id AND test2.c_int = ?)", "", 0); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(self::ZEROS, count($rows)); 
    } 
 
    function testColsWithParameters() 
    { 
        $addOn = "ADDON"; 
        $select = (new Select("test", "test.*, ? AS add_on", $addOn))->setConnection($this->connection); 
        $rows = $select->execute()->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(self::ROWCOUNT, count($rows)); 
        $this->assertEquals($addOn, $rows[0]["add_on"]); 
    } 
 
    function testQueryId() 
    { 
        $select = $this->createSelect("test")->setId("TEST_ID"); 
        $str = $select->__toString(); 
        $this->assertTrue(substr_count($str, "TEST_ID") == 1); 
        $stmt = $select->execute(); 
        $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
        $this->assertEquals(self::ROWCOUNT, count($rows)); 
 
        $stmt = $select->getCountStatement(); 
        $sql = $stmt->queryString; 
        $this->assertTrue(substr_count($sql, "TEST_ID") == 1); 
        $this->assertEquals(self::ROWCOUNT, $stmt->fetchColumn()); 
    } 
 
    /** 
     * @param $table 
     * @return Select 
     */ 
    protected function createSelect($table) 
    { 
        return (new Select($table))->setConnection($this->connection); 
    } 
} 
 
 |