diff options
Diffstat (limited to 'tests/unit/UnitTestCase.php')
-rw-r--r-- | tests/unit/UnitTestCase.php | 95 |
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); + } + } } |