* @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); } }