Skip to content
Extraits de code Groupes Projets
Valider 1e4c9506 rédigé par diosmosis's avatar diosmosis
Parcourir les fichiers

Modified SetupFixture to save SQL dumps of fixtures when needed, make sure...

Modified SetupFixture to save SQL dumps of fixtures when needed, make sure OmniFixture can be used w/ SetupFixture, and use SQL dump of OmniFixture in UI tests instead of running OmniFixture every time (so changes in fixtures do not result in changes to screenshots).
parent dea3e061
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
namespace Piwik\Plugins\CoreConsole\Commands; namespace Piwik\Plugins\CoreConsole\Commands;
use \Fixture;
use Piwik\Config; use Piwik\Config;
use Piwik\Plugin\ConsoleCommand; use Piwik\Plugin\ConsoleCommand;
use Piwik\Url; use Piwik\Url;
...@@ -18,6 +19,28 @@ use Symfony\Component\Console\Output\OutputInterface; ...@@ -18,6 +19,28 @@ use Symfony\Component\Console\Output\OutputInterface;
/** /**
* Console commands that sets up a fixture either in a local MySQL database or a remote one. * Console commands that sets up a fixture either in a local MySQL database or a remote one.
*
* Examples:
*
* To setup a fixture provided by Piwik:
*
* ./console tests:setup-fixture UITestFixture
*
* To setup your own fixture created solely for test purposes and stored outside of Piwik:
*
* ./console tests:setup-fixture MyFixtureType --file=../devfixtures/MyFixtureType.php
*
* To setup a fixture or use existing data if present:
*
* ./console tests:setup-fixture UITestFixture --persist-fixture-data
*
* To re-setup a fixture that is already present:
*
* ./console tests:setup-fixture UITestFixture --persist-fixture-data --drop
*
* To create an SQL dump for a fixture:
*
* ./console tests:setup-fixture OmniFixture --sqldump=OmniFixtureDump.sql
*/ */
class SetupFixture extends ConsoleCommand class SetupFixture extends ConsoleCommand
{ {
...@@ -49,6 +72,8 @@ class SetupFixture extends ConsoleCommand ...@@ -49,6 +72,8 @@ class SetupFixture extends ConsoleCommand
$this->addOption('drop', null, InputOption::VALUE_NONE, $this->addOption('drop', null, InputOption::VALUE_NONE,
"Forces the database to be dropped before setting up the fixture. Should be used in conjunction with" . "Forces the database to be dropped before setting up the fixture. Should be used in conjunction with" .
" --persist-fixture-data when updating a pre-existing test database."); " --persist-fixture-data when updating a pre-existing test database.");
$this->addOption('sqldump', null, InputOption::VALUE_REQUIRED,
"Creates an SQL dump after setting up the fixture and outputs the dump to the file specified by this option.");
$this->addOption('set-phantomjs-symlinks', null, InputOption::VALUE_NONE, $this->addOption('set-phantomjs-symlinks', null, InputOption::VALUE_NONE,
"Used by UI tests. Creates symlinks to root directory in tests/PHPUnit/proxy."); "Used by UI tests. Creates symlinks to root directory in tests/PHPUnit/proxy.");
$this->addOption('server-global', null, InputOption::VALUE_REQUIRED, $this->addOption('server-global', null, InputOption::VALUE_REQUIRED,
...@@ -64,26 +89,88 @@ class SetupFixture extends ConsoleCommand ...@@ -64,26 +89,88 @@ class SetupFixture extends ConsoleCommand
$_SERVER = json_decode($serverGlobal, true); $_SERVER = json_decode($serverGlobal, true);
} }
$this->requireFixtureFiles(); $this->requireFixtureFiles($input);
$this->setIncludePathAsInTestBootstrap(); $this->setIncludePathAsInTestBootstrap();
$file = $input->getOption('file');
if ($file) {
if (is_file($file)) {
require_once $file;
} else if (is_file(PIWIK_INCLUDE_PATH . '/' . $file)) {
require_once PIWIK_INCLUDE_PATH . '/' . $file;
} else {
throw new \Exception("Cannot find --file option file '$file'.");
}
}
$host = Url::getHost(); $host = Url::getHost();
if (empty($host)) { if (empty($host)) {
Url::setHost('localhost'); Url::setHost('localhost');
} }
// get the fixture class $fixture = $this->createFixture($input);
$this->setupDatabaseOverrides($input, $fixture);
// perform setup and/or teardown
if ($input->getOption('teardown')) {
$fixture->getTestEnvironment()->save();
$fixture->performTearDown();
} else {
$fixture->performSetUp();
}
if ($input->getOption('set-phantomjs-symlinks')) {
$this->createSymbolicLinksForUITests();
}
$this->writeSuccessMessage($output, array("Fixture successfully setup!"));
$sqlDumpPath = $input->getOption('sqldump');
if ($sqlDumpPath) {
$this->createSqlDump($sqlDumpPath, $output);
}
}
private function createSymbolicLinksForUITests()
{
// make sure symbolic links exist (phantomjs doesn't support symlink-ing yet)
foreach (array('libs', 'plugins', 'tests', 'piwik.js') as $linkName) {
$linkPath = PIWIK_INCLUDE_PATH . '/tests/PHPUnit/proxy/' . $linkName;
if (!file_exists($linkPath)) {
symlink(PIWIK_INCLUDE_PATH . '/' . $linkName, $linkPath);
}
}
}
private function createSqlDump($sqlDumpPath, OutputInterface $output)
{
$output->write("<info>Creating SQL dump...</info>");
$databaseConfig = Config::getInstance()->database;
$dbUser = $databaseConfig['username'];
$dbPass = $databaseConfig['password'];
$dbHost = $databaseConfig['host'];
$dbName = $databaseConfig['dbname'];
$command = "mysqldump --user='$dbUser' --password='$dbPass' --host='$dbHost' '$dbName' > '$sqlDumpPath'";
passthru($command);
$this->writeSuccessMessage($output, array("SQL dump created!"));
}
private function setupDatabaseOverrides(InputInterface $input, Fixture $fixture)
{
$testingEnvironment = $fixture->getTestEnvironment();
$optionsToOverride = array(
'dbname' => $fixture->getDbName(),
'host' => $input->getOption('db-host'),
'username' => $input->getOption('db-user'),
'password' => $input->getOption('db-pass')
);
foreach ($optionsToOverride as $configOption => $value) {
if ($value) {
$configOverride = $testingEnvironment->configOverride;
$configOverride['database_tests'][$configOption] = $configOverride['database'][$configOption] = $value;
$testingEnvironment->configOverride = $configOverride;
Config::getInstance()->database[$configOption] = $value;
}
}
}
private function createFixture(InputInterface $input)
{
$fixtureClass = $input->getArgument('fixture'); $fixtureClass = $input->getArgument('fixture');
if (class_exists("Piwik\\Tests\\Fixtures\\" . $fixtureClass)) { if (class_exists("Piwik\\Tests\\Fixtures\\" . $fixtureClass)) {
$fixtureClass = "Piwik\\Tests\\Fixtures\\" . $fixtureClass; $fixtureClass = "Piwik\\Tests\\Fixtures\\" . $fixtureClass;
...@@ -93,7 +180,6 @@ class SetupFixture extends ConsoleCommand ...@@ -93,7 +180,6 @@ class SetupFixture extends ConsoleCommand
throw new \Exception("Cannot find fixture class '$fixtureClass'."); throw new \Exception("Cannot find fixture class '$fixtureClass'.");
} }
// create the fixture
$fixture = new $fixtureClass(); $fixture = new $fixtureClass();
$fixture->printToScreen = true; $fixture->printToScreen = true;
...@@ -115,52 +201,16 @@ class SetupFixture extends ConsoleCommand ...@@ -115,52 +201,16 @@ class SetupFixture extends ConsoleCommand
$fixture->extraPluginsToLoad = explode(',', $extraPluginsToLoad); $fixture->extraPluginsToLoad = explode(',', $extraPluginsToLoad);
} }
if($fixture->createConfig) { if ($fixture->createConfig) {
Config::getInstance()->setTestEnvironment(); Config::getInstance()->setTestEnvironment();
} }
$fixture->createConfig = false;
// setup database overrides
$testingEnvironment = $fixture->getTestEnvironment();
$optionsToOverride = array(
'dbname' => $fixture->getDbName(),
'host' => $input->getOption('db-host'),
'user' => $input->getOption('db-user'),
'password' => $input->getOption('db-pass')
);
foreach ($optionsToOverride as $configOption => $value) {
if ($value) {
$configOverride = $testingEnvironment->configOverride;
$configOverride['database_tests'][$configOption] = $configOverride['database'][$configOption] = $value;
$testingEnvironment->configOverride = $configOverride;
Config::getInstance()->database[$configOption] = $value; $fixture->createConfig = false;
}
}
// perform setup and/or teardown
if ($input->getOption('teardown')) {
$testingEnvironment->save();
$fixture->performTearDown();
} else {
$fixture->performSetUp();
}
if ($input->getOption('set-phantomjs-symlinks')) {
// make sure symbolic links exist (phantomjs doesn't support symlink-ing yet)
foreach (array('libs', 'plugins', 'tests', 'piwik.js') as $linkName) {
$linkPath = PIWIK_INCLUDE_PATH . '/tests/PHPUnit/proxy/' . $linkName;
if (!file_exists($linkPath)) {
symlink(PIWIK_INCLUDE_PATH . '/' . $linkName, $linkPath);
}
}
}
$this->writeSuccessMessage($output, array("Fixture successfully setup!")); return $fixture;
} }
private function requireFixtureFiles() private function requireFixtureFiles(InputInterface $input)
{ {
require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php'; require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/FakeAccess.php'; require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/FakeAccess.php';
...@@ -180,6 +230,17 @@ class SetupFixture extends ConsoleCommand ...@@ -180,6 +230,17 @@ class SetupFixture extends ConsoleCommand
require_once $file; require_once $file;
} }
} }
$file = $input->getOption('file');
if ($file) {
if (is_file($file)) {
require_once $file;
} else if (is_file(PIWIK_INCLUDE_PATH . '/' . $file)) {
require_once PIWIK_INCLUDE_PATH . '/' . $file;
} else {
throw new \Exception("Cannot find --file option file '$file'.");
}
}
} }
private function setIncludePathAsInTestBootstrap() private function setIncludePathAsInTestBootstrap()
...@@ -193,4 +254,4 @@ class SetupFixture extends ConsoleCommand ...@@ -193,4 +254,4 @@ class SetupFixture extends ConsoleCommand
@ini_set('include_path', PIWIK_INCLUDE_SEARCH_PATH); @ini_set('include_path', PIWIK_INCLUDE_SEARCH_PATH);
@set_include_path(PIWIK_INCLUDE_SEARCH_PATH); @set_include_path(PIWIK_INCLUDE_SEARCH_PATH);
} }
} }
\ No newline at end of file
...@@ -29,6 +29,8 @@ use Piwik\Site; ...@@ -29,6 +29,8 @@ use Piwik\Site;
use Piwik\Tracker\Cache; use Piwik\Tracker\Cache;
use Piwik\Translate; use Piwik\Translate;
use Piwik\Url; use Piwik\Url;
use Piwik\Plugins\CoreUpdater\CoreUpdater;
use Piwik\Updater;
/** /**
* Base type for all integration test fixtures. Integration test fixtures * Base type for all integration test fixtures. Integration test fixtures
...@@ -781,6 +783,25 @@ class Fixture extends PHPUnit_Framework_Assert ...@@ -781,6 +783,25 @@ class Fixture extends PHPUnit_Framework_Assert
} }
return $result; return $result;
} }
public static function updateDatabase()
{
$updater = new Updater();
$componentsWithUpdateFile = CoreUpdater::getComponentUpdates($updater);
if (empty($componentsWithUpdateFile)) {
return false;
}
$result = CoreUpdater::updateComponents($updater, $componentsWithUpdateFile);
if (!empty($result['coreError'])
&& !empty($result['warnings'])
&& !empty($result['errors'])
) {
throw new \Exception("Failed to update database (errors or warnings found): " . print_r($result, true));
}
return $result;
}
} }
// TODO: remove when other plugins don't use BaseFixture // TODO: remove when other plugins don't use BaseFixture
......
...@@ -8,7 +8,10 @@ ...@@ -8,7 +8,10 @@
namespace Piwik\Tests\Fixtures; namespace Piwik\Tests\Fixtures;
use Piwik\Date; use Piwik\Date;
use Piwik\Access;
use Piwik\Option;
use ReflectionClass; use ReflectionClass;
use Piwik\Plugins\VisitsSummary\API as VisitsSummaryAPI;
/** /**
* This fixture is the combination of every other fixture defined by Piwik. Should be used * This fixture is the combination of every other fixture defined by Piwik. Should be used
...@@ -42,6 +45,7 @@ class OmniFixture extends \Fixture ...@@ -42,6 +45,7 @@ class OmniFixture extends \Fixture
&& $className != __CLASS__ && $className != __CLASS__
&& $className != "Piwik_Test_Fixture_SqlDump" && $className != "Piwik_Test_Fixture_SqlDump"
&& $className != "Piwik\\Tests\\Fixtures\\UpdaterTestFixture" && $className != "Piwik\\Tests\\Fixtures\\UpdaterTestFixture"
&& $className != "Piwik\\Tests\\Fixtures\\UITestFixture"
) { ) {
$klassReflect = new ReflectionClass($className); $klassReflect = new ReflectionClass($className);
if (!strpos($klassReflect->getFilename(), "tests/PHPUnit/Fixtures") if (!strpos($klassReflect->getFilename(), "tests/PHPUnit/Fixtures")
...@@ -87,6 +91,13 @@ class OmniFixture extends \Fixture ...@@ -87,6 +91,13 @@ class OmniFixture extends \Fixture
foreach ($this->fixtures as $name => $fixture) { foreach ($this->fixtures as $name => $fixture) {
$fixture->setUp(); $fixture->setUp();
} }
Option::set("Tests.forcedNowTimestamp", $this->now->getTimestamp());
// launch archiving so tests don't run out of time
$date = Date::factory($this->dateTime)->toString();
VisitsSummaryAPI::getInstance()->get($this->idSite, 'year', $date);
VisitsSummaryAPI::getInstance()->get($this->idSite, 'year', $date, urlencode($this->segment));
} }
public function tearDown() public function tearDown()
...@@ -95,4 +106,10 @@ class OmniFixture extends \Fixture ...@@ -95,4 +106,10 @@ class OmniFixture extends \Fixture
$fixture->tearDown(); $fixture->tearDown();
} }
} }
public static function createAccessInstance()
{
Access::setSingletonInstance($access = new \Test_Access_OverrideLogin());
\Piwik\Piwik::postEvent('Request.initAuthenticationObject');
}
} }
\ No newline at end of file
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
namespace Piwik\Tests\Fixtures; namespace Piwik\Tests\Fixtures;
use Exception; use Exception;
use Piwik\Access;
use Piwik\AssetManager; use Piwik\AssetManager;
use Piwik\Access;
use Piwik\Common; use Piwik\Common;
use Piwik\Date; use Piwik\Date;
use Piwik\Db; use Piwik\Db;
...@@ -18,18 +18,28 @@ use Piwik\FrontController; ...@@ -18,18 +18,28 @@ use Piwik\FrontController;
use Piwik\Option; use Piwik\Option;
use Piwik\Plugins\SegmentEditor\API as APISegmentEditor; use Piwik\Plugins\SegmentEditor\API as APISegmentEditor;
use Piwik\Plugins\UsersManager\API as UsersManagerAPI; use Piwik\Plugins\UsersManager\API as UsersManagerAPI;
use Piwik\Plugins\VisitsSummary\API as VisitsSummaryAPI;
use Piwik\WidgetsList; use Piwik\WidgetsList;
use Fixture;
/** /**
* Fixture for UI tests. * Fixture for UI tests.
*/ */
class UITestFixture extends OmniFixture class UITestFixture extends \Piwik_Test_Fixture_SqlDump
{ {
const FIXTURE_LOCATION = '/tests/resources/OmniFixture-dump.sql.gz';
public function __construct()
{
$this->dumpUrl = PIWIK_INCLUDE_PATH . self::FIXTURE_LOCATION;
$this->tablesPrefix = '';
}
public function setUp() public function setUp()
{ {
parent::setUp(); parent::setUp();
self::updateDatabase();
// make sure site has an early enough creation date (for period selector tests) // make sure site has an early enough creation date (for period selector tests)
Db::get()->update(Common::prefixTable("site"), Db::get()->update(Common::prefixTable("site"),
array('ts_created' => '2011-01-01'), array('ts_created' => '2011-01-01'),
...@@ -41,13 +51,6 @@ class UITestFixture extends OmniFixture ...@@ -41,13 +51,6 @@ class UITestFixture extends OmniFixture
DbHelper::createAnonymousUser(); DbHelper::createAnonymousUser();
UsersManagerAPI::getInstance()->setSuperUserAccess('superUserLogin', true); UsersManagerAPI::getInstance()->setSuperUserAccess('superUserLogin', true);
Option::set("Tests.forcedNowTimestamp", $this->now->getTimestamp());
// launch archiving so tests don't run out of time
$date = Date::factory($this->dateTime)->toString();
VisitsSummaryAPI::getInstance()->get($this->idSite, 'year', $date);
VisitsSummaryAPI::getInstance()->get($this->idSite, 'year', $date, urlencode($this->segment));
} }
public function performSetUp($setupEnvironmentOnly = false) public function performSetUp($setupEnvironmentOnly = false)
......
...@@ -8,9 +8,7 @@ ...@@ -8,9 +8,7 @@
use Piwik\Common; use Piwik\Common;
use Piwik\Db; use Piwik\Db;
use Piwik\Plugins\CoreUpdater\CoreUpdater;
use Piwik\Plugins\VisitFrequency\API as VisitFrequencyApi; use Piwik\Plugins\VisitFrequency\API as VisitFrequencyApi;
use Piwik\Updater;
/** /**
* Tests that Piwik 2.0 works w/ data from Piwik 1.12. * Tests that Piwik 2.0 works w/ data from Piwik 1.12.
...@@ -27,7 +25,10 @@ class Test_Piwik_Integration_BackwardsCompatibility1XTest extends IntegrationTes ...@@ -27,7 +25,10 @@ class Test_Piwik_Integration_BackwardsCompatibility1XTest extends IntegrationTes
{ {
parent::setUpBeforeClass(); parent::setUpBeforeClass();
self::updateDatabase(); $result = Fixture::updateDatabase();
if ($result === false) {
throw new \Exception("Failed to update pre-2.0 database (nothing to update).");
}
// truncate log tables so old data won't be re-archived // truncate log tables so old data won't be re-archived
foreach (array('log_visit', 'log_link_visit_action', 'log_conversion', 'log_conversion_item') as $table) { foreach (array('log_visit', 'log_link_visit_action', 'log_conversion', 'log_conversion_item') as $table) {
...@@ -49,23 +50,6 @@ class Test_Piwik_Integration_BackwardsCompatibility1XTest extends IntegrationTes ...@@ -49,23 +50,6 @@ class Test_Piwik_Integration_BackwardsCompatibility1XTest extends IntegrationTes
VisitFrequencyApi::getInstance()->get(1, 'year', '2012-12-29'); VisitFrequencyApi::getInstance()->get(1, 'year', '2012-12-29');
} }
private static function updateDatabase()
{
$updater = new Updater();
$componentsWithUpdateFile = CoreUpdater::getComponentUpdates($updater);
if (empty($componentsWithUpdateFile)) {
throw new \Exception("Failed to update pre-2.0 database (nothing to update).");
}
$result = CoreUpdater::updateComponents($updater, $componentsWithUpdateFile);
if (!empty($result['coreError'])
&& !empty($result['warnings'])
&& !empty($result['errors'])
) {
throw new \Exception("Failed to update pre-2.0 database (errors or warnings found): " . print_r($result, true));
}
}
public function setUp() public function setUp()
{ {
parent::setUp(); parent::setUp();
......
Le fichier a été supprimé par une entrée .gitattributes, ou son encodage n'est pas pris en charge.
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter