Increased readability
This commit is contained in:
parent
c501ccdff1
commit
53f4d77ff3
5 changed files with 175 additions and 124 deletions
|
@ -1,10 +1,5 @@
|
|||
<?php
|
||||
interface ITestRunner
|
||||
{
|
||||
public function setFilter($filter);
|
||||
public function setTestsPath($testsPath);
|
||||
public function setEnvironmentPrepareAction($callback);
|
||||
public function setEnvironmentCleanAction($callback);
|
||||
public function setTestWrapperAction($callback);
|
||||
public function run();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
class TestRunner implements ITestRunner
|
||||
class ReflectionBasedTestRunner implements ITestRunner
|
||||
{
|
||||
protected $filter = null;
|
||||
protected $testsPath = __DIR__;
|
||||
|
@ -8,6 +8,12 @@ class TestRunner implements ITestRunner
|
|||
protected $environmentCleanAction = null;
|
||||
protected $testWrapperAction = null;
|
||||
|
||||
public function run()
|
||||
{
|
||||
$testFixtures = $this->getTestFixtures($this->filter);
|
||||
$this->runAll($testFixtures);
|
||||
}
|
||||
|
||||
public function setFilter($filter)
|
||||
{
|
||||
$this->filter = $filter;
|
||||
|
@ -33,12 +39,6 @@ class TestRunner implements ITestRunner
|
|||
$this->testWrapperAction = $callback;
|
||||
}
|
||||
|
||||
public function run()
|
||||
{
|
||||
$testFixtures = $this->getTestFixtures($this->filter);
|
||||
$this->runAll($testFixtures);
|
||||
}
|
||||
|
||||
protected function getTestFixtures($filter)
|
||||
{
|
||||
$testFiles = [];
|
7
tests/SzurubooruTestOptions.php
Normal file
7
tests/SzurubooruTestOptions.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
class SzurubooruTestOptions
|
||||
{
|
||||
public $cleanDatabase;
|
||||
public $filter;
|
||||
public $dbDriver;
|
||||
}
|
159
tests/SzurubooruTestRunner.php
Normal file
159
tests/SzurubooruTestRunner.php
Normal file
|
@ -0,0 +1,159 @@
|
|||
<?php
|
||||
class SzurubooruTestRunner implements ITestRunner
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
$options = $this->getOptions();
|
||||
|
||||
$this->resetEnvironment($options);
|
||||
if ($options->cleanDatabase)
|
||||
$this->cleanDatabase();
|
||||
$this->resetEnvironment($options);
|
||||
|
||||
Core::upgradeDatabase();
|
||||
|
||||
$testRunner = new ReflectionBasedTestRunner;
|
||||
$testRunner->setFilter($options->filter);
|
||||
|
||||
$testRunner->setEnvironmentPrepareAction(function() use ($options)
|
||||
{
|
||||
$this->resetEnvironment($options);
|
||||
});
|
||||
|
||||
$testRunner->setEnvironmentCleanAction(function()
|
||||
{
|
||||
$this->removeTestFolders();
|
||||
});
|
||||
|
||||
$testRunner->setTestWrapperAction(function($callback)
|
||||
{
|
||||
\Chibi\Database::rollback(function() use ($callback)
|
||||
{
|
||||
$callback();
|
||||
});
|
||||
});
|
||||
|
||||
$testRunner->run();
|
||||
}
|
||||
|
||||
private function getOptions()
|
||||
{
|
||||
$options = getopt('cf:', ['clean', 'filter:', 'driver:']);
|
||||
|
||||
$ret = new SzurubooruTestOptions;
|
||||
|
||||
$ret->cleanDatabase = (isset($options['c']) or isset($options['clean']));
|
||||
|
||||
$ret->dbDriver = 'sqlite';
|
||||
if (isset($options['driver']))
|
||||
$ret->dbDriver = $options['driver'];
|
||||
|
||||
$ret->filter = null;
|
||||
if (isset($options['f']))
|
||||
$ret->filter = $options['f'];
|
||||
if (isset($options['filter']))
|
||||
$ret->filter = $options['filter'];
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
private function getSqliteDatabasePath()
|
||||
{
|
||||
return __DIR__ . '/db.sqlite';
|
||||
}
|
||||
|
||||
private function getMysqlDatabaseName()
|
||||
{
|
||||
return 'booru_test';
|
||||
}
|
||||
|
||||
private function cleanDatabase()
|
||||
{
|
||||
if (Core::getConfig()->main->dbDriver == 'sqlite')
|
||||
{
|
||||
$this->cleanSqliteDatabase();
|
||||
}
|
||||
elseif (Core::getConfig()->main->dbDriver == 'mysql')
|
||||
{
|
||||
$this->cleanMysqlDatabase();
|
||||
}
|
||||
}
|
||||
|
||||
private function cleanSqliteDatabase()
|
||||
{
|
||||
$dbPath = $this->getSqliteDatabasePath();
|
||||
if (file_exists($dbPath))
|
||||
unlink($dbPath);
|
||||
}
|
||||
|
||||
private function cleanMysqlDatabase()
|
||||
{
|
||||
$stmt = new \Chibi\Sql\RawStatement('DROP DATABASE IF EXISTS ' . $this->getMysqlDatabaseName());
|
||||
\Chibi\Database::exec($stmt);
|
||||
$stmt = new \Chibi\Sql\RawStatement('CREATE DATABASE ' . $this->getMysqlDatabaseName());
|
||||
\Chibi\Database::exec($stmt);
|
||||
}
|
||||
|
||||
private function removeTestFolders()
|
||||
{
|
||||
$folders =
|
||||
[
|
||||
realpath(Core::getConfig()->main->filesPath),
|
||||
realpath(Core::getConfig()->main->thumbsPath),
|
||||
realpath(dirname(Core::getConfig()->main->logsPath)),
|
||||
];
|
||||
|
||||
foreach ($folders as $folder)
|
||||
$this->removeTestFolder($folder);
|
||||
}
|
||||
|
||||
private function removeTestFolder($folder)
|
||||
{
|
||||
if (!file_exists($folder))
|
||||
return;
|
||||
|
||||
$it = new RecursiveIteratorIterator(
|
||||
new RecursiveDirectoryIterator(
|
||||
$folder,
|
||||
FilesystemIterator::SKIP_DOTS),
|
||||
RecursiveIteratorIterator::CHILD_FIRST);
|
||||
|
||||
foreach ($it as $path)
|
||||
{
|
||||
$path->isFile()
|
||||
? unlink($path->getPathname())
|
||||
: rmdir($path->getPathname());
|
||||
}
|
||||
|
||||
rmdir($folder);
|
||||
}
|
||||
|
||||
private function resetEnvironment($options)
|
||||
{
|
||||
$_SESSION = [];
|
||||
|
||||
Core::prepareConfig(true);
|
||||
|
||||
Core::getConfig()->main->dbDriver = $options->dbDriver;
|
||||
if ($options->dbDriver == 'sqlite')
|
||||
{
|
||||
Core::getConfig()->main->dbLocation = $this->getSqliteDatabasePath();
|
||||
}
|
||||
elseif ($options->dbDriver == 'mysql')
|
||||
{
|
||||
Core::getConfig()->main->dbLocation = $this->getMysqlDatabaseName();
|
||||
Core::getConfig()->main->dbUser = 'test';
|
||||
Core::getConfig()->main->dbPass = 'test';
|
||||
}
|
||||
|
||||
$this->removeTestFolders();
|
||||
|
||||
Core::prepareEnvironment(true);
|
||||
|
||||
if ($options->dbDriver == 'mysql')
|
||||
{
|
||||
$stmt = new \Chibi\Sql\RawStatement('USE ' . $this->getMysqlDatabaseName());
|
||||
\Chibi\Database::execUnprepared($stmt);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2,115 +2,5 @@
|
|||
require_once __DIR__ . '/../src/core.php';
|
||||
\Chibi\Autoloader::registerFileSystem(__DIR__);
|
||||
|
||||
function getSqliteDatabasePath()
|
||||
{
|
||||
return __DIR__ . '/db.sqlite';
|
||||
}
|
||||
|
||||
function getMysqlDatabaseName()
|
||||
{
|
||||
return 'booru_test';
|
||||
}
|
||||
|
||||
function cleanDatabase()
|
||||
{
|
||||
if (Core::getConfig()->main->dbDriver == 'sqlite')
|
||||
{
|
||||
$dbPath = getSqliteDatabasePath();
|
||||
if (file_exists($dbPath))
|
||||
unlink($dbPath);
|
||||
}
|
||||
elseif (Core::getConfig()->main->dbDriver == 'mysql')
|
||||
{
|
||||
$stmt = new \Chibi\Sql\RawStatement('DROP DATABASE IF EXISTS ' . getMysqlDatabaseName());
|
||||
\Chibi\Database::exec($stmt);
|
||||
$stmt = new \Chibi\Sql\RawStatement('CREATE DATABASE ' . getMysqlDatabaseName());
|
||||
\Chibi\Database::exec($stmt);
|
||||
}
|
||||
}
|
||||
|
||||
function removeTestFolders()
|
||||
{
|
||||
$folders =
|
||||
[
|
||||
realpath(Core::getConfig()->main->filesPath),
|
||||
realpath(Core::getConfig()->main->thumbsPath),
|
||||
realpath(dirname(Core::getConfig()->main->logsPath)),
|
||||
];
|
||||
|
||||
foreach ($folders as $folder)
|
||||
{
|
||||
if (!file_exists($folder))
|
||||
continue;
|
||||
|
||||
$it = new RecursiveIteratorIterator(
|
||||
new RecursiveDirectoryIterator(
|
||||
$folder,
|
||||
FilesystemIterator::SKIP_DOTS),
|
||||
RecursiveIteratorIterator::CHILD_FIRST);
|
||||
|
||||
foreach ($it as $path)
|
||||
{
|
||||
$path->isFile()
|
||||
? unlink($path->getPathname())
|
||||
: rmdir($path->getPathname());
|
||||
}
|
||||
rmdir($folder);
|
||||
}
|
||||
}
|
||||
|
||||
function resetEnvironment($dbDriver)
|
||||
{
|
||||
$_SESSION = [];
|
||||
Core::prepareConfig(true);
|
||||
Core::getConfig()->main->dbDriver = $dbDriver;
|
||||
if ($dbDriver == 'sqlite')
|
||||
{
|
||||
Core::getConfig()->main->dbLocation = getSqliteDatabasePath();
|
||||
}
|
||||
elseif ($dbDriver == 'mysql')
|
||||
{
|
||||
Core::getConfig()->main->dbLocation = getMysqlDatabaseName();
|
||||
Core::getConfig()->main->dbUser = 'test';
|
||||
Core::getConfig()->main->dbPass = 'test';
|
||||
}
|
||||
removeTestFolders();
|
||||
Core::prepareEnvironment(true);
|
||||
|
||||
if ($dbDriver == 'mysql')
|
||||
{
|
||||
$stmt = new \Chibi\Sql\RawStatement('USE ' . getMysqlDatabaseName());
|
||||
\Chibi\Database::execUnprepared($stmt);
|
||||
}
|
||||
}
|
||||
|
||||
$options = getopt('cf:', ['clean', 'filter:', 'driver:']);
|
||||
$cleanDatabase = (isset($options['c']) or isset($options['clean']));
|
||||
$dbDriver = isset($options['driver']) ? $options['driver'] : 'sqlite';
|
||||
|
||||
if (isset($options['f']))
|
||||
$filter = $options['f'];
|
||||
elseif (isset($options['filter']))
|
||||
$filter = $options['filter'];
|
||||
else
|
||||
$filter = null;
|
||||
|
||||
resetEnvironment($dbDriver);
|
||||
if ($cleanDatabase)
|
||||
cleanDatabase();
|
||||
resetEnvironment($dbDriver);
|
||||
|
||||
Core::upgradeDatabase();
|
||||
|
||||
$testRunner = new TestRunner;
|
||||
$testRunner->setFilter($filter);
|
||||
$testRunner->setEnvironmentPrepareAction(function() use ($dbDriver) { resetEnvironment($dbDriver); });
|
||||
$testRunner->setEnvironmentCleanAction(function() { removeTestFolders(); });
|
||||
$testRunner->setTestWrapperAction(function($callback)
|
||||
{
|
||||
\Chibi\Database::rollback(function() use ($callback)
|
||||
{
|
||||
$callback();
|
||||
});
|
||||
});
|
||||
$testRunner->run($filter);
|
||||
$runner = new SzurubooruTestRunner();
|
||||
$runner->run();
|
||||
|
|
Loading…
Reference in a new issue