1
0
mirror of https://github.com/flarum/core.git synced 2025-07-31 21:50:50 +02:00

Make integration tests independent

This creates a dedicated test suite for integration tests. All of them
can be run independently, and there is no order dependency - previously,
all integration tests needed the installer test to run first, and they
would fail if installation failed.

Now, the developer will have to set up a Flarum database to be used by
these tests. A setup script to make this simple will be added in the
next commit.

Small tradeoff: the installer is NOT tested in our test suite anymore,
only implicitly through the setup script. If we decide that this is a
problem, we can still set up separate, dedicated installer tests which
should probably test the web installer.
This commit is contained in:
Franz Liedke
2019-01-30 21:15:27 +01:00
parent 4d10536d35
commit cf746079ed
22 changed files with 416 additions and 419 deletions

View File

@@ -11,21 +11,71 @@
namespace Flarum\Tests\integration;
use PHPUnit\Framework\TestCase as Test;
use Flarum\Foundation\InstalledSite;
use Illuminate\Database\ConnectionInterface;
abstract class TestCase extends Test
abstract class TestCase extends \PHPUnit\Framework\TestCase
{
use CreatesForum,
MakesApiRequests;
public function setUp()
{
$this->refreshApplication();
$this->init();
parent::setUp();
// Boot the Flarum app
$this->app();
}
protected function init()
protected $app;
/**
* @return \Flarum\Foundation\InstalledApp
*/
protected function app()
{
// .. allows implementation by children without the need to call the parent.
if (! is_null($this->app)) {
return $this->app;
}
$site = new InstalledSite(
[
'base' => __DIR__.'/tmp',
'public' => __DIR__.'/tmp/public',
'storage' => __DIR__.'/tmp/storage',
],
include __DIR__.'/tmp/config.php'
);
return $this->app = $site->bootApp();
}
protected $database;
protected function database(): ConnectionInterface
{
if (is_null($this->database)) {
$this->database = $this->app()->getContainer()->make(
ConnectionInterface::class
);
}
return $this->database;
}
protected function prepareDatabase(array $tableData)
{
// We temporarily disable foreign key checks to simplify this process.
$this->database()->getSchemaBuilder()->disableForeignKeyConstraints();
// First, truncate all referenced tables so that they are empty.
foreach (array_keys($tableData) as $table) {
$this->database()->table($table)->truncate();
}
// Then, insert all rows required for this test case.
foreach ($tableData as $table => $rows) {
$this->database()->table($table)->insert($rows);
}
// And finally, turn on foreign key checks again.
$this->database()->getSchemaBuilder()->enableForeignKeyConstraints();
}
}