From ea9c95410a436cea3051ab813476c24b4ddaca0d Mon Sep 17 00:00:00 2001
From: Matthieu Napoli <matthieu@mnapoli.fr>
Date: Tue, 30 Dec 2014 12:32:32 +1300
Subject: [PATCH] Fix unit tests by loading no translations by default in tests

---
 config/environment/test.php                   |  6 ++++
 core/Intl/Locale.php                          | 19 +++++++++++
 core/Translate.php                            |  5 ++-
 core/Translation/Translator.php               | 10 ++++++
 plugins/LanguagesManager/LanguagesManager.php |  5 ++-
 .../Unit/Metrics/Formatter/HtmlTest.php       |  5 +--
 tests/PHPUnit/Unit/Metrics/FormatterTest.php  |  6 ++--
 tests/PHPUnit/Unit/Period/BasePeriodTest.php  | 33 +++++++++++++++++++
 tests/PHPUnit/Unit/Period/DayTest.php         | 14 +-------
 tests/PHPUnit/Unit/Period/MonthTest.php       | 13 +-------
 tests/PHPUnit/Unit/Period/RangeTest.php       | 11 +------
 tests/PHPUnit/Unit/Period/WeekTest.php        | 11 +------
 tests/PHPUnit/Unit/Period/YearTest.php        |  6 +---
 tests/PHPUnit/bootstrap.php                   |  3 ++
 14 files changed, 85 insertions(+), 62 deletions(-)
 create mode 100644 core/Intl/Locale.php
 create mode 100644 tests/PHPUnit/Unit/Period/BasePeriodTest.php

diff --git a/config/environment/test.php b/config/environment/test.php
index 95857fd134..0dfd6d9770 100644
--- a/config/environment/test.php
+++ b/config/environment/test.php
@@ -5,4 +5,10 @@ return array(
     // Disable logging
     'Psr\Log\LoggerInterface' => DI\object('Psr\Log\NullLogger'),
 
+    // Disable translation cache
+    'Piwik\Translation\Loader\LoaderInterface' => DI\object('Piwik\Translation\Loader\JsonFileLoader'),
+    // Disable loading core translations
+    'Piwik\Translation\Translator' => DI\object()
+        ->constructorParameter('directories', array()),
+
 );
diff --git a/core/Intl/Locale.php b/core/Intl/Locale.php
new file mode 100644
index 0000000000..7c18b727c5
--- /dev/null
+++ b/core/Intl/Locale.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Piwik\Intl;
+
+class Locale
+{
+    public static function setLocale($locale)
+    {
+        $localeVariant = str_replace('UTF-8', 'UTF8', $locale);
+
+        setlocale(LC_ALL, $locale, $localeVariant);
+        setlocale(LC_CTYPE, '');
+    }
+
+    public static function setDefaultLocale()
+    {
+        self::setLocale('en_US.UTF-8');
+    }
+}
diff --git a/core/Translate.php b/core/Translate.php
index 70f795245b..c828ed3d1d 100644
--- a/core/Translate.php
+++ b/core/Translate.php
@@ -31,10 +31,12 @@ class Translate
 
     public static function loadEnglishTranslation()
     {
+        self::loadCoreTranslation();
     }
 
     public static function unloadEnglishTranslation()
     {
+        self::getTranslator()->reset();
     }
 
     public static function reloadLanguage($language = false)
@@ -49,6 +51,7 @@ class Translate
      */
     public static function loadCoreTranslation($language = false)
     {
+        self::getTranslator()->addDirectory(PIWIK_INCLUDE_PATH . '/lang');
     }
 
     public static function mergeTranslationArray($translation)
