File size: 4,039 Bytes
bf8c0ce | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | <?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Tests\Framework\TestCase;
use Piwik\Access;
use Piwik\Cache as PiwikCache;
use Piwik\Db;
use Piwik\EventDispatcher;
use Piwik\Option;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestingEnvironmentVariables;
/**
* Tests extending IntegrationTestCase are much slower to run: the setUp will
* create all Piwik tables in a freshly empty test database.
*
* This allows each test method to start from a clean DB and setup initial state to
* then test it.
*
* @since 2.8.0
*/
abstract class IntegrationTestCase extends SystemTestCase
{
/**
* @var Fixture
*/
public static $fixture;
public static $tableData;
/**
* Implementation details:
*
* To increase speed of tests, database setup is done once in setUpBeforeClass.
* Afterwards, the content of the tables is stored in a static class variable,
* self::$tableData. Before each individual test, the database tables are
* truncated and the data in self::$tableData is restored.
*
* If your test modifies table columns, you will need to recreate the database
* completely. This can be accomplished by:
*
* public function setUp(): void
* {
* self::$fixture->performSetUp();
* }
*
* public function tearDown(): void
* {
* parent::tearDown();
* self::$fixture->performTearDown();
* }
*/
public static function setUpBeforeClass(): void
{
static::configureFixture(static::$fixture);
parent::setUpBeforeClass();
static::beforeTableDataCached();
self::$tableData = self::getDbTablesWithData();
}
public static function tearDownAfterClass(): void
{
self::$tableData = array();
parent::tearDownAfterClass();
}
/**
* Setup the database and create the base tables for all tests
*/
public function setUp(): void
{
parent::setUp();
static::$fixture->extraDefinitions = array_merge(static::provideContainerConfigBeforeClass(), $this->provideContainerConfig());
static::$fixture->createEnvironmentInstance();
Db::get();
Fixture::loadAllPlugins(new TestingEnvironmentVariables(), get_class($this), self::$fixture->extraPluginsToLoad);
Access::getInstance()->setSuperUserAccess(true);
if (!empty(self::$tableData)) {
self::restoreDbTables(self::$tableData);
}
// Note: we can't clear all in memory caches at this point
// Otherwise fixtures can't be used to e.g. manipulate static instances
PiwikCache::getEagerCache()->flushAll();
PiwikCache::getTransientCache()->flushAll();
EventDispatcher::getInstance()->clearCache();
Option::clearCache();
}
/**
* Resets all caches and drops the database
*/
public function tearDown(): void
{
Fixture::clearInMemoryCaches();
static::$fixture->destroyEnvironment();
parent::tearDown();
}
/**
* @param Fixture $fixture
*/
protected static function configureFixture($fixture)
{
$fixture->createSuperUser = false;
$fixture->configureComponents = false;
$fixture->dropDatabaseInTearDown = false;
$fixture->extraTestEnvVars['loadRealTranslations'] = false;
}
protected static function beforeTableDataCached()
{
// empty
}
/**
* Use this method to return custom container configuration that you want to apply for the tests.
* This configuration will override Fixture config and config specified in SystemTestCase::provideContainerConfig().
*
* @return array
*/
public function provideContainerConfig()
{
return array();
}
}
IntegrationTestCase::$fixture = new Fixture();
|