| 
<?php
 /*
 * Queasy PHP Framework - Database - Tests
 *
 * (c) Vitaly Demyanenko <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE file that was distributed with this source code.
 */
 
 namespace queasy\db\tests;
 
 use PHPUnit\Framework\TestCase;
 
 use PDO;
 use PDOException;
 
 use Exception;
 use InvalidArgumentException;
 use BadMethodCallException;
 
 use queasy\db\Db;
 use queasy\db\DbException;
 
 class DbTest extends TestCase
 {
 private $pdo;
 
 public function setUp(): void
 {
 $this->pdo = new PDO('sqlite:tests/resources/test.sqlite.temp');
 }
 
 public function tearDown(): void
 {
 $this->pdo->exec('DELETE FROM `users`');
 $this->pdo->exec('DELETE FROM `ids`');
 
 $this->pdo = null;
 }
 
 public function testConstructorWithoutParameters()
 {
 $qdb = new Db();
 
 $this->assertInstanceOf('PDO', $qdb);
 }
 
 public function testConstructorWithoutParametersAndExec()
 {
 $qdb = new Db();
 
 $qdb->exec('
 CREATE  TABLE `users` (
 `id`            integer primary key,
 `email`         text not null unique,
 `password_hash` text not null
 )');
 
 $qdb->exec('
 INSERT  INTO `users` (`id`, `email`, `password_hash`)
 VALUES  (12, \'[email protected]\', \'7328576391847569\')');
 
 $statement = $qdb->query('
 SELECT  *
 FROM    `users`');
 
 $this->assertInstanceOf('PDOStatement', $statement);
 
 $rows = $statement->fetchAll(PDO::FETCH_ASSOC);
 
 $this->assertCount(1, $rows);
 
 $row = array_shift($rows);
 
 $this->assertEquals(12, $row['id']);
 $this->assertEquals('[email protected]', $row['email']);
 $this->assertEquals('7328576391847569', $row['password_hash']);
 }
 
 public function testConstructorWithPDOParameters()
 {
 $qdb = new Db('sqlite:tests/resources/test.sqlite.temp');
 
 $this->assertCount(3, $qdb->user_roles);
 }
 
 public function testConstructorWithWrongDSN()
 {
 $this->expectException(PDOException::class);
 
 new Db('wrong dsn');
 }
 
 public function testConstructorWithWrongDSNNumeric()
 {
 $this->expectException(InvalidArgumentException::class);
 
 new Db(32167);
 }
 
 public function testGetTable()
 {
 $qdb = new Db();
 
 $table = $qdb->table('users');
 
 $this->assertInstanceOf(\queasy\db\Table::class, $table);
 $this->assertEquals('users', $table->getName());
 }
 
 public function testGetTableTwice()
 {
 $qdb = new Db();
 
 $table = $qdb->table('users');
 $table2 = $qdb->table('users');
 
 $this->assertSame($table, $table2);
 }
 
 public function testGetTableAsProperty()
 {
 $qdb = new Db();
 
 $table = $qdb->users;
 
 $this->assertInstanceOf('queasy\db\Table', $table);
 $this->assertEquals('users', $table->getName());
 }
 
 public function testGetTableAsArrayItem()
 {
 $qdb = new Db();
 
 $table = $qdb['users'];
 
 $this->assertInstanceOf('queasy\db\Table', $table);
 $this->assertEquals('users', $table->getName());
 }
 
 public function testSetTableAsArrayItem()
 {
 $qdb = new Db();
 
 $this->expectException(BadMethodCallException::class);
 
 $qdb['users'] = true;
 }
 
 public function testIssetTableAsArrayItem()
 {
 $qdb = new Db();
 
 $this->expectException(BadMethodCallException::class);
 
 isset($qdb['users']);
 }
 
 public function testUnsetTableAsArrayItem()
 {
 $qdb = new Db();
 
 $this->expectException(BadMethodCallException::class);
 
 unset($qdb['users']);
 }
 
 public function testRunSelect()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp']]);
 
 $statement = $qdb->run('
 SELECT  count(*)
 FROM    `user_roles`');
 
 $this->assertInstanceOf('PDOStatement', $statement);
 
 $row = $statement->fetch();
 
 $this->assertEquals(3, $row[0]);
 }
 
 public function testInvokeSelect()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp']]);
 
 $statement = $qdb('
 SELECT  count(*)
 FROM    `user_roles`');
 
 $this->assertInstanceOf('PDOStatement', $statement);
 
 $row = $statement->fetch();
 
 $this->assertEquals(3, $row[0]);
 }
 
 public function testInvokeSelectWithParameters()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp'], 'fetchMode' => PDO::FETCH_ASSOC]);
 
 $statement = $qdb('
 SELECT  *
 FROM    `user_roles`
 WHERE   `id` = ?', [
 2
 ]
 );
 
 $this->assertInstanceOf('PDOStatement', $statement);
 
 $row = $statement->fetch();
 
 $this->assertEquals(2, $row['id']);
 $this->assertEquals('Manager', $row['name']);
 }
 
 public function testInvokeSelectWithNamedParameters()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp'], 'fetchMode' => PDO::FETCH_ASSOC]);
 
 $statement = $qdb('
 SELECT  *
 FROM    `user_roles`
 WHERE   `id` = :id', [
 'id' => 2
 ]
 );
 
 $this->assertInstanceOf('PDOStatement', $statement);
 
 $row = $statement->fetch();
 
 $this->assertEquals(2, $row['id']);
 $this->assertEquals('Manager', $row['name']);
 }
 
 public function testRunInsert()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp']]);
 
 $statement = $qdb->run('
 INSERT  INTO `users` (`id`, `email`, `password_hash`)
 VALUES  (1, \'[email protected]\', \'34896830491683096\'),
 (45, \'[email protected]\', \'9387460918340139684\')');
 
 $this->assertEquals(2, $statement->rowCount());
 }
 
 public function testRunCustomQuery()
 {
 $qdb = new Db([
 'connection' => [
 'path' => 'tests/resources/test.sqlite.temp'
 ],
 'queries' => [
 'selectUserRoleByName' => [
 'sql' => '
 SELECT  *
 FROM    `user_roles`
 WHERE   `name` = :name'
 ]
 ],
 'fetchMode' => PDO::FETCH_ASSOC,
 ]);
 
 $statement = $qdb->selectUserRoleByName(['name' => 'Manager']);
 
 $row = $statement->fetch();
 
 $this->assertEquals(2, $row['id']);
 $this->assertEquals('Manager', $row['name']);
 
 $this->assertFalse($statement->fetch());
 }
 
 public function testRunCustomQueryNotDeclared()
 {
 $qdb = new Db([
 'connection' => [
 'path' => 'tests/resources/test.sqlite.temp'
 ],
 'queries' => [
 ],
 'fetchMode' => PDO::FETCH_ASSOC,
 ]);
 
 $this->expectException(BadMethodCallException::class);
 
 $qdb->selectUserRoleByName(['name' => 'Manager']);
 }
 
 public function testId()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp']]);
 
 $qdb->run('
 INSERT  INTO `users` (`id`, `email`, `password_hash`)
 VALUES  (45, \'[email protected]\', \'9387460918340139684\')');
 
 $this->assertEquals(45, $qdb->id());
 }
 
 public function testTrans()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp']]);
 
 $qdb->trans(function() use($qdb) {
 $qdb->run('
 INSERT  INTO `users` (`id`, `email`, `password_hash`)
 VALUES  (45, \'[email protected]\', \'9387460918340139684\')');
 });
 
 $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 45')->fetch(PDO::FETCH_ASSOC);
 
 $this->assertNotNull($row);
 $this->assertEquals(45, $row['id']);
 $this->assertEquals('[email protected]', $row['email']);
 }
 
 public function testTransFailed()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp']]);
 
 $this->expectException(Exception::class);
 
 $qdb->trans(function() use($qdb) {
 $qdb->run('
 INSERT  INTO `users` (`id`, `email`, `password_hash`)
 VALUES  (45, \'[email protected]\', \'9387460918340139684\')');
 
 throw new Exception();
 
 $qdb->run('
 INSERT  INTO `users` (`id`, `email`, `password_hash`)
 VALUES  (7, \'[email protected]\', \'124284\')');
 });
 
 $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 7')->fetch(PDO::FETCH_ASSOC);
 $this->assertNull($row);
 
 $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 45')->fetch(PDO::FETCH_ASSOC);
 $this->assertNull($row);
 }
 
 public function testTransNotCallable()
 {
 $qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp']]);
 
 $this->expectException(InvalidArgumentException::class);
 
 $qdb->trans(123);
 }
 }
 
 
 |