diff options
author | diosmosis <benakamoorthi@fastmail.fm> | 2014-04-04 22:57:20 +0400 |
---|---|---|
committer | diosmosis <benakamoorthi@fastmail.fm> | 2014-04-04 22:57:20 +0400 |
commit | e1f4d6795c7922f5e3330b3d5296314094e6844b (patch) | |
tree | 02659faf0dd08e83496df15f213378ef1fd606b7 /plugins | |
parent | 0187cfd6e5c264ce8eac2064ac7b852eb2798697 (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.php | 154 | ||||
-rw-r--r-- | plugins/CoreConsole/CoreConsole.php | 1 |
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'; } } |