190 lines
5.4 KiB
PHP
190 lines
5.4 KiB
PHP
<?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(): void {
|
|
// 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(): void {
|
|
$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'));
|
|
}
|
|
|
|
/**
|
|
* @depends testConnectToSqlServer
|
|
*/
|
|
public function testSelectQueryToNonExistentTableShouldReturnFalse() {
|
|
$ret = $this->dba->q('SELECT * FROM non_existent_table');
|
|
|
|
$this->assertFalse($ret);
|
|
}
|
|
|
|
/**
|
|
* @depends testConnectToSqlServer
|
|
*/
|
|
public function testInsertQueryToNonExistentTableShouldReturnEmptyArray() {
|
|
$ret = $this->dba->q('INSERT INTO non_existent_table
|
|
(account_email, account_language)
|
|
VALUES (\'email@example.com\', \'en\')
|
|
');
|
|
|
|
$this->assertNotInstanceOf('PDOStatement', $ret);
|
|
$this->isEmpty($ret);
|
|
}
|
|
|
|
}
|