Added tests for DB connections DSN.

This commit is contained in:
Dmitry Khomutov 2018-02-28 23:34:07 +07:00
commit 5a76868e0b
No known key found for this signature in database
GPG key ID: EC19426474B37AAC
3 changed files with 77 additions and 21 deletions

View file

@ -7,10 +7,41 @@ class Database extends \PDO
const MYSQL_TYPE = 'mysql';
const POSTGRESQL_TYPE = 'pgsql';
/**
* @var string
*/
protected $type = 'read';
/**
* @var boolean
*/
protected static $initialised = false;
protected static $servers = ['read' => [], 'write' => []];
protected static $connections = ['read' => null, 'write' => null];
protected static $details = [];
/**
* @var array
*/
protected static $servers = [
'read' => [],
'write' => []
];
/**
* @var array
*/
protected static $connections = [
'read' => null,
'write' => null
];
/**
* @var array
*/
protected static $dsn = [
'read' => '',
'write' => ''
];
protected static $details = [];
/**
* @param string $table
@ -34,10 +65,10 @@ 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['driver'] = $settings['type'];
self::$details['db'] = $settings['name'];
self::$details['user'] = $settings['username'];
self::$details['pass'] = $settings['password'];
self::$initialised = true;
}
@ -67,29 +98,30 @@ class Database extends \PDO
// Pull the next server:
$server = array_shift($servers);
$dns = self::$details['type'] . ':host=' . $server['host'];
self::$dsn[$type] = self::$details['driver'] . ':host=' . $server['host'];
if (isset($server['port'])) {
$dns .= ';port=' . (integer)$server['port'];
self::$dsn[$type] .= ';port=' . (integer)$server['port'];
}
$dns .= ';dbname=' . self::$details['db'];
self::$dsn[$type] .= ';dbname=' . self::$details['db'];
$pdoOptions = [
\PDO::ATTR_PERSISTENT => false,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_TIMEOUT => 2,
\PDO::ATTR_PERSISTENT => false,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_TIMEOUT => 2,
];
if (self::MYSQL_TYPE === self::$details['type']) {
if (self::MYSQL_TYPE === self::$details['driver']) {
$pdoOptions[\PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES 'UTF8'";
}
// Try to connect:
try {
$connection = new self(
$dns,
self::$dsn[$type],
self::$details['user'],
self::$details['pass'],
$pdoOptions
);
$connection->setType($type);
} catch (\PDOException $ex) {
$connection = false;
}
@ -119,6 +151,22 @@ class Database extends \PDO
return self::$details;
}
/**
* @return string
*/
public function getDsn()
{
return self::$dsn[$this->type];
}
/**
* @param string $type
*/
public function setType($type)
{
$this->type = $type;
}
public static function reset()
{
self::$connections = ['read' => null, 'write' => null];
@ -133,9 +181,9 @@ class Database extends \PDO
protected function quoteNames($statement)
{
$quote = '';
if (self::MYSQL_TYPE === self::$details['type']) {
if (self::MYSQL_TYPE === self::$details['driver']) {
$quote = '`';
} elseif (self::POSTGRESQL_TYPE === self::$details['type']) {
} elseif (self::POSTGRESQL_TYPE === self::$details['driver']) {
$quote = '"';
}

View file

@ -58,19 +58,21 @@ class DatabaseMysqlTest extends TestCase
self::assertInstanceOf('\b8\Database', $writeConnection);
self::assertInstanceOf('\b8\Database', $readConnection);
$writeDetails = Database::getConnection('write')->getDetails();
$writeDetails = $writeConnection->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();
$readDetails = $readConnection->getDetails();
self::assertTrue(is_array($readDetails));
self::assertEquals(MYSQL_DBNAME, $readDetails['db']);
self::assertEquals(MYSQL_USER, $readDetails['user']);
self::assertEquals(MYSQL_PASSWORD, $readDetails['pass']);
self::assertEquals('mysql:host=localhost;dbname=b8_test', $readConnection->getDsn());
}
public function testGetWriteConnectionWithPort()
@ -108,6 +110,8 @@ class DatabaseMysqlTest extends TestCase
self::assertInstanceOf('\b8\Database', $writeConnection);
self::assertInstanceOf('\b8\Database', $readConnection);
self::assertEquals('mysql:host=localhost;port=3306;dbname=b8_test', $readConnection->getDsn());
}
/**

View file

@ -58,19 +58,21 @@ class DatabasePostgresqlTest extends TestCase
self::assertInstanceOf('\b8\Database', $writeConnection);
self::assertInstanceOf('\b8\Database', $readConnection);
$writeDetails = Database::getConnection('write')->getDetails();
$writeDetails = $writeConnection->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();
$readDetails = $readConnection->getDetails();
self::assertTrue(is_array($readDetails));
self::assertEquals(POSTGRESQL_DBNAME, $readDetails['db']);
self::assertEquals(POSTGRESQL_USER, $readDetails['user']);
self::assertEquals(POSTGRESQL_PASSWORD, $readDetails['pass']);
self::assertEquals('pgsql:host=localhost;dbname=b8_test', $readConnection->getDsn());
}
public function testGetWriteConnectionWithPort()
@ -108,6 +110,8 @@ class DatabasePostgresqlTest extends TestCase
self::assertInstanceOf('\b8\Database', $writeConnection);
self::assertInstanceOf('\b8\Database', $readConnection);
self::assertEquals('pgsql:host=localhost;port=5432;dbname=b8_test', $readConnection->getDsn());
}
/**