From 4cb041e8fb4b9b80109fc5b45c3a7f4484ff1747 Mon Sep 17 00:00:00 2001 From: Dmitry Khomutov Date: Wed, 28 Feb 2018 20:53:21 +0700 Subject: [PATCH] PHPUnit tests improvements. --- bootstrap.php | 14 ++-- phpunit.xml | 12 ++-- src/B8Framework/Database.php | 52 +++++++++------ tests/B8Framework/DatabaseMysqlTest.php | 69 ++++++++++++++++---- tests/B8Framework/DatabasePostgresqlTest.php | 69 ++++++++++++++++---- tests/bootstrap.php | 32 +++------ 6 files changed, 171 insertions(+), 77 deletions(-) diff --git a/bootstrap.php b/bootstrap.php index a74f2dfd..628eb8de 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -1,27 +1,27 @@ - - - - - - + + + + + + diff --git a/src/B8Framework/Database.php b/src/B8Framework/Database.php index eef6c2b9..600dd093 100644 --- a/src/B8Framework/Database.php +++ b/src/B8Framework/Database.php @@ -4,11 +4,13 @@ namespace b8; class Database extends \PDO { + const MYSQL_TYPE = 'mysql'; + const POSTGRESQL_TYPE = 'pgsql'; + protected static $initialised = false; protected static $servers = ['read' => [], 'write' => []]; protected static $connections = ['read' => null, 'write' => null]; protected static $details = []; - protected static $lastUsed = ['read' => null, 'write' => null]; /** * @param string $table @@ -17,7 +19,7 @@ class Database extends \PDO */ public function lastInsertIdExtended($table = null) { - if ($table && $this->getAttribute(self::ATTR_DRIVER_NAME) == 'pgsql') { + if ($table && self::POSTGRESQL_TYPE === $this->getAttribute(self::ATTR_DRIVER_NAME)) { return parent::lastInsertId($table . '_id_seq'); } @@ -31,10 +33,11 @@ class Database extends \PDO self::$servers['read'] = $settings['servers']['read']; self::$servers['write'] = $settings['servers']['write']; - self::$details['type'] = $settings['type']; - self::$details['db'] = $settings['name']; - self::$details['user'] = $settings['username']; - self::$details['pass'] = $settings['password']; + + self::$details['type'] = $settings['type']; + self::$details['db'] = $settings['name']; + self::$details['user'] = $settings['username']; + self::$details['pass'] = $settings['password']; self::$initialised = true; } @@ -52,11 +55,6 @@ class Database extends \PDO self::init(); } - // If the connection hasn't been used for 5 minutes, force a reconnection: - if (!is_null(self::$lastUsed[$type]) && (time() - self::$lastUsed[$type]) > 300) { - self::$connections[$type] = null; - } - if (is_null(self::$connections[$type])) { // Shuffle, so we pick a random server: $servers = self::$servers[$type]; @@ -80,7 +78,7 @@ class Database extends \PDO \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_TIMEOUT => 2, ]; - if ('mysql' === self::$details['type']) { + if (self::MYSQL_TYPE === self::$details['type']) { $pdoOptions[\PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES 'UTF8'"; } @@ -110,11 +108,12 @@ class Database extends \PDO self::$connections[$type] = $connection; } - self::$lastUsed[$type] = time(); - return self::$connections[$type]; } + /** + * @return array + */ public function getDetails() { return self::$details; @@ -123,21 +122,34 @@ class Database extends \PDO public static function reset() { self::$connections = ['read' => null, 'write' => null]; - self::$lastUsed = ['read' => null, 'write' => null]; self::$initialised = false; } - public function prepareCommon($statement, array $driver_options = []) + /** + * @param string $statement + * + * @return string + */ + protected function quoteNames($statement) { $quote = ''; - if ('mysql' === self::$details['type']) { + if (self::MYSQL_TYPE === self::$details['type']) { $quote = '`'; - } elseif ('pgsql' === self::$details['type']) { + } elseif (self::POSTGRESQL_TYPE === self::$details['type']) { $quote = '"'; } - $statement = preg_replace('/{{(.*?)}}/', ($quote . '\1' . $quote), $statement); + return preg_replace('/{{(.*?)}}/', ($quote . '\1' . $quote), $statement); + } - return parent::prepare($statement, $driver_options); + /** + * @param string $statement + * @param array $driver_options + * + * @return \PDOStatement + */ + public function prepareCommon($statement, array $driver_options = []) + { + return parent::prepare($this->quoteNames($statement), $driver_options); } } diff --git a/tests/B8Framework/DatabaseMysqlTest.php b/tests/B8Framework/DatabaseMysqlTest.php index be649d9f..9802abab 100755 --- a/tests/B8Framework/DatabaseMysqlTest.php +++ b/tests/B8Framework/DatabaseMysqlTest.php @@ -21,7 +21,7 @@ class DatabaseMysqlTest extends TestCase ['host' => 'localhost'], ], ], - 'type' => 'mysql', + 'type' => Database::MYSQL_TYPE, 'name' => MYSQL_DBNAME, 'username' => MYSQL_USER, 'password' => MYSQL_PASSWORD, @@ -33,6 +33,10 @@ class DatabaseMysqlTest extends TestCase protected function checkDatabaseConnection() { + if (!extension_loaded('mysqli')) { + $this->markTestSkipped('Test skipped because Mysqli extension doesn`t exist.'); + } + try { $connection = Database::getConnection('read'); } catch (\Exception $e) { @@ -44,23 +48,66 @@ class DatabaseMysqlTest extends TestCase } } - public function testGetWriteConnection() + public function testGetConnection() { $this->checkDatabaseConnection(); - $connection = Database::getConnection('write'); - self::assertInstanceOf('\b8\Database', $connection); + $writeConnection = Database::getConnection('write'); + $readConnection = Database::getConnection('read'); + + self::assertInstanceOf('\b8\Database', $writeConnection); + self::assertInstanceOf('\b8\Database', $readConnection); + + $writeDetails = Database::getConnection('write')->getDetails(); + + self::assertTrue(is_array($writeDetails)); + self::assertEquals(MYSQL_DBNAME, $writeDetails['db']); + self::assertEquals(MYSQL_USER, $writeDetails['user']); + self::assertEquals(MYSQL_PASSWORD, $writeDetails['pass']); + + $readDetails = Database::getConnection('read')->getDetails(); + + self::assertTrue(is_array($readDetails)); + self::assertEquals(MYSQL_DBNAME, $readDetails['db']); + self::assertEquals(MYSQL_USER, $readDetails['user']); + self::assertEquals(MYSQL_PASSWORD, $readDetails['pass']); } - public function testGetDetails() + public function testGetWriteConnectionWithPort() { + $config = new Config([ + 'b8' => [ + 'database' => [ + 'servers' => [ + 'read' => [ + [ + 'host' => 'localhost', + 'port' => 3306, + ], + ], + 'write' => [ + [ + 'host' => 'localhost', + 'port' => 3306, + ], + ], + ], + 'type' => Database::MYSQL_TYPE, + 'name' => MYSQL_DBNAME, + 'username' => MYSQL_USER, + 'password' => MYSQL_PASSWORD, + ], + ], + ]); + Database::reset(); + $this->checkDatabaseConnection(); - $details = Database::getConnection('read')->getDetails(); - self::assertTrue(is_array($details)); - self::assertTrue(($details['db'] === MYSQL_DBNAME)); - self::assertTrue(($details['user'] === MYSQL_USER)); - self::assertTrue(($details['pass'] === MYSQL_PASSWORD)); + $writeConnection = Database::getConnection('write'); + $readConnection = Database::getConnection('read'); + + self::assertInstanceOf('\b8\Database', $writeConnection); + self::assertInstanceOf('\b8\Database', $readConnection); } /** @@ -83,7 +130,7 @@ class DatabaseMysqlTest extends TestCase ['host' => 'localhost'], ], ], - 'type' => 'mysql', + 'type' => Database::MYSQL_TYPE, 'name' => 'b8_test_2', 'username' => '', 'password' => '', diff --git a/tests/B8Framework/DatabasePostgresqlTest.php b/tests/B8Framework/DatabasePostgresqlTest.php index 5e7c1fde..b5c88166 100755 --- a/tests/B8Framework/DatabasePostgresqlTest.php +++ b/tests/B8Framework/DatabasePostgresqlTest.php @@ -21,7 +21,7 @@ class DatabasePostgresqlTest extends TestCase ['host' => 'localhost'], ], ], - 'type' => 'pgsql', + 'type' => Database::POSTGRESQL_TYPE, 'name' => POSTGRESQL_DBNAME, 'username' => POSTGRESQL_USER, 'password' => POSTGRESQL_PASSWORD, @@ -33,6 +33,10 @@ class DatabasePostgresqlTest extends TestCase protected function checkDatabaseConnection() { + if (!extension_loaded('pgsql')) { + $this->markTestSkipped('Test skipped because Pgsql extension doesn`t exist.'); + } + try { $connection = Database::getConnection('read'); } catch (\Exception $e) { @@ -44,23 +48,66 @@ class DatabasePostgresqlTest extends TestCase } } - public function testGetWriteConnection() + public function testGetConnection() { $this->checkDatabaseConnection(); - $connection = Database::getConnection('write'); - self::assertInstanceOf('\b8\Database', $connection); + $writeConnection = Database::getConnection('write'); + $readConnection = Database::getConnection('read'); + + self::assertInstanceOf('\b8\Database', $writeConnection); + self::assertInstanceOf('\b8\Database', $readConnection); + + $writeDetails = Database::getConnection('write')->getDetails(); + + self::assertTrue(is_array($writeDetails)); + self::assertEquals(POSTGRESQL_DBNAME, $writeDetails['db']); + self::assertEquals(POSTGRESQL_USER, $writeDetails['user']); + self::assertEquals(POSTGRESQL_PASSWORD, $writeDetails['pass']); + + $readDetails = Database::getConnection('read')->getDetails(); + + self::assertTrue(is_array($readDetails)); + self::assertEquals(POSTGRESQL_DBNAME, $readDetails['db']); + self::assertEquals(POSTGRESQL_USER, $readDetails['user']); + self::assertEquals(POSTGRESQL_PASSWORD, $readDetails['pass']); } - public function testGetDetails() + public function testGetWriteConnectionWithPort() { + $config = new Config([ + 'b8' => [ + 'database' => [ + 'servers' => [ + 'read' => [ + [ + 'host' => 'localhost', + 'port' => 5432, + ], + ], + 'write' => [ + [ + 'host' => 'localhost', + 'port' => 5432, + ], + ], + ], + 'type' => Database::POSTGRESQL_TYPE, + 'name' => POSTGRESQL_DBNAME, + 'username' => POSTGRESQL_USER, + 'password' => POSTGRESQL_PASSWORD, + ], + ], + ]); + Database::reset(); + $this->checkDatabaseConnection(); - $details = Database::getConnection('read')->getDetails(); - self::assertTrue(is_array($details)); - self::assertTrue(($details['db'] === POSTGRESQL_DBNAME)); - self::assertTrue(($details['user'] === POSTGRESQL_USER)); - self::assertTrue(($details['pass'] === POSTGRESQL_PASSWORD)); + $writeConnection = Database::getConnection('write'); + $readConnection = Database::getConnection('read'); + + self::assertInstanceOf('\b8\Database', $writeConnection); + self::assertInstanceOf('\b8\Database', $readConnection); } /** @@ -83,7 +130,7 @@ class DatabasePostgresqlTest extends TestCase ['host' => 'localhost'], ], ], - 'type' => 'pgsql', + 'type' => Database::POSTGRESQL_TYPE, 'name' => 'b8_test_2', 'username' => '', 'password' => '', diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 85a5c392..113bf8bf 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,54 +1,42 @@ loadYaml($configFile); -} - if (!defined('APP_URL') && !empty($config)) { define('APP_URL', $config->get('php-censor.url', '') . '/'); } -\PHPCensor\Helper\Lang::init($config, 'en'); - -define('MYSQL_DBNAME', getenv('MYSQL_DBNAME')); -define('MYSQL_USER', getenv('MYSQL_USER')); -define('MYSQL_PASSWORD', getenv('MYSQL_PASSWORD')); - -define('POSTGRESQL_DBNAME', getenv('POSTGRESQL_DBNAME')); -define('POSTGRESQL_USER', getenv('POSTGRESQL_USER')); -define('POSTGRESQL_PASSWORD', getenv('POSTGRESQL_PASSWORD')); +\PHPCensor\Helper\Lang::init($config);