From a73f710ff43ddad326292407fa952c532d2a363a Mon Sep 17 00:00:00 2001 From: diosmosis Date: Thu, 11 Jun 2015 18:01:47 -0700 Subject: Load plugins in tests automatically through testing environment manipulation, instead of through a method in Fixture. Allows plugin environment configs to be loaded during tests. --- core/Application/Environment.php | 12 ++++- core/Application/EnvironmentManipulator.php | 9 ++++ tests/PHPUnit/Framework/Fixture.php | 37 ++------------- .../Framework/TestingEnvironmentManipulator.php | 53 ++++++++++++++++++++++ 4 files changed, 77 insertions(+), 34 deletions(-) diff --git a/core/Application/Environment.php b/core/Application/Environment.php index 61df20a32f..8631a90ec0 100644 --- a/core/Application/Environment.php +++ b/core/Application/Environment.php @@ -139,7 +139,8 @@ class Environment protected function getPluginListCached() { if ($this->pluginList === null) { - $this->pluginList = $this->getPluginList(); + $pluginList = $this->getPluginListOverride(); + $this->pluginList = $pluginList ?: $this->getPluginList(); } return $this->pluginList; } @@ -223,4 +224,13 @@ class Environment return array(); } } + + private function getPluginListOverride() + { + if (self::$globalEnvironmentManipulator) { + return self::$globalEnvironmentManipulator->makePluginList($this->getGlobalSettingsCached()); + } else { + return null; + } + } } diff --git a/core/Application/EnvironmentManipulator.php b/core/Application/EnvironmentManipulator.php index 1740de6c44..d740096fd9 100644 --- a/core/Application/EnvironmentManipulator.php +++ b/core/Application/EnvironmentManipulator.php @@ -9,6 +9,7 @@ namespace Piwik\Application; use Piwik\Application\Kernel\GlobalSettingsProvider; +use Piwik\Application\Kernel\PluginList; /** * Used to manipulate Environment instances before the container is created. @@ -24,6 +25,14 @@ interface EnvironmentManipulator */ public function makeGlobalSettingsProvider(); + /** + * Create a custom PluginList kernel object, overriding the default behavior.@deprecated + * + * @param GlobalSettingsProvider $globalSettingsProvider + * @return PluginList + */ + public function makePluginList(GlobalSettingsProvider $globalSettingsProvider); + /** * Invoked before the container is created. */ diff --git a/tests/PHPUnit/Framework/Fixture.php b/tests/PHPUnit/Framework/Fixture.php index b2277b7d31..0cbd4e9394 100644 --- a/tests/PHPUnit/Framework/Fixture.php +++ b/tests/PHPUnit/Framework/Fixture.php @@ -176,6 +176,8 @@ class Fixture extends \PHPUnit_Framework_Assert public function performSetUp($setupEnvironmentOnly = false) { + TestingEnvironmentManipulator::$extraPluginsToLoad = $this->extraPluginsToLoad; + $this->createEnvironmentInstance(); try { @@ -345,41 +347,10 @@ class Fixture extends \PHPUnit_Framework_Assert // since Plugin\Manager uses getFromGlobalConfig which doesn't init the config object } - public static function loadAllPlugins($testEnvironment = null, $testCaseClass = false, $extraPluginsToLoad = array()) + public static function loadAllPlugins(TestingEnvironmentVariables $testEnvironment = null, $testCaseClass = false, $extraPluginsToLoad = array()) { - if (empty($testEnvironment)) { - $testEnvironment = new TestingEnvironmentVariables(); - } - DbHelper::createTables(); - $pluginsManager = Manager::getInstance(); - - $plugins = $testEnvironment->getCoreAndSupportedPlugins(); - - // make sure the plugin that executed this method is included in the plugins to load - $extraPlugins = array_merge($extraPluginsToLoad, array( - Plugin::getPluginNameFromBacktrace(debug_backtrace()), - Plugin::getPluginNameFromNamespace($testCaseClass), - Plugin::getPluginNameFromNamespace(get_called_class()) - )); - foreach ($extraPlugins as $pluginName) { - if (empty($pluginName)) { - continue; - } - - if (in_array($pluginName, $plugins)) { - continue; - } - - $plugins[] = $pluginName; - if ($testEnvironment) { - $testEnvironment->pluginsToLoad = array_merge($testEnvironment->pluginsToLoad ?: array(), array($pluginName)); - } - } - - Log::debug("Plugins to load during tests: " . implode(', ', $plugins)); - - $pluginsManager->loadPlugins($plugins); + Plugin\Manager::getInstance()->loadActivatedPlugins(); } public static function installAndActivatePlugins() diff --git a/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php b/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php index 67aa6560b6..62098c9ae4 100644 --- a/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php +++ b/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php @@ -10,14 +10,37 @@ namespace Piwik\Tests\Framework; use Piwik\Application\EnvironmentManipulator; use Piwik\Application\Kernel\GlobalSettingsProvider; +use Piwik\Application\Kernel\PluginList; use Piwik\DbHelper; use Piwik\Option; +use Piwik\Plugin; + +class FakePluginList extends PluginList +{ + private $plugins; + + public function __construct(GlobalSettingsProvider $globalSettingsProvider, $plugins) + { + parent::__construct($globalSettingsProvider); + $this->plugins = $plugins; + } + + public function getActivatedPlugins() + { + return $this->plugins; + } +} /** * Manipulates an environment for tests. */ class TestingEnvironmentManipulator implements EnvironmentManipulator { + /** + * @var string[] + */ + public static $extraPluginsToLoad = array(); + /** * @var TestingEnvironmentVariables */ @@ -36,6 +59,11 @@ class TestingEnvironmentManipulator implements EnvironmentManipulator return new GlobalSettingsProvider($this->vars->configFileGlobal, $this->vars->configFileLocal, $this->vars->configFileCommon); } + public function makePluginList(GlobalSettingsProvider $globalSettingsProvider) + { + return new FakePluginList($globalSettingsProvider, $this->getPluginsToLoadDuringTest()); + } + public function beforeContainerCreated() { if ($this->vars->queryParamOverride) { @@ -134,4 +162,29 @@ class TestingEnvironmentManipulator implements EnvironmentManipulator { return array('test'); } + + private function getPluginsToLoadDuringTest() + { + $plugins = $this->vars->getCoreAndSupportedPlugins(); + + // make sure the plugin that executed this method is included in the plugins to load + $extraPlugins = array_merge(self::$extraPluginsToLoad, array( + Plugin::getPluginNameFromBacktrace(debug_backtrace()), + Plugin::getPluginNameFromNamespace($this->vars->testCaseClass), + Plugin::getPluginNameFromNamespace(get_called_class()) + )); + foreach ($extraPlugins as $pluginName) { + if (empty($pluginName)) { + continue; + } + + if (in_array($pluginName, $plugins)) { + continue; + } + + $plugins[] = $pluginName; + } + + return $plugins; + } } \ No newline at end of file -- cgit v1.2.3