aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/phpunit-pgsql.xml11
-rw-r--r--tests/phpunit.xml.dist11
-rwxr-xr-xtests/travis/prepare_mysql.sh12
-rwxr-xr-xtests/travis/prepare_pgsql.sh13
-rw-r--r--tests/unit/DatabaseTestCase.php68
-rw-r--r--tests/unit/includes/dba/DBATest.php67
-rw-r--r--tests/unit/includes/dba/_files/account.yml9
-rw-r--r--tests/unit/includes/dba/dba_pdoTest.php189
8 files changed, 370 insertions, 10 deletions
diff --git a/tests/phpunit-pgsql.xml b/tests/phpunit-pgsql.xml
index ec4a6fc2d..078056d56 100644
--- a/tests/phpunit-pgsql.xml
+++ b/tests/phpunit-pgsql.xml
@@ -32,4 +32,15 @@
highLowerBound="70"/>
<log type="testdox-text" target="./results/testdox.txt"/>
</logging>
+ <php>
+ <!-- Default test database config, only used if no environment variables
+ with same names are set.
+ !!! Never run against a real database, it will truncate all tables -->
+ <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="travis_hz"/>
+ <env name="hz_db_pass" value="hubzilla"/>
+ <env name="hz_db_database" value="travis_hubzilla"/>
+ </php>
</phpunit>
diff --git a/tests/phpunit.xml.dist b/tests/phpunit.xml.dist
index a22317b08..97c84fb81 100644
--- a/tests/phpunit.xml.dist
+++ b/tests/phpunit.xml.dist
@@ -35,4 +35,15 @@
highLowerBound="70"/>
<log type="testdox-text" target="./results/testdox.txt"/>
</logging>
+ <php>
+ <!-- Default test database config, only used if no environment variables
+ with same names are set.
+ !!! Never run against a real database, it will truncate all tables -->
+ <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="travis_hz"/>
+ <env name="hz_db_pass" value="hubzilla"/>
+ <env name="hz_db_database" value="travis_hubzilla"/>
+ </php>
</phpunit>
diff --git a/tests/travis/prepare_mysql.sh b/tests/travis/prepare_mysql.sh
index 095ad7e25..5b1c96d78 100755
--- a/tests/travis/prepare_mysql.sh
+++ b/tests/travis/prepare_mysql.sh
@@ -25,7 +25,7 @@
# Exit if anything fails
set -e
-echo "Preparing for MySQL ..."
+echo "Preparing for MySQL/MariaDB ..."
if [[ "$MYSQL_VERSION" == "5.7" ]]; then
echo "Using MySQL 5.7 in Docker container, need to use TCP"
@@ -41,13 +41,13 @@ mysql $PROTO -e "SHOW VARIABLES LIKE 'character_set%';"
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 DATABASE IF NOT EXISTS travis_hubzilla;";
+mysql $PROTO -u root -e "CREATE USER 'travis_hz'@'%' IDENTIFIED BY 'hubzilla';"
+mysql $PROTO -u root -e "GRANT ALL ON travis_hubzilla.* TO 'travis_hz'@'%';"
# Import table structure
-mysql $PROTO -u root hubzilla < ./install/schema_mysql.sql
+mysql $PROTO -u root travis_hubzilla < ./install/schema_mysql.sql
# Show databases and tables
mysql $PROTO -u root -e "SHOW DATABASES;"
-mysql $PROTO -u root -e "USE hubzilla; SHOW TABLES;"
+mysql $PROTO -u root -e "USE travis_hubzilla; SHOW TABLES;"
diff --git a/tests/travis/prepare_pgsql.sh b/tests/travis/prepare_pgsql.sh
index 63c7388cb..0175b9858 100755
--- a/tests/travis/prepare_pgsql.sh
+++ b/tests/travis/prepare_pgsql.sh
@@ -33,12 +33,17 @@ psql --version
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 -c "DROP DATABASE IF EXISTS travis_hubzilla;"
+psql -U postgres -v ON_ERROR_STOP=1 <<-EOSQL
+ CREATE USER travis_hz WITH PASSWORD 'hubzilla';
+ CREATE DATABASE travis_hubzilla;
+ ALTER DATABASE travis_hubzilla OWNER TO travis_hz;
+ GRANT ALL PRIVILEGES ON DATABASE travis_hubzilla TO travis_hz;
+EOSQL
# Import table structure
-psql -U postgres -v ON_ERROR_STOP=1 hubzilla < ./install/schema_postgres.sql
+psql -U travis_hz -v ON_ERROR_STOP=1 travis_hubzilla < ./install/schema_postgres.sql
# Show databases and tables
psql -U postgres -l
-psql -U postgres -d hubzilla -c "\dt;"
+psql -U postgres -d travis_hubzilla -c "\dt;"
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/DBATest.php b/tests/unit/includes/dba/DBATest.php
new file mode 100644
index 000000000..900d13083
--- /dev/null
+++ b/tests/unit/includes/dba/DBATest.php
@@ -0,0 +1,67 @@
+<?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\UnitTestCase;
+
+// required because of process isolation and no autoloading
+require_once 'include/dba/dba_driver.php';
+
+/**
+ * @brief Unit Test case for include/dba/DBA.php file.
+ *
+ * This test needs process isolation because of static \DBA.
+ * @runTestsInSeparateProcesses
+ */
+class DBATest extends UnitTestCase {
+
+ public function testDbaFactoryMysql() {
+ $this->assertNull(\DBA::$dba);
+
+ $ret = \DBA::dba_factory('server', 'port', 'user', 'pass', 'db', '0');
+ $this->assertInstanceOf('dba_pdo', $ret);
+ $this->assertFalse($ret->connected);
+
+ $this->assertSame('mysql', \DBA::$scheme);
+ $this->assertSame('schema_mysql.sql', \DBA::$install_script);
+ $this->assertSame('0001-01-01 00:00:00', \DBA::$null_date);
+ $this->assertSame('UTC_TIMESTAMP()', \DBA::$utc_now);
+ $this->assertSame('`', \DBA::$tquot);
+ }
+
+ public function testDbaFactoryPostgresql() {
+ $this->assertNull(\DBA::$dba);
+
+ $ret = \DBA::dba_factory('server', 'port', 'user', 'pass', 'db', '1');
+ $this->assertInstanceOf('dba_pdo', $ret);
+ $this->assertFalse($ret->connected);
+
+ $this->assertSame('pgsql', \DBA::$scheme);
+ $this->assertSame('schema_postgres.sql', \DBA::$install_script);
+ $this->assertSame('0001-01-01 00:00:00', \DBA::$null_date);
+ $this->assertSame("now() at time zone 'UTC'", \DBA::$utc_now);
+ $this->assertSame('"', \DBA::$tquot);
+ }
+
+}
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..12e574d42
--- /dev/null
+++ b/tests/unit/includes/dba/dba_pdoTest.php
@@ -0,0 +1,189 @@
+<?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'));
+ }
+
+ /**
+ * @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);
+ }
+
+}