aboutsummaryrefslogtreecommitdiffstats
path: root/tests/unit
diff options
context:
space:
mode:
authorMario <mario@mariovavti.com>2024-01-06 16:34:39 +0000
committerMario <mario@mariovavti.com>2024-01-06 16:34:39 +0000
commita36de8ba1a27204667413760c53f783ba60f22a7 (patch)
treefa219c32ebe5d8cad86dccc6b26b04ed6c22145b /tests/unit
parentc73518d8ec562aed63223c668a43d9cda152cb9d (diff)
parente3d30763dabdf12f961ed3d1d7cf4eaee44c65a9 (diff)
downloadvolse-hubzilla-a36de8ba1a27204667413760c53f783ba60f22a7.tar.gz
volse-hubzilla-a36de8ba1a27204667413760c53f783ba60f22a7.tar.bz2
volse-hubzilla-a36de8ba1a27204667413760c53f783ba60f22a7.zip
Merge branch 'tests/fix-db-and-ci-integration' into 'dev'
tests: Integrate the DB in "unit" tests. See merge request hubzilla/core!2081
Diffstat (limited to 'tests/unit')
-rw-r--r--tests/unit/GetTagsTest.php5
-rw-r--r--tests/unit/Lib/PermissionDescriptionTest.php47
-rw-r--r--tests/unit/UnitTestCase.php95
-rw-r--r--tests/unit/Web/HttpSigTest.php7
-rw-r--r--tests/unit/includes/AccountTest.php12
-rw-r--r--tests/unit/includes/PhotodriverTest.php28
6 files changed, 160 insertions, 34 deletions
diff --git a/tests/unit/GetTagsTest.php b/tests/unit/GetTagsTest.php
index 418d32c47..ccb88080e 100644
--- a/tests/unit/GetTagsTest.php
+++ b/tests/unit/GetTagsTest.php
@@ -26,6 +26,7 @@ class MockApp {
*
* @param string $sql
*/
+/*
function q($sql) {
$result=array(array('id'=>15,
'attag'=>'', 'network'=>'dfrn',
@@ -55,7 +56,7 @@ function q($sql) {
return $result;
}
}
-
+*/
/**
* Replacement for dbesc.
* I don't want to test dbesc here, so
@@ -68,9 +69,11 @@ function q($sql) {
*
* @return input
*/
+/*
function dbesc($str) {
return $str;
}
+*/
/**
* TestCase for tag handling.
diff --git a/tests/unit/Lib/PermissionDescriptionTest.php b/tests/unit/Lib/PermissionDescriptionTest.php
index 96c381d0c..fdd676f61 100644
--- a/tests/unit/Lib/PermissionDescriptionTest.php
+++ b/tests/unit/Lib/PermissionDescriptionTest.php
@@ -63,11 +63,52 @@ class PermissionDescriptionTest extends UnitTestCase {
$this->assertNotNull($permDescSelf);
}
+ /**
+ * Test fetching permission descriptions for the current channel.
+ */
public function testFromGlobalPermission() {
- //$permDesc = PermissionDescription::fromGlobalPermission('view_profile');
+ // Initiate the global App with a channel_id
+ \App::$channel = array(
+ 'channel_id' => 42,
+ );
+
+ // Make sure the requested permission is set for this channel.
+ \Zotlabs\Access\PermissionLimits::Set(
+ \App::$channel['channel_id'],
+ 'view_profile',
+ PERMS_NETWORK
+ );
+
+ \Zotlabs\Access\PermissionLimits::Set(
+ \App::$channel['channel_id'],
+ 'write_storage',
+ PERMS_SPECIFIC
+ );
+
+ // Set an invalid(?) permission
+ \Zotlabs\Access\PermissionLimits::Set(
+ \App::$channel['channel_id'],
+ 'view_wiki',
+ 1337
+ );
+
+ $permDesc = PermissionDescription::fromGlobalPermission('view_profile');
+ $this->assertEquals(
+ 'Anybody in the Hubzilla network',
+ $permDesc->get_permission_description()
+ );
+
+ $permDesc = PermissionDescription::fromGlobalPermission('write_storage');
+ $this->assertEquals(
+ 'Only connections I specifically allow',
+ $permDesc->get_permission_description()
+ );
- $this->markTestIncomplete(
- 'The method fromGlobalPermission() is not yet testable ...'
+ // Permissions we don't know about will get the fallback description.
+ $permDesc = PermissionDescription::fromGlobalPermission('view_wiki');
+ $this->assertEquals(
+ 'Visible to your default audience',
+ $permDesc->get_permission_description()
);
}
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);
+ }
+ }
}
diff --git a/tests/unit/Web/HttpSigTest.php b/tests/unit/Web/HttpSigTest.php
index 5524e0510..0a22b543a 100644
--- a/tests/unit/Web/HttpSigTest.php
+++ b/tests/unit/Web/HttpSigTest.php
@@ -70,9 +70,6 @@ class HttpSigTest extends UnitTestCase {
);
}
- /**
- * @uses ::Crypto::unencapsulate
- */
function testDecrypt_sigheader() {
$header = 'Header: iv="value_iv" key="value_key" alg="value_alg" data="value_data"';
$result = [
@@ -85,9 +82,7 @@ class HttpSigTest extends UnitTestCase {
$this->assertSame($result, HTTPSig::decrypt_sigheader($header, 'site private key'));
}
- /**
- * @uses ::Crypto::unencapsulate
- */
+
function testDecrypt_sigheaderUseSitePrivateKey() {
// Create a stub for global function get_config() with expectation
$t = $this->getFunctionMock('Zotlabs\Web', 'get_config');
diff --git a/tests/unit/includes/AccountTest.php b/tests/unit/includes/AccountTest.php
new file mode 100644
index 000000000..d123a0c70
--- /dev/null
+++ b/tests/unit/includes/AccountTest.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Tests for account handling helper functions.
+ */
+
+class AccountTest extends Zotlabs\Tests\Unit\UnitTestCase {
+ public function test_get_account_by_id_returns_existing_account() {
+ $account = get_account_by_id(42);
+ $this->assertNotFalse($account);
+ $this->assertEquals($this->fixtures['account'][0]['account_email'], $account['account_email']);
+ }
+}
diff --git a/tests/unit/includes/PhotodriverTest.php b/tests/unit/includes/PhotodriverTest.php
index 6f6ad0ffe..34dc058b7 100644
--- a/tests/unit/includes/PhotodriverTest.php
+++ b/tests/unit/includes/PhotodriverTest.php
@@ -2,38 +2,22 @@
namespace Zotlabs\Tests\Unit\includes;
-//use Zotlabs\Photo\PhotoGd;
use Zotlabs\Tests\Unit\UnitTestCase;
-//use phpmock\phpunit\PHPMock;
/**
* @brief Unit Test cases for include/photo/photo_driver.php file.
*/
class PhotodriverTest extends UnitTestCase {
- //use PHPMock;
public function testPhotofactoryReturnsNullForUnsupportedType() {
- // php-mock can not mock global functions which is called by a global function.
- // If the calling function is in a namespace it would work.
- //$logger = $this->getFunctionMock(__NAMESPACE__, 'logger');
- //$logger->expects($this->once());
-
- //$ph = \photo_factory('', 'image/bmp');
- //$this->assertNull($ph);
-
- $this->markTestIncomplete('Need to mock logger(), otherwise not unit testable.');
+ $photo = \photo_factory('', 'image/bmp');
+ $this->assertNull($photo);
}
public function testPhotofactoryReturnsPhotogdIfConfigIgnore_imagickIsSet() {
- // php-mock can not mock global functions which is called by a global function.
- // If the calling function is in a namespace it would work.
- //$gc = $this->getFunctionMock(__NAMESPACE__, 'get_config');
- // simulate get_config('system', 'ignore_imagick') configured
- //$gc->expects($this->once())->willReturn(1)
-
- //$ph = \photo_factory(file_get_contents('images/hz-16.png'), 'image/png');
- //$this->assertInstanceOf(PhotoGd::class, $ph);
+ \Zotlabs\Lib\Config::Set('system', 'ignore_imagick', true);
- $this->markTestIncomplete('Need to mock get_config(), otherwise not unit testable.');
+ $photo = \photo_factory(file_get_contents('images/hz-16.png'), 'image/png');
+ $this->assertInstanceOf('Zotlabs\Photo\PhotoGd', $photo);
}
-} \ No newline at end of file
+}