/**
  * Test if callback query log callback is working properly.
  */
 public function testQueryLogCallback()
 {
     $log = [];
     $this->connection->onLogQuery(function ($sql, $execution_time) use(&$log) {
         $log[] = ['sql' => $sql, 'exec_time' => $execution_time];
     });
     $this->connection->execute('SHOW TABLES LIKE ?', 'my_awesome_table_prefix_%');
     $this->assertCount(1, $log);
     $this->assertNotEmpty($log[0]['exec_time']);
     $this->assertEquals("SHOW TABLES LIKE 'my_awesome_table_prefix_%'", $log[0]['sql']);
 }
 /**
  * Set up test environment.
  */
 public function setUp()
 {
     parent::setUp();
     $this->connection = new Connection\MysqliConnection($this->link);
     if ($this->connection->tableExists('writers')) {
         $this->connection->dropTable('writers');
     }
     $create_table = $this->connection->execute("CREATE TABLE `writers` (\n            `id` int(11) NOT NULL AUTO_INCREMENT,\n            `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n            `birthday` date NOT NULL,\n            PRIMARY KEY (`id`)\n            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");
     $this->assertTrue($create_table);
     $this->connection->execute('INSERT INTO `writers` (`name`, `birthday`) VALUES (?, ?), (?, ?), (?, ?)', 'Leo Tolstoy', new DateTime('1828-09-09'), 'Alexander Pushkin', new DateTime('1799-06-06'), 'Fyodor Dostoyevsky', new DateTime('1821-11-11'));
     $this->container = new Container(['dependency' => 'it works!']);
 }
 /**
  * Test if objects are properly created by value stored in a field.
  */
 public function testExecuteLoadObjectFromField()
 {
     // ---------------------------------------------------
     //  Add type field
     // ---------------------------------------------------
     $this->connection->execute('ALTER TABLE `writers` ADD `type` VARCHAR(255)  NULL DEFAULT ? AFTER `id`;', '\\ActiveCollab\\DatabaseConnection\\Test\\Fixture\\Writer');
     $this->assertEquals(['id' => 1, 'type' => '\\ActiveCollab\\DatabaseConnection\\Test\\Fixture\\Writer', 'name' => 'Leo Tolstoy', 'birthday' => '1828-09-09'], $this->connection->executeFirstRow('SELECT * FROM `writers` WHERE `id` = ?', 1));
     // ---------------------------------------------------
     //  Use type field to know which objects to create
     // ---------------------------------------------------
     $result = $this->connection->advancedExecute('SELECT * FROM `writers` ORDER BY `id`', null, ConnectionInterface::LOAD_ALL_ROWS, ConnectionInterface::RETURN_OBJECT_BY_FIELD, 'type');
     $this->assertInstanceOf('\\ActiveCollab\\DatabaseConnection\\Result\\Result', $result);
     $this->assertCount(3, $result);
     /** @var \ActiveCollab\DatabaseConnection\Test\Fixture\Writer[] $writers */
     $writers = [];
     foreach ($result as $row) {
         $writers[] = $row;
     }
     $this->assertCount(3, $writers);
     $this->assertInstanceOf('ActiveCollab\\DatabaseConnection\\Test\\Fixture\\Writer', $writers[0]);
     $this->assertEquals(1, $writers[0]->getId());
     $this->assertEquals('Leo Tolstoy', $writers[0]->getName());
     $this->assertEquals('1828-09-09', $writers[0]->getBirthday()->format('Y-m-d'));
     $this->assertInstanceOf('ActiveCollab\\DatabaseConnection\\Test\\Fixture\\Writer', $writers[1]);
     $this->assertEquals(2, $writers[1]->getId());
     $this->assertEquals('Alexander Pushkin', $writers[1]->getName());
     $this->assertEquals('1799-06-06', $writers[1]->getBirthday()->format('Y-m-d'));
     $this->assertInstanceOf('ActiveCollab\\DatabaseConnection\\Test\\Fixture\\Writer', $writers[2]);
     $this->assertEquals(3, $writers[2]->getId());
     $this->assertEquals('Fyodor Dostoyevsky', $writers[2]->getName());
     $this->assertEquals('1821-11-11', $writers[2]->getBirthday()->format('Y-m-d'));
 }
 /**
  * Test error in transcation callback.
  */
 public function testErrorInTransactionCallback()
 {
     $this->assertEquals(3, $this->connection->executeFirstCell('SELECT COUNT(`id`) AS "row_count" FROM `writers`'));
     /** @var Exception $exception_caught */
     $exception_caught = false;
     $this->connection->transact(function () {
         $this->connection->execute('INSERT INTO `writers` (`name`, `birthday`) VALUES (?, ?)', 'Anton Chekhov', new DateTime('1860-01-29'));
         throw new RuntimeException('Throwing an exception here');
     }, null, function (Exception $e) use(&$exception_caught) {
         $exception_caught = $e;
     });
     $this->assertInstanceOf('\\RuntimeException', $exception_caught);
     $this->assertEquals('Throwing an exception here', $exception_caught->getMessage());
     $this->assertEquals(3, $this->connection->executeFirstCell('SELECT COUNT(`id`) AS "row_count" FROM `writers`'));
 }
 /**
  * Test execute.
  */
 public function testExecuteWithCustomCaster()
 {
     $result = $this->connection->execute('SELECT * FROM `writers` ORDER BY `id`');
     $this->assertInstanceOf('\\ActiveCollab\\DatabaseConnection\\Result\\Result', $result);
     $this->assertCount(3, $result);
     $caster = new ValueCaster(['id' => ValueCaster::CAST_STRING, 'birthday' => ValueCaster::CAST_DATE]);
     $this->assertEquals(ValueCaster::CAST_STRING, $caster->getTypeByFieldName('id'));
     $this->assertEquals(ValueCaster::CAST_DATE, $caster->getTypeByFieldName('birthday'));
     $result->setValueCaster($caster);
     $writers = [];
     foreach ($result as $row) {
         $writers[] = $row;
     }
     $this->assertCount(3, $writers);
     $this->assertSame('1', $writers[0]['id']);
     $this->assertSame('Leo Tolstoy', $writers[0]['name']);
     $this->assertSame('1828-09-09', $writers[0]['birthday']->format('Y-m-d'));
     $this->assertSame('2', $writers[1]['id']);
     $this->assertSame('Alexander Pushkin', $writers[1]['name']);
     $this->assertSame('1799-06-06', $writers[1]['birthday']->format('Y-m-d'));
     $this->assertSame('3', $writers[2]['id']);
     $this->assertSame('Fyodor Dostoyevsky', $writers[2]['name']);
     $this->assertSame('1821-11-11', $writers[2]['birthday']->format('Y-m-d'));
 }
 /**
  * Test batch replace.
  */
 public function testBatchReplace()
 {
     $this->connection->execute('ALTER TABLE `writers` ADD UNIQUE INDEX `name` (`name`);');
     $batch_insert = $this->connection->batchInsert('writers', ['name', 'birthday'], 3);
     $batch_insert->insert('Leo Tolstoy', new DateTime('1828-09-09'));
     $batch_insert->insert('Alexander Pushkin', new DateTime('1799-06-06'));
     $batch_insert->insert('Fyodor Dostoyevsky', new DateTime('1821-11-11'));
     $batch_insert->done();
     $this->assertEquals(3, $this->connection->executeFirstCell('SELECT COUNT(`id`) AS "row_count" FROM `writers`'));
     $this->assertEquals(1, $this->connection->executeFirstCell('SELECT `id` FROM `writers` WHERE `name` = ?', 'Leo Tolstoy'));
     $this->assertEquals(2, $this->connection->executeFirstCell('SELECT `id` FROM `writers` WHERE `name` = ?', 'Alexander Pushkin'));
     $this->assertEquals(3, $this->connection->executeFirstCell('SELECT `id` FROM `writers` WHERE `name` = ?', 'Fyodor Dostoyevsky'));
     $batch_replace = $this->connection->batchInsert('writers', ['name', 'birthday'], 3, ConnectionInterface::REPLACE);
     $batch_replace->insert('Leo Tolstoy', new DateTime('1828-09-09'));
     $batch_replace->insert('Alexander Pushkin', new DateTime('1799-06-06'));
     $batch_replace->insert('Fyodor Dostoyevsky', new DateTime('1821-11-11'));
     $batch_replace->done();
     $this->assertEquals(3, $this->connection->executeFirstCell('SELECT COUNT(`id`) AS "row_count" FROM `writers`'));
     $this->assertEquals(4, $this->connection->executeFirstCell('SELECT `id` FROM `writers` WHERE `name` = ?', 'Leo Tolstoy'));
     $this->assertEquals(5, $this->connection->executeFirstCell('SELECT `id` FROM `writers` WHERE `name` = ?', 'Alexander Pushkin'));
     $this->assertEquals(6, $this->connection->executeFirstCell('SELECT `id` FROM `writers` WHERE `name` = ?', 'Fyodor Dostoyevsky'));
 }
 /**
  * Test if last insert ID returns correct value.
  */
 public function testInsertId()
 {
     $this->connection->execute('INSERT INTO `writers` (`name`, `birthday`) VALUES (?, ?)', 'Anton Chekhov', new DateTime('1860-01-29'));
     $this->assertEquals(4, $this->connection->lastInsertId());
 }
 /**
  * Tear down the test environment.
  */
 public function tearDown()
 {
     $this->connection->execute('DROP TABLE IF EXISTS `writers`');
     parent::tearDown();
 }