✅ Unit Test for dba_pdo driver class.
This commit is contained in:
parent
e177462c90
commit
fb111e6d95
@ -32,4 +32,14 @@
|
||||
highLowerBound="70"/>
|
||||
<log type="testdox-text" target="./results/testdox.txt"/>
|
||||
</logging>
|
||||
<php>
|
||||
<!-- default test database config, only used if no environment variables
|
||||
with same name set -->
|
||||
<env name="hz_db_server" value="127.0.0.1"/>
|
||||
<env name="hz_db_scheme" value="pgsql"/>
|
||||
<env name="hz_db_port" value="5432"/>
|
||||
<env name="hz_db_user" value="hubzilla"/>
|
||||
<env name="hz_db_pass" value="hubzilla"/>
|
||||
<env name="hz_db_database" value="hubzilla"/>
|
||||
</php>
|
||||
</phpunit>
|
||||
|
@ -35,4 +35,14 @@
|
||||
highLowerBound="70"/>
|
||||
<log type="testdox-text" target="./results/testdox.txt"/>
|
||||
</logging>
|
||||
<php>
|
||||
<!-- default test database config, only used if no environment variables
|
||||
with same name set -->
|
||||
<env name="hz_db_server" value="127.0.0.1"/>
|
||||
<env name="hz_db_scheme" value="mysql"/>
|
||||
<env name="hz_db_port" value="3306"/>
|
||||
<env name="hz_db_user" value="hubzilla"/>
|
||||
<env name="hz_db_pass" value="hubzilla"/>
|
||||
<env name="hz_db_database" value="hubzilla"/>
|
||||
</php>
|
||||
</phpunit>
|
||||
|
@ -42,8 +42,8 @@ mysql $PROTO -e "SELECT @@sql_mode;"
|
||||
|
||||
# Create Hubzilla database
|
||||
mysql $PROTO -u root -e "CREATE DATABASE IF NOT EXISTS hubzilla;";
|
||||
mysql $PROTO -u root -e "CREATE USER 'hubzilla'@'localhost' IDENTIFIED BY 'hubzilla';"
|
||||
mysql $PROTO -u root -e "GRANT ALL ON hubzilla.* TO 'hubzilla'@'localhost';"
|
||||
mysql $PROTO -u root -e "CREATE USER 'hubzilla'@'%' IDENTIFIED BY 'hubzilla';"
|
||||
mysql $PROTO -u root -e "GRANT ALL ON hubzilla.* TO 'hubzilla'@'%';"
|
||||
|
||||
# Import table structure
|
||||
mysql $PROTO -u root hubzilla < ./install/schema_mysql.sql
|
||||
|
@ -34,10 +34,15 @@ psql -U postgres -c "SELECT VERSION();"
|
||||
|
||||
# Create Hubzilla database
|
||||
psql -U postgres -c "DROP DATABASE IF EXISTS hubzilla;"
|
||||
psql -U postgres -c "CREATE DATABASE hubzilla;"
|
||||
psql -U postgres -v ON_ERROR_STOP=1 <<-EOSQL
|
||||
CREATE USER hubzilla WITH PASSWORD 'hubzilla';
|
||||
CREATE DATABASE hubzilla;
|
||||
ALTER DATABASE hubzilla OWNER TO hubzilla;
|
||||
GRANT ALL PRIVILEGES ON DATABASE hubzilla TO hubzilla;
|
||||
EOSQL
|
||||
|
||||
# Import table structure
|
||||
psql -U postgres -v ON_ERROR_STOP=1 hubzilla < ./install/schema_postgres.sql
|
||||
psql -U hubzilla -v ON_ERROR_STOP=1 hubzilla < ./install/schema_postgres.sql
|
||||
|
||||
# Show databases and tables
|
||||
psql -U postgres -l
|
||||
|
68
tests/unit/DatabaseTestCase.php
Normal file
68
tests/unit/DatabaseTestCase.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
/* Copyright (c) 2017 Hubzilla
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace Zotlabs\Tests\Unit;
|
||||
|
||||
use PHPUnit\DbUnit\TestCaseTrait;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @brief Base class for our Database Unit Tests.
|
||||
*
|
||||
* @warning Never run these tests against a production database, because all
|
||||
* tables will get truncated and there is no way to recover without a backup.
|
||||
*
|
||||
* @author Klaus Weidenbach
|
||||
*/
|
||||
abstract class DatabaseTestCase extends TestCase {
|
||||
|
||||
use TestCaseTrait;
|
||||
|
||||
/**
|
||||
* Only instantiate PDO once for test clean-up/fixture load.
|
||||
*
|
||||
* @var \PDO
|
||||
*/
|
||||
static private $pdo = null;
|
||||
|
||||
/**
|
||||
* Only instantiate \PHPUnit\DbUnit\Database\Connection once per test.
|
||||
*
|
||||
* @var \PHPUnit\DbUnit\Database\Connection
|
||||
*/
|
||||
private $conn = null;
|
||||
|
||||
|
||||
final public function getConnection() {
|
||||
if ($this->conn === null) {
|
||||
if (self::$pdo === null) {
|
||||
$dsn = \getenv('hz_db_scheme') . ':host=' . \getenv('hz_db_server')
|
||||
. ';port=' . \getenv('hz_db_port') . ';dbname=' . \getenv('hz_db_database');
|
||||
|
||||
self::$pdo = new \PDO($dsn, \getenv('hz_db_user'), \getenv('hz_db_pass'));
|
||||
}
|
||||
$this->conn = $this->createDefaultDBConnection(self::$pdo, \getenv('hz_db_database'));
|
||||
}
|
||||
|
||||
return $this->conn;
|
||||
}
|
||||
}
|
9
tests/unit/includes/dba/_files/account.yml
Normal file
9
tests/unit/includes/dba/_files/account.yml
Normal file
@ -0,0 +1,9 @@
|
||||
account:
|
||||
-
|
||||
account_id: 42
|
||||
account_email: "hubzilla@example.com"
|
||||
account_language: "no"
|
||||
-
|
||||
account_id: 43
|
||||
account_email: "hubzilla@example.org"
|
||||
account_language: "de"
|
167
tests/unit/includes/dba/dba_pdoTest.php
Normal file
167
tests/unit/includes/dba/dba_pdoTest.php
Normal file
@ -0,0 +1,167 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2017 Hubzilla
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace Zotlabs\Tests\Unit\includes;
|
||||
|
||||
use Zotlabs\Tests\Unit\DatabaseTestCase;
|
||||
use PHPUnit\DbUnit\TestCaseTrait;
|
||||
use PHPUnit\DbUnit\DataSet\YamlDataSet;
|
||||
|
||||
require_once 'include/dba/dba_pdo.php';
|
||||
|
||||
/**
|
||||
* @brief Unit Test case for include/dba/dba_pdo.php file.
|
||||
*
|
||||
* Some very basic tests to see if our database layer can connect to a real
|
||||
* database.
|
||||
*/
|
||||
class dba_pdoTest extends DatabaseTestCase {
|
||||
|
||||
use TestCaseTrait;
|
||||
|
||||
/**
|
||||
* @var \dba_driver
|
||||
*/
|
||||
protected $dba;
|
||||
|
||||
|
||||
/**
|
||||
* Set initial state of the database before each test is executed.
|
||||
* Load database fixtures.
|
||||
*
|
||||
* @return \PHPUnit\DbUnit\DataSet\IDataSet
|
||||
*/
|
||||
public function getDataSet() {
|
||||
return new YamlDataSet(dirname(__FILE__) . '/_files/account.yml');
|
||||
}
|
||||
|
||||
protected function setUp() {
|
||||
// Will invoke getDataSet() to load fixtures into DB
|
||||
parent::setUp();
|
||||
|
||||
$this->dba = new \dba_pdo(
|
||||
\getenv('hz_db_server'),
|
||||
\getenv('hz_db_scheme'),
|
||||
\getenv('hz_db_port'),
|
||||
\getenv('hz_db_user'),
|
||||
\getenv('hz_db_pass'),
|
||||
\getenv('hz_db_database')
|
||||
);
|
||||
}
|
||||
protected function assertPreConditions() {
|
||||
$this->assertSame('pdo', $this->dba->getdriver(), "Driver is expected to be 'pdo'.");
|
||||
$this->assertInstanceOf('dba_driver', $this->dba);
|
||||
$this->assertTrue($this->dba->connected, 'Pre condition failed, DB is not connected.');
|
||||
$this->assertInstanceOf('PDO', $this->dba->db);
|
||||
}
|
||||
protected function tearDown() {
|
||||
$this->dba = null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @group mysql
|
||||
*/
|
||||
public function testQuoteintervalOnMysql() {
|
||||
$this->assertSame('value', $this->dba->quote_interval('value'));
|
||||
}
|
||||
/**
|
||||
* @group postgresql
|
||||
*/
|
||||
public function testQuoteintervalOnPostgresql() {
|
||||
$this->assertSame("'value'", $this->dba->quote_interval('value'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @group mysql
|
||||
*/
|
||||
public function testGenerateMysqlConcatSql() {
|
||||
$this->assertSame('GROUP_CONCAT(DISTINCT field SEPARATOR \';\')', $this->dba->concat('field', ';'));
|
||||
$this->assertSame('GROUP_CONCAT(DISTINCT field2 SEPARATOR \' \')', $this->dba->concat('field2', ' '));
|
||||
}
|
||||
/**
|
||||
* @group postgresql
|
||||
*/
|
||||
public function testGeneratePostgresqlConcatSql() {
|
||||
$this->assertSame('string_agg(field,\';\')', $this->dba->concat('field', ';'));
|
||||
$this->assertSame('string_agg(field2,\' \')', $this->dba->concat('field2', ' '));
|
||||
}
|
||||
|
||||
|
||||
public function testConnectToSqlServer() {
|
||||
// connect() is done in dba_pdo constructor which is called in setUp()
|
||||
$this->assertTrue($this->dba->connected);
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testConnectToSqlServer
|
||||
*/
|
||||
public function testCloseSqlServerConnection() {
|
||||
$this->dba->close();
|
||||
|
||||
$this->assertNull($this->dba->db);
|
||||
$this->assertFalse($this->dba->connected);
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testConnectToSqlServer
|
||||
*/
|
||||
public function testSelectQueryShouldReturnArray() {
|
||||
$ret = $this->dba->q('SELECT * FROM account');
|
||||
|
||||
$this->assertTrue(is_array($ret));
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testConnectToSqlServer
|
||||
*/
|
||||
public function testInsertQueryShouldReturnPdostatement() {
|
||||
// Fixture account.yml adds two entries to account table
|
||||
$this->assertEquals(2, $this->getConnection()->getRowCount('account'), 'Pre-Condition');
|
||||
|
||||
$ret = $this->dba->q('INSERT INTO account
|
||||
(account_id, account_email, account_language)
|
||||
VALUES (100, \'insert@example.com\', \'de\')
|
||||
');
|
||||
$this->assertInstanceOf('PDOStatement', $ret);
|
||||
|
||||
$this->assertEquals(3, $this->getConnection()->getRowCount('account'), 'Inserting failed');
|
||||
}
|
||||
|
||||
|
||||
public function testConnectToWrongSqlServer() {
|
||||
$nodba = new \dba_pdo('wrongserver',
|
||||
\getenv('hz_db_scheme'), \getenv('hz_db_port'),
|
||||
\getenv('hz_db_user'), \getenv('hz_db_pass'),
|
||||
\getenv('hz_db_database')
|
||||
);
|
||||
|
||||
$this->assertSame('pdo', $nodba->getdriver());
|
||||
$this->assertInstanceOf('dba_pdo', $nodba);
|
||||
$this->assertFalse($nodba->connected);
|
||||
$this->assertNull($nodba->db);
|
||||
|
||||
$this->assertFalse($nodba->q('SELECT * FROM account'));
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user