aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKlaus Weidenbach <Klaus.Weidenbach@gmx.net>2017-12-10 01:29:49 +0100
committerKlaus Weidenbach <Klaus.Weidenbach@gmx.net>2018-01-28 22:56:21 +0100
commitfb111e6d958fdf56352db66e144134241abbacf8 (patch)
treef7331a829ef12589f135af1d69f80be05d64099e
parente177462c901cd29c3e423640a6f538a930c29536 (diff)
downloadvolse-hubzilla-fb111e6d958fdf56352db66e144134241abbacf8.tar.gz
volse-hubzilla-fb111e6d958fdf56352db66e144134241abbacf8.tar.bz2
volse-hubzilla-fb111e6d958fdf56352db66e144134241abbacf8.zip
:white_check_mark: Unit Test for dba_pdo driver class.
-rw-r--r--tests/phpunit-pgsql.xml10
-rw-r--r--tests/phpunit.xml.dist10
-rwxr-xr-xtests/travis/prepare_mysql.sh4
-rwxr-xr-xtests/travis/prepare_pgsql.sh9
-rw-r--r--tests/unit/DatabaseTestCase.php68
-rw-r--r--tests/unit/includes/dba/_files/account.yml9
-rw-r--r--tests/unit/includes/dba/dba_pdoTest.php167
7 files changed, 273 insertions, 4 deletions
diff --git a/tests/phpunit-pgsql.xml b/tests/phpunit-pgsql.xml
index ec4a6fc2d..d95c4897b 100644
--- a/tests/phpunit-pgsql.xml
+++ b/tests/phpunit-pgsql.xml
@@ -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>
diff --git a/tests/phpunit.xml.dist b/tests/phpunit.xml.dist
index a22317b08..7b9c1d563 100644
--- a/tests/phpunit.xml.dist
+++ b/tests/phpunit.xml.dist
@@ -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>
diff --git a/tests/travis/prepare_mysql.sh b/tests/travis/prepare_mysql.sh
index 095ad7e25..9fd79c1ab 100755
--- a/tests/travis/prepare_mysql.sh
+++ b/tests/travis/prepare_mysql.sh
@@ -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
diff --git a/tests/travis/prepare_pgsql.sh b/tests/travis/prepare_pgsql.sh
index 63c7388cb..3c38ef60c 100755
--- a/tests/travis/prepare_pgsql.sh
+++ b/tests/travis/prepare_pgsql.sh
@@ -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
diff --git a/tests/unit/DatabaseTestCase.php b/tests/unit/DatabaseTestCase.php
new file mode 100644
index 000000000..18c1cfb17
--- /dev/null
+++ b/tests/unit/DatabaseTestCase.php
@@ -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;
+ }
+}
diff --git a/tests/unit/includes/dba/_files/account.yml b/tests/unit/includes/dba/_files/account.yml
new file mode 100644
index 000000000..344bdb799
--- /dev/null
+++ b/tests/unit/includes/dba/_files/account.yml
@@ -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"
diff --git a/tests/unit/includes/dba/dba_pdoTest.php b/tests/unit/includes/dba/dba_pdoTest.php
new file mode 100644
index 000000000..ce6e1ffd6
--- /dev/null
+++ b/tests/unit/includes/dba/dba_pdoTest.php
@@ -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'));
+ }
+
+}