@@ -67,7 +70,7 @@ class Translate
     /** Reset the cached language to load. Used in tests. */
     public static function reset()
     {
-        self::getTranslator()->setCurrentLanguage(null);
+        self::getTranslator()->reset();
     }
 
     /**
diff --git a/core/Translation/Translator.php b/core/Translation/Translator.php
index 7233882cd6..9d256b6940 100644
--- a/core/Translation/Translator.php
+++ b/core/Translation/Translator.php
@@ -177,6 +177,16 @@ class Translator
         $this->translations = array();
     }
 
+    /**
+     * Should be used by tests only, and this method should eventually be removed.
+     */
+    public function reset()
+    {
+        $this->currentLanguage = $this->getDefaultLanguage();
+        $this->directories = array();
+        $this->translations = array();
+    }
+
     /**
      * @param string $translation
      * @return null|string
diff --git a/plugins/LanguagesManager/LanguagesManager.php b/plugins/LanguagesManager/LanguagesManager.php
index 711de26648..afd60dc53d 100644
--- a/plugins/LanguagesManager/LanguagesManager.php
+++ b/plugins/LanguagesManager/LanguagesManager.php
@@ -15,6 +15,7 @@ use Piwik\Config;
 use Piwik\Container\StaticContainer;
 use Piwik\Cookie;
 use Piwik\Db;
+use Piwik\Intl\Locale;
 use Piwik\Piwik;
 use Piwik\Translate;
 use Piwik\Translation\Translator;
@@ -108,9 +109,7 @@ class LanguagesManager extends \Piwik\Plugin
         }
 
         $locale = $translator->translate('General_Locale');
-        $localeVariant = str_replace('UTF-8', 'UTF8', $locale);
-        setlocale(LC_ALL, $locale, $localeVariant);
-        setlocale(LC_CTYPE, '');
+        Locale::setLocale($locale);
     }
 
     public function deleteUserLanguage($userLogin)
diff --git a/tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php b/tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php
index fd9b996f50..6d7d18def3 100644
--- a/tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php
+++ b/tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php
@@ -7,6 +7,7 @@
  */
 namespace Piwik\Tests\Unit\Metrics\Formatter;
 
+use Piwik\Intl\Locale;
 use Piwik\Metrics\Formatter\Html;
 use Piwik\Translate;
 use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
@@ -34,8 +35,6 @@ class HtmlTest extends \PHPUnit_Framework_TestCase
 
         $this->formatter = new Html();
 
-        setlocale(LC_ALL, null);
-
         Translate::loadEnglishTranslation();
         $this->setSiteManagerApiMock();
     }
@@ -44,8 +43,6 @@ class HtmlTest extends \PHPUnit_Framework_TestCase
     {
         Translate::unloadEnglishTranslation();
         $this->unsetSiteManagerApiMock();
-
-        setlocale(LC_ALL, null);
     }
 
     public function test_getPrettyTimeFromSeconds_DefaultsToShowingSentences_AndUsesNonBreakingSpaces()
diff --git a/tests/PHPUnit/Unit/Metrics/FormatterTest.php b/tests/PHPUnit/Unit/Metrics/FormatterTest.php
index ce8c268b08..6cf3a8e502 100644
--- a/tests/PHPUnit/Unit/Metrics/FormatterTest.php
+++ b/tests/PHPUnit/Unit/Metrics/FormatterTest.php
@@ -7,6 +7,7 @@
  */
 namespace Piwik\Tests\Unit\Metrics;
 
+use Piwik\Intl\Locale;
 use Piwik\Metrics\Formatter;
 use Piwik\Translate;
 use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
@@ -50,8 +51,6 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
 
         $this->formatter = new Formatter();
 
-        setlocale(LC_ALL, null);
-
         Translate::loadEnglishTranslation();
         $this->setSiteManagerApiMock();
     }
@@ -60,8 +59,6 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
     {
         Translate::unloadEnglishTranslation();
         $this->unsetSiteManagerApiMock();
-
-        setlocale(LC_ALL, null);
     }
 
     /**
@@ -83,6 +80,7 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
         }
 
         $this->assertEquals($expected, $this->formatter->getPrettyNumber($number, 2));
+        Locale::setDefaultLocale();
     }
 
     /**
diff --git a/tests/PHPUnit/Unit/Period/BasePeriodTest.php b/tests/PHPUnit/Unit/Period/BasePeriodTest.php
new file mode 100644
index 0000000000..e6713b5f3d
--- /dev/null
+++ b/tests/PHPUnit/Unit/Period/BasePeriodTest.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Tests\Unit\Period;
+
+use Piwik\Container\StaticContainer;
+use Piwik\Translate;
+use Piwik\Translation\Translator;
+
+abstract class BasePeriodTest extends \PHPUnit_Framework_TestCase
+{
+    public function setUp()
+    {
+        parent::setUp();
+
+        Translate::loadCoreTranslation();
+        /** @var Translator $translator */
+        $translator = StaticContainer::getContainer()->get('Piwik\Translation\Translator');
+        $translator->addDirectory(PIWIK_INCLUDE_PATH . '/plugins/CoreHome/lang');
+    }
+
+    public function tearDown()
+    {
+        parent::tearDown();
+
+        Translate::reset();
+    }
+}
\ No newline at end of file
diff --git a/tests/PHPUnit/Unit/Period/DayTest.php b/tests/PHPUnit/Unit/Period/DayTest.php
index ae1ba01844..c2b4a05a5b 100644
--- a/tests/PHPUnit/Unit/Period/DayTest.php
+++ b/tests/PHPUnit/Unit/Period/DayTest.php
@@ -10,9 +10,8 @@ namespace Piwik\Tests\Unit\Period;
 
 use Piwik\Date;
 use Piwik\Period\Day;
