aboutsummaryrefslogtreecommitdiffstats
path: root/tests/unit/UnitTestCase.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/UnitTestCase.php')
-rw-r--r--tests/unit/UnitTestCase.php95
1 files changed, 93 insertions, 2 deletions
diff --git a/tests/unit/UnitTestCase.php b/tests/unit/UnitTestCase.php
index f6fb28555..2ef414cb5 100644
--- a/tests/unit/UnitTestCase.php
+++ b/tests/unit/UnitTestCase.php
@@ -23,12 +23,14 @@
namespace Zotlabs\Tests\Unit;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Yaml\Yaml;
/*
* Make sure global constants and the global App object is available to the
* tests.
*/
require_once __DIR__ . '/../../boot.php';
+require_once 'include/dba/dba_driver.php' ;
/**
* @brief Base class for our Unit Tests.
@@ -39,6 +41,95 @@ require_once __DIR__ . '/../../boot.php';
*
* @author Klaus Weidenbach
*/
-abstract class UnitTestCase extends TestCase {
- // when needed we can define functionality here which is used in UnitTests.
+class UnitTestCase extends TestCase {
+ private bool $in_transaction = false;
+ protected array $fixtures = array();
+
+ public static function setUpBeforeClass() : void {
+ if ( !\DBA::$dba ) {
+ \DBA::dba_factory(
+ getenv('HZ_TEST_DB_HOST') ?: 'db',
+
+ // Use default port for db type if none specified
+ getenv('HZ_TEST_DB_PORT'),
+ getenv('HZ_TEST_DB_USER') ?: 'test_user',
+ getenv('HZ_TEST_DB_PASS') ?: 'hubzilla',
+ getenv('HZ_TEST_DB_DATABASE') ?: 'hubzilla_test_db',
+ Self::dbtype(getenv('HZ_TEST_DB_TYPE')),
+ getenv('HZ_TEST_DB_CHARSET') ?: 'UTF8',
+ false);
+
+ if ( !\DBA::$dba->connected ) {
+ $msg = "Unable to connect to db! ";
+ if(file_exists('dbfail.out')) {
+ $msg .= file_get_contents('dbfail.out');
+ }
+
+ throw new \Exception($msg);
+ }
+
+ \DBA::$dba->dbg(true);
+ }
+ }
+
+ protected function setUp() : void {
+ if ( \DBA::$dba->connected ) {
+ // Create a transaction, so that any actions taken by the
+ // tests does not change the actual contents of the database.
+ $this->in_transaction = \DBA::$dba->db->beginTransaction();
+
+ $this->loadFixtures();
+
+ }
+ }
+
+ protected function tearDown() : void {
+ if ( \DBA::$dba->connected && $this->in_transaction ) {
+ // Roll back the transaction, restoring the db to the
+ // state it was before the test was run.
+ if ( \DBA::$dba->db->rollBack() ) {
+ $this->in_transaction = false;
+ } else {
+ throw new \Exception(
+ "Transaction rollback failed! Error is: "
+ . \DBA::$dba->db->errorInfo());
+ }
+ }
+ }
+
+ private static function dbtype(string $type): int {
+ if (trim(strtolower($type)) === 'postgres') {
+ return DBTYPE_POSTGRES;
+ } else {
+ return DBTYPE_MYSQL;
+ }
+ }
+
+ private function loadFixtures() : void {
+ $files = glob(__DIR__ . '/includes/dba/_files/*.yml');
+ if ($files === false || empty($files)) {
+ error_log('[-] ' . __METHOD__ . ': No fixtures found! :(');
+ }
+ array_walk($files, fn($file) => $this->loadFixture($file));
+ }
+
+ private function loadFixture($file) : void {
+ $table_name = basename($file, '.yml');
+ $this->fixtures[$table_name] = Yaml::parseFile($file)[$table_name];
+
+ //echo "\n[*] Loaded fixture '{$table_name}':\n";
+ // . print_r($this->fixtures[$table_name], true)
+ // . PHP_EOL;
+
+ foreach ($this->fixtures[$table_name] as $entry) {
+ $query = 'INSERT INTO ' . dbesc($table_name) . '('
+ . implode(',', array_keys($entry))
+ . ') VALUES('
+ . implode(',', array_map(fn($val) => "'{$val}'", array_values($entry)))
+ . ')';
+
+ //print_r($query);
+ q($query);
+ }
+ }
}