Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordiosmosis <benakamoorthi@fastmail.fm>2014-04-04 22:57:20 +0400
committerdiosmosis <benakamoorthi@fastmail.fm>2014-04-04 22:57:20 +0400
commite1f4d6795c7922f5e3330b3d5296314094e6844b (patch)
tree02659faf0dd08e83496df15f213378ef1fd606b7 /plugins
parent0187cfd6e5c264ce8eac2064ac7b852eb2798697 (diff)
Add new console command to setup fixture outside of a test so manual testing can be done w/ existing fixtures and so specific custom data can be added by creating a fixture. Includes slight refactor to Fixture.php.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/CoreConsole/Commands/SetupFixture.php154
-rw-r--r--plugins/CoreConsole/CoreConsole.php1
2 files changed, 155 insertions, 0 deletions
diff --git a/plugins/CoreConsole/Commands/SetupFixture.php b/plugins/CoreConsole/Commands/SetupFixture.php
new file mode 100644
index 0000000000..e756baca50
--- /dev/null
+++ b/plugins/CoreConsole/Commands/SetupFixture.php
@@ -0,0 +1,154 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreConsole\Commands;
+
+use Piwik\Url;
+use Piwik\Piwik;
+use Piwik\Config;
+use Piwik\Plugin\ConsoleCommand;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Console commands that sets up a fixture either in a local MySQL database or a remote one.
+ *
+ * TODO: use this console command in UI tests instead of setUpDatabase.php/tearDownDatabase.php scripts
+ */
+class SetupFixture extends ConsoleCommand
+{
+ protected function configure()
+ {
+ $this->setName('tests:setup-fixture');
+ $this->setDescription('Create a database and fill it with data using a Piwik test fixture.');
+
+ $this->addArgument('fixture', InputArgument::REQUIRED,
+ "The class name of the fixture to apply. Doesn't need to have a namespace if it exists in the " .
+ "Piwik\\Tests\\Fixtures namespace.");
+
+ $this->addOption('db-name', null, InputOption::VALUE_REQUIRED,
+ "The name of the database that will contain the fixture data. This option is required to be set.");
+ $this->addOption('file', null, InputOption::VALUE_REQUIRED,
+ "The file location of the fixture. If this option is included the file will be required explicitly.");
+ $this->addOption('db-host', null, InputOption::VALUE_REQUIRED,
+ "The hostname of the MySQL database to use. Uses the default config value if not specified.");
+ $this->addOption('db-user', null, InputOption::VALUE_REQUIRED,
+ "The name of the MySQL user to use. Uses the default config value if not specified.");
+ $this->addOption('db-pass', null, InputOption::VALUE_REQUIRED,
+ "The MySQL user password to use. Uses the default config value if not specified.");
+ $this->addOption('teardown', null, InputOption::VALUE_NONE,
+ "If specified, the fixture will be torn down and the database deleted. Won't work if the --db-name " .
+ "option isn't supplied.");
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $dbName = $input->getOption('db-name');
+ if (!$dbName) {
+ throw new \Exception("Required argument --db-name is not set.");
+ }
+
+ $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'.");
+ }
+ }
+
+ if (empty(Url::getHost())) {
+ Url::setHost('localhost');
+ }
+
+ $this->requireFixtureFiles();
+ $this->setIncludePathAsInTestBootstrap();
+
+ // get the fixture class
+ $fixtureClass = $input->getArgument('fixture');
+ if (class_exists("Piwik\\Tests\\Fixtures\\" . $fixtureClass)) {
+ $fixtureClass = "Piwik\\Tests\\Fixtures\\" . $fixtureClass;
+ }
+
+ if (!class_exists($fixtureClass)) {
+ throw new \Exception("Cannot find fixture class '$fixtureClass'.");
+ }
+
+ // create the fixture
+ $fixture = new $fixtureClass();
+ $fixture->dbName = $dbName;
+
+ Config::getInstance()->setTestEnvironment();
+ $fixture->createConfig = false;
+
+ // setup database overrides
+ $testingEnvironment = $fixture->getTestEnvironment();
+
+ $optionsToOverride = array(
+ 'dbname' => $dbName,
+ '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;
+ }
+ }
+
+ // perform setup and/or teardown
+ if ($input->getOption('teardown')) {
+ $testingEnvironment->save();
+ $fixture->performTearDown();
+ } else {
+ $fixture->performSetUp();
+ }
+
+ $this->writeSuccessMessage($output, array("Fixture successfully setup!"));
+ }
+
+ private function requireFixtureFiles()
+ {
+ require_once "PHPUnit/Autoload.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/TestingEnvironment.php';
+ require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/Fixture.php';
+
+ $fixturesToLoad = array(
+ '/tests/PHPUnit/Fixtures/*.php',
+ '/tests/PHPUnit/UI/Fixtures/*.php',
+ );
+ foreach($fixturesToLoad as $fixturePath) {
+ foreach (glob(PIWIK_INCLUDE_PATH . $fixturePath) as $file) {
+ require_once $file;
+ }
+ }
+ }
+
+ private function setIncludePathAsInTestBootstrap()
+ {
+ if (!defined('PIWIK_INCLUDE_SEARCH_PATH')) {
+ define('PIWIK_INCLUDE_SEARCH_PATH', get_include_path()
+ . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/core'
+ . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/libs'
+ . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/plugins');
+ }
+ @ini_set('include_path', PIWIK_INCLUDE_SEARCH_PATH);
+ @set_include_path(PIWIK_INCLUDE_SEARCH_PATH);
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreConsole/CoreConsole.php b/plugins/CoreConsole/CoreConsole.php
index 585d79a356..80e6212ab7 100644
--- a/plugins/CoreConsole/CoreConsole.php
+++ b/plugins/CoreConsole/CoreConsole.php
@@ -42,5 +42,6 @@ class CoreConsole extends \Piwik\Plugin
$commands[] = 'Piwik\Plugins\CoreConsole\Commands\SyncUITestScreenshots';
$commands[] = 'Piwik\Plugins\CoreConsole\Commands\ManagePlugin';
$commands[] = 'Piwik\Plugins\CoreConsole\Commands\ManageTestFiles';
+ $commands[] = 'Piwik\Plugins\CoreConsole\Commands\SetupFixture';
}
}