Add PHP unit tests and page tests.

Run "composer install", then "composer test".
This commit is contained in:
tim
2026-09-26 03:48:09 +02:00
parent 848c447c5b
commit ed959888b4
42 changed files with 5522 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
<?php
namespace Xxx\Tests\Support;
/*
* The base of the unit tests. Before each test it moves to publish/ (as
* the publishing pages run there), empties the request,
* the session and the globals that the site code uses, gives the test a
* fake database with empty tables and a temporary directory (also the
* upload directory), and clears the error log.
*/
abstract class TestCase extends \PHPUnit\Framework\TestCase {
protected string $tmp;
private array $envNames = array();
private string $cwd;
protected function setUp(): void {
// publish/post.lib.php includes files by paths relative to publish/
$this->cwd = getcwd();
chdir(XXX_ROOT . '/publish');
FakeDb::reset();
SiteData::$passwordLength = NULL;
SiteData::install();
$GLOBALS['db'] = NULL;
$GLOBALS['db_class'] = FakeDb::class;
$_GET = $_POST = $_REQUEST = $_FILES = $_COOKIE = $_SESSION = array();
$_SERVER['REMOTE_ADDR'] = '192.0.2.1';
$_SERVER['REQUEST_URI'] = '/';
unset($_SERVER['HTTPS']);
foreach (array('is_admin' => FALSE, 'action' => NULL, 'queue' => NULL, 'id' => NULL,
'num_stories' => NULL, 'editable' => NULL, 'username' => NULL,
'validate' => array()) as $name => $value)
$GLOBALS[$name] = $value;
unset($GLOBALS['file_src']);
$this->tmp = sys_get_temp_dir() . '/xxx-test-' . bin2hex(random_bytes(6));
mkdir($this->tmp, 0700);
$this->setEnv('UPLOAD_DIR', $this->tmp . '/uploads');
file_put_contents(XXX_TEST_LOG, '');
}
protected function tearDown(): void {
FakeRecaptcha::uninstall();
foreach ($this->envNames as $name)
putenv($name);
$this->envNames = array();
self::removeTree($this->tmp);
chdir($this->cwd);
}
// Set an environment variable (which config() reads first) for this test
protected function setEnv(string $name, string $value): void {
$this->envNames[] = $name;
putenv("$name=$value");
}
protected function request(array $get = array(), array $post = array()): void {
$_GET = $get;
$_POST = $post;
$_REQUEST = array_merge($get, $post);
}
protected function asEditor(string $name = 'ed'): void {
$GLOBALS['is_admin'] = TRUE;
$GLOBALS['username'] = $name;
$_SESSION['editor'] = $name;
}
// What the code wrote to the PHP error log during this test
protected function loggedErrors(): string {
return (string)file_get_contents(XXX_TEST_LOG);
}
// A 1x1 PNG image
public static function png(): string {
return base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==');
}
public static function removeTree(string $path): void {
if (is_dir($path) && !is_link($path)) {
foreach (scandir($path) as $name) {
if ($name !== '.' && $name !== '..')
self::removeTree("$path/$name");
}
rmdir($path);
} else if (file_exists($path) || is_link($path)) {
unlink($path);
}
}
}