From 4aec071a74dde0ba017377c48b69195431d24e22 Mon Sep 17 00:00:00 2001
From: diosmosis <benaka@piwik.pro>
Date: Mon, 15 Jun 2015 14:00:09 -0700
Subject: [PATCH] Fixes #8110, make sure plugins are sorted correctly during
 tests. Moved plugin sorting logic from Plugin\Manager to PluginList.

---
 core/Application/Kernel/PluginList.php        | 28 +++++++++++++++++++
 core/Plugin/Manager.php                       | 25 ++---------------
 .../TestingEnvironmentManipulator.php         |  3 +-
 3 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/core/Application/Kernel/PluginList.php b/core/Application/Kernel/PluginList.php
index a79a974a40..66fa64eb4e 100644
--- a/core/Application/Kernel/PluginList.php
+++ b/core/Application/Kernel/PluginList.php
@@ -54,4 +54,32 @@ class PluginList
         $section = $this->settings->getIniFileChain()->getFrom($pathGlobal, 'Plugins');
         return $section['Plugins'];
     }
+
+    /**
+     * Sorts an array of plugins in the order they should be loaded.
+     *
+     * @params string[] $plugins
+     * @return \string[]
+     */
+    public function sortPlugins(array $plugins)
+    {
+        $global = $this->getPluginsBundledWithPiwik();
+        if (empty($global)) {
+            return $plugins;
+        }
+
+        $global = array_values($global);
+        $plugins = array_values($plugins);
+
+        $defaultPluginsLoadedFirst = array_intersect($global, $plugins);
+
+        $otherPluginsToLoadAfterDefaultPlugins = array_diff($plugins, $defaultPluginsLoadedFirst);
+
+        // sort by name to have a predictable order for those extra plugins
+        sort($otherPluginsToLoadAfterDefaultPlugins);
+
+        $sorted = array_merge($defaultPluginsLoadedFirst, $otherPluginsToLoadAfterDefaultPlugins);
+
+        return $sorted;
+    }
 }
diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php
index b7a397b587..62a9954d39 100644
--- a/core/Plugin/Manager.php
+++ b/core/Plugin/Manager.php
@@ -224,7 +224,7 @@ class Manager
      */
     private function updatePluginsConfig($pluginsToLoad)
     {
-        $pluginsToLoad = $this->sortPluginsSameOrderAsGlobalConfig($pluginsToLoad);
+        $pluginsToLoad = $this->pluginList->sortPlugins($pluginsToLoad);
         $section = PiwikConfig::getInstance()->Plugins;
         $section['Plugins'] = $pluginsToLoad;
         PiwikConfig::getInstance()->Plugins = $section;
@@ -1326,31 +1326,10 @@ class Manager
             $pluginsToLoad = array_merge($pluginsToLoad, $this->pluginToAlwaysActivate);
         }
         $pluginsToLoad = array_unique($pluginsToLoad);
-        $pluginsToLoad = $this->sortPluginsSameOrderAsGlobalConfig($pluginsToLoad);
+        $pluginsToLoad = $this->pluginList->sortPlugins($pluginsToLoad);
         return $pluginsToLoad;
     }
 
-    private function sortPluginsSameOrderAsGlobalConfig(array $plugins)
-    {
-        $global = $this->getPluginsFromGlobalIniConfigFile();
-        if (empty($global)) {
-            return $plugins;
-        }
-        $global = array_values($global);
-        $plugins = array_values($plugins);
-
-        $defaultPluginsLoadedFirst = array_intersect($global, $plugins);
-
-        $otherPluginsToLoadAfterDefaultPlugins = array_diff($plugins, $defaultPluginsLoadedFirst);
-
-        // sort by name to have a predictable order for those extra plugins
-        sort($otherPluginsToLoadAfterDefaultPlugins);
-
-        $sorted = array_merge($defaultPluginsLoadedFirst, $otherPluginsToLoadAfterDefaultPlugins);
-
-        return $sorted;
-    }
-
     public function loadPluginTranslations()
     {
         /** @var Translator $translator */
diff --git a/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php b/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php
index 42d3cf720c..65fbfc2d32 100644
--- a/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php
+++ b/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php
@@ -22,7 +22,8 @@ class FakePluginList extends PluginList
     public function __construct(GlobalSettingsProvider $globalSettingsProvider, $plugins)
     {
         parent::__construct($globalSettingsProvider);
-        $this->plugins = $plugins;
+
+        $this->plugins = $this->sortPlugins($plugins);
     }
 
     public function getActivatedPlugins()
-- 
GitLab