<?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 queasy\db\Db;
use queasy\db\DbException;
class FieldTest extends TestCase
{
    private $qdb;
    private $pdo;
    public function setUp(): void
    {
        $this->qdb = new Db(['connection' => ['path' => 'tests/resources/test.sqlite.temp'], 'fetchMode' => Db::FETCH_ASSOC]);
        $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 testSelect()
    {
        $roles = $this->qdb->user_roles->id->select(2);
        $this->assertIsArray($roles);
        $this->assertIsArray($roles[0]);
        $this->assertEquals('Manager', $roles[0]['name']);
    }
    public function testSelectMultiple()
    {
        $roles = $this->qdb->user_roles->id->select([2, 3]);
        $this->assertIsArray($roles);
        $this->assertCount(2, $roles);
        $this->assertEquals('Manager', $roles[0]['name']);
    }
    public function testGetRecord()
    {
        $role = $this->qdb->user_roles->id[2];
        $this->assertIsArray($role);
        $this->assertEquals('Manager', $role['name']);
    }
    public function testGetRecords()
    {
        $roles = $this->qdb->user_roles->id[[2, 3]];
        $this->assertCount(2, $roles);
        $this->assertEquals('Manager', $roles[0]['name']);
        $this->assertEquals('User', $roles[1]['name']);
    }
    public function testGetRecordInvoke()
    {
        $roles = $this->qdb->user_roles->id(2);
        $this->assertIsArray($roles);
        $this->assertEquals('Manager', $roles[0]['name']);
    }
    public function testDeleteAssignNull()
    {
        $this->pdo->exec('INSERT INTO `users` VALUES (7, \'
[email protected]\', \'7346598173659873\')');
        $row = $this->pdo->query('SELECT count(*) FROM `users`')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(1, array_shift($row));
        $this->qdb->users->id[7] = null;
        $row = $this->pdo->query('SELECT count(*) FROM `users`')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(0, array_shift($row));
    }
    public function testDeleteFunction()
    {
        $this->pdo->exec('INSERT INTO `users` VALUES (7, \'
[email protected]\', \'7346598173659873\')');
        $row = $this->pdo->query('SELECT count(*) FROM `users`')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(1, array_shift($row));
        $rowsCount = $this->qdb->users->id->delete(7);
        $this->assertEquals(1, $rowsCount);
        $row = $this->pdo->query('SELECT count(*) FROM `users`')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(0, array_shift($row));
    }
    public function testDeleteUnset()
    {
        $this->pdo->exec('INSERT INTO `users` VALUES (7, \'
[email protected]\', \'7346598173659873\')');
        unset($this->qdb->users->id[7]);
        $row = $this->pdo->query('SELECT count(*) FROM `users`')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(0, array_shift($row));
    }
    public function testDeleteSomeAssignNull()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (7, \'
[email protected]\', \'7346598173659873\'),
                    (12, \'
[email protected]\', \'2341341421\'),
                    (123, \'
[email protected]\', \'75647454\')');
        $this->qdb->users->id[[7, 123]] = null;
        $rows = $this->pdo->query('SELECT * FROM `users`')->fetchAll(PDO::FETCH_ASSOC);
        $this->assertCount(1, $rows);
        $this->assertEquals(12, $rows[0]['id']);
        $this->assertEquals('
[email protected]', $rows[0]['email']);
        $this->assertEquals('2341341421', $rows[0]['password_hash']);
    }
    public function testDeleteSomeFunction()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (7, \'
[email protected]\', \'7346598173659873\'),
                    (12, \'
[email protected]\', \'2341341421\'),
                    (123, \'
[email protected]\', \'75647454\')');
        $rowsCount = $this->qdb->users->id->delete([7, 123]);
        $this->assertEquals(2, $rowsCount);
        $rows = $this->pdo->query('SELECT * FROM `users`')->fetchAll(PDO::FETCH_ASSOC);
        $this->assertCount(1, $rows);
        $this->assertEquals(12, $rows[0]['id']);
        $this->assertEquals('
[email protected]', $rows[0]['email']);
        $this->assertEquals('2341341421', $rows[0]['password_hash']);
    }
    public function testDeleteSomeFunctionWithNotExistentRecord()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (7, \'
[email protected]\', \'7346598173659873\'),
                    (12, \'
[email protected]\', \'2341341421\'),
                    (123, \'
[email protected]\', \'75647454\')');
        $rowsCount = $this->qdb->users->id->delete([7, 123, 256]);
        $this->assertEquals(2, $rowsCount);
    }
    public function testDeleteSomeUnset()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (7, \'
[email protected]\', \'7346598173659873\'),
                    (12, \'
[email protected]\', \'2341341421\'),
                    (123, \'
[email protected]\', \'75647454\')');
        unset($this->qdb->users->id[[7, 123]]);
        $rows = $this->pdo->query('SELECT * FROM `users`')->fetchAll(PDO::FETCH_ASSOC);
        $this->assertCount(1, $rows);
        $this->assertEquals(12, $rows[0]['id']);
        $this->assertEquals('
[email protected]', $rows[0]['email']);
        $this->assertEquals('2341341421', $rows[0]['password_hash']);
    }
    public function testUpdate()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (7, \'
[email protected]\', \'7346598173659873\'),
                    (12, \'
[email protected]\', \'2341341421\'),
                    (123, \'
[email protected]\', \'75647454\')');
        $this->qdb->users->id[7] = ['password_hash' => 'cbKBLVIWVW'];
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 7')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(7, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('cbKBLVIWVW', $row['password_hash']);
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 123')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(123, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('75647454', $row['password_hash']);
    }
    public function testUpdateFunction()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (7, \'
[email protected]\', \'7346598173659873\'),
                    (12, \'
[email protected]\', \'2341341421\'),
                    (123, \'
[email protected]\', \'75647454\')');
        $rowsCount = $this->qdb->users->id->update(7, ['password_hash' => 'cbKBLVIWVW']);
        $this->assertEquals(1, $rowsCount);
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 7')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(7, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('cbKBLVIWVW', $row['password_hash']);
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 123')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(123, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('75647454', $row['password_hash']);
    }
    public function testUpdateSome()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (7, \'
[email protected]\', \'7346598173659873\'),
                    (12, \'
[email protected]\', \'2341341421\'),
                    (123, \'
[email protected]\', \'75647454\')');
        $this->qdb->users->id[[7, 123]] = ['password_hash' => 'cbKBLVIWVW'];
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 7')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(7, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('cbKBLVIWVW', $row['password_hash']);
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 123')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(123, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('cbKBLVIWVW', $row['password_hash']);
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 12')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(12, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('2341341421', $row['password_hash']);
    }
    public function testUpdateFunctionSome()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (8, \'
[email protected]\', \'73465981736598730\'),
                    (13, \'
[email protected]\', \'23413414210\'),
                    (124, \'
[email protected]\', \'756474540\')');
        $rowsCount = $this->qdb->users->id->update([8, 124], ['password_hash' => 'cbKBLVIWVW0']);
        $this->assertEquals(2, $rowsCount);
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 8')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(8, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('cbKBLVIWVW0', $row['password_hash']);
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 124')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(124, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('cbKBLVIWVW0', $row['password_hash']);
        $row = $this->pdo->query('SELECT * FROM `users` WHERE `id` = 13')->fetch(PDO::FETCH_ASSOC);
        $this->assertEquals(13, $row['id']);
        $this->assertEquals('
[email protected]', $row['email']);
        $this->assertEquals('23413414210', $row['password_hash']);
    }
    public function testUpdateFunctionSomeNotExistent()
    {
        $this->pdo->exec('
            INSERT  INTO `users`
            VALUES  (7, \'
[email protected]\', \'7346598173659873\'),
                    (12, \'
[email protected]\', \'2341341421\'),
                    (123, \'
[email protected]\', \'75647454\')');
        $rowsCount = $this->qdb->users->id->update([7, 123, 17], ['password_hash' => 'cbKBLVIWVW']);
        $this->assertEquals(2, $rowsCount);
    }
    public function testIsset()
    {
        $this->assertTrue(isset($this->qdb->user_roles->id[1]));
        $this->assertTrue(isset($this->qdb->user_roles->id[2]));
        $this->assertTrue(isset($this->qdb->user_roles->id[3]));
        $this->assertFalse(isset($this->qdb->user_roles->id[7]));
    }
}