-use Piwik\Translate;
 
-class Period_DayTest extends \PHPUnit_Framework_TestCase
+class DayTest extends BasePeriodTest
 {
     /**
      * @group Core
@@ -215,8 +214,6 @@ class Period_DayTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedShortString()
     {
-        $this->loadEnglishTranslation();
-
         $month = new Day(Date::factory('2024-10-09'));
         $shouldBe = 'Wed 9 Oct';
         $this->assertEquals($shouldBe, $month->getLocalizedShortString());
@@ -227,8 +224,6 @@ class Period_DayTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedLongString()
     {
-        $this->loadEnglishTranslation();
-
         $month = new Day(Date::factory('2024-10-09'));
         $shouldBe = 'Wednesday 9 October 2024';
         $this->assertEquals($shouldBe, $month->getLocalizedLongString());
@@ -239,15 +234,8 @@ class Period_DayTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetPrettyString()
     {
-        $this->loadEnglishTranslation();
-
         $month = new Day(Date::factory('2024-10-09'));
         $shouldBe = '2024-10-09';
         $this->assertEquals($shouldBe, $month->getPrettyString());
     }
-
-    private function loadEnglishTranslation()
-    {
-        Translate::reloadLanguage('en');
-    }
 }
\ No newline at end of file
diff --git a/tests/PHPUnit/Unit/Period/MonthTest.php b/tests/PHPUnit/Unit/Period/MonthTest.php
index 916f925e6d..6ef1c824e3 100644
--- a/tests/PHPUnit/Unit/Period/MonthTest.php
+++ b/tests/PHPUnit/Unit/Period/MonthTest.php
@@ -10,9 +10,8 @@ namespace Piwik\Tests\Unit\Period;
 
 use Piwik\Date;
 use Piwik\Period\Month;
-use Piwik\Translate;
 
-class Period_MonthTest extends \PHPUnit_Framework_TestCase
+class MonthTest extends BasePeriodTest
 {
     /**
      * testing december
@@ -271,8 +270,6 @@ class Period_MonthTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedShortString()
     {
-        $this->loadEnglishTranslation();
-
         $month = new Month(Date::factory('2024-10-09'));
         $shouldBe = 'Oct 2024';
         $this->assertEquals($shouldBe, $month->getLocalizedShortString());
@@ -283,8 +280,6 @@ class Period_MonthTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedLongString()
     {
-        $this->loadEnglishTranslation();
-
         $month = new Month(Date::factory('2024-10-09'));
         $shouldBe = '2024, October';
         $this->assertEquals($shouldBe, $month->getLocalizedLongString());
@@ -295,15 +290,9 @@ class Period_MonthTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetPrettyString()
     {
-        $this->loadEnglishTranslation();
-
         $month = new Month(Date::factory('2024-10-09'));
         $shouldBe = '2024-10';
         $this->assertEquals($shouldBe, $month->getPrettyString());
     }
 
-    private function loadEnglishTranslation()
-    {
-        Translate::reloadLanguage('en');
-    }
 }
\ No newline at end of file
diff --git a/tests/PHPUnit/Unit/Period/RangeTest.php b/tests/PHPUnit/Unit/Period/RangeTest.php
index 29c716d68b..c7896b638f 100644
--- a/tests/PHPUnit/Unit/Period/RangeTest.php
+++ b/tests/PHPUnit/Unit/Period/RangeTest.php
@@ -14,9 +14,8 @@ use Piwik\Period\Month;
 use Piwik\Period\Range;
 use Piwik\Period\Week;
 use Piwik\Period\Year;
-use Piwik\Translate;
 
-class Period_RangeTest extends \PHPUnit_Framework_TestCase
+class RangeTest extends BasePeriodTest
 {
     // test range 1
     /**
@@ -1272,7 +1271,6 @@ class Period_RangeTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedShortString()
     {
-        $this->loadEnglishTranslation();
         $month = new Range('range', '2000-12-09,2001-02-01');
         $shouldBe = '9 Dec 00 - 1 Feb 01';
         $this->assertEquals($shouldBe, $month->getLocalizedShortString());
@@ -1283,7 +1281,6 @@ class Period_RangeTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedLongString()
     {
-        $this->loadEnglishTranslation();
         $month = new Range('range', '2023-05-09,2023-05-21');
         $shouldBe = '8 May 23 - 21 May 23';
         $this->assertEquals($shouldBe, $month->getLocalizedLongString());
@@ -1294,7 +1291,6 @@ class Period_RangeTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetPrettyString()
     {
-        $this->loadEnglishTranslation();
         $month = new Range('range', '2007-02-09,2007-03-15');
         $shouldBe = 'From 2007-02-09 to 2007-03-15';
         $this->assertEquals($shouldBe, $month->getPrettyString());
@@ -1322,9 +1318,4 @@ class Period_RangeTest extends \PHPUnit_Framework_TestCase
         $range = new Range($period, 'last' . $lastN);
         $this->assertEquals($expectedLastN, $range->getNumberOfSubperiods());
     }
-
-    private function loadEnglishTranslation()
-    {
-        Translate::reloadLanguage('en');
-    }
 }
diff --git a/tests/PHPUnit/Unit/Period/WeekTest.php b/tests/PHPUnit/Unit/Period/WeekTest.php
index c543a2db5d..05f54b9942 100644
--- a/tests/PHPUnit/Unit/Period/WeekTest.php
+++ b/tests/PHPUnit/Unit/Period/WeekTest.php
@@ -10,9 +10,8 @@ namespace Piwik\Tests\Unit\Period;
 
 use Piwik\Date;
 use Piwik\Period\Week;
-use Piwik\Translate;
 
-class Period_WeekTest extends \PHPUnit_Framework_TestCase
+class WeekTest extends BasePeriodTest
 {
     /**
      * test week between 2 years
@@ -123,7 +122,6 @@ class Period_WeekTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedShortString()
     {
-        $this->loadEnglishTranslation();
         $week = new Week(Date::factory('2024-10-09'));
         $shouldBe = '7 Oct - 13 Oct 24';
         $this->assertEquals($shouldBe, $week->getLocalizedShortString());
@@ -134,7 +132,6 @@ class Period_WeekTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedLongString()
     {
-        $this->loadEnglishTranslation();
         $week = new Week(Date::factory('2024-10-09'));
         $shouldBe = 'Week 7 October - 13 October 2024';
         $this->assertEquals($shouldBe, $week->getLocalizedLongString());
@@ -145,14 +142,8 @@ class Period_WeekTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetPrettyString()
     {
-        $this->loadEnglishTranslation();
         $week = new Week(Date::factory('2024-10-09'));
         $shouldBe = 'From 2024-10-07 to 2024-10-13';
         $this->assertEquals($shouldBe, $week->getPrettyString());
     }
-
-    private function loadEnglishTranslation()
-    {
-        Translate::reloadLanguage('en');
-    }
 }
diff --git a/tests/PHPUnit/Unit/Period/YearTest.php b/tests/PHPUnit/Unit/Period/YearTest.php
index fad41535de..13d688bda9 100644
--- a/tests/PHPUnit/Unit/Period/YearTest.php
+++ b/tests/PHPUnit/Unit/Period/YearTest.php
@@ -10,9 +10,8 @@ namespace Piwik\Tests\Unit\Period;
 
 use Piwik\Date;
 use Piwik\Period\Year;
-use Piwik\Translate;
 
-class Period_YearTest extends \PHPUnit_Framework_TestCase
+class YearTest extends BasePeriodTest
 {
     /**
      * test normal case
@@ -70,7 +69,6 @@ class Period_YearTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedShortString()
     {
-        Translate::loadEnglishTranslation();
         $year = new Year(Date::factory('2024-10-09'));
         $shouldBe = '2024';
         $this->assertEquals($shouldBe, $year->getLocalizedShortString());
@@ -81,7 +79,6 @@ class Period_YearTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetLocalizedLongString()
     {
-        Translate::loadEnglishTranslation();
         $year = new Year(Date::factory('2024-10-09'));
         $shouldBe = '2024';
         $this->assertEquals($shouldBe, $year->getLocalizedLongString());
@@ -92,7 +89,6 @@ class Period_YearTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetPrettyString()
     {
-        Translate::loadEnglishTranslation();
         $year = new Year(Date::factory('2024-10-09'));
         $shouldBe = '2024';
         $this->assertEquals($shouldBe, $year->getPrettyString());
diff --git a/tests/PHPUnit/bootstrap.php b/tests/PHPUnit/bootstrap.php
index 1507ced00d..a0f9d5b349 100644
--- a/tests/PHPUnit/bootstrap.php
+++ b/tests/PHPUnit/bootstrap.php
@@ -3,6 +3,7 @@
 use Piwik\Container\StaticContainer;
 use Piwik\Http;
 use Piwik\Tests\Framework\Fixture;
+use Piwik\Intl\Locale;
 
 define('PIWIK_TEST_MODE', true);
 define('PIWIK_PRINT_ERROR_BACKTRACE', false);
@@ -58,6 +59,8 @@ foreach($fixturesToLoad as $fixturePath) {
     }
 }
 
+Locale::setDefaultLocale();
+
 function prepareServerVariables()
 {
     \Piwik\Config::getInstance()->init();
-- 
GitLab