Skip to content
Extraits de code Groupes Projets
Valider eb22c13f rédigé par sgiehl's avatar sgiehl
Parcourir les fichiers

code improvements; added missing tests

parent c6fff1ae
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -99,10 +99,16 @@ class Writer ...@@ -99,10 +99,16 @@ class Writer
/** /**
* @param string $language ISO 639-1 alpha-2 language code * @param string $language ISO 639-1 alpha-2 language code
*
* @throws \Exception
*/ */
public function setLanguage($language) public function setLanguage($language)
{ {
$this->_language = $language; if (!preg_match('/^([a-z]{2,3}(-[a-z]{2,3})?)$/i', $language)) {
throw new Exception(Piwik_TranslateException('General_ExceptionLanguageFileNotFound', array($language)));
}
$this->_language = strtolower($language);
} }
/** /**
...@@ -185,21 +191,8 @@ class Writer ...@@ -185,21 +191,8 @@ class Writer
{ {
if (empty($lang)) $lang = $this->getLanguage(); if (empty($lang)) $lang = $this->getLanguage();
if (!Common::isValidFilename($lang) ||
($base !== 'lang' && $base !== 'tmp')
) {
throw new Exception(Piwik_TranslateException('General_ExceptionLanguageFileNotFound', array($lang)));
}
if (!empty($this->_pluginName)) { if (!empty($this->_pluginName)) {
$installedPlugins = PluginsManager::getInstance()->readPluginsDirectory();
if (!in_array($this->_pluginName, $installedPlugins)) {
throw new Exception(Piwik_TranslateException('General_ExceptionLanguageFileNotFound', array($lang)));
}
if ($base == 'tmp') { if ($base == 'tmp') {
return sprintf('%s/tmp/plugins/%s/lang/%s.json', PIWIK_INCLUDE_PATH, $this->_pluginName, $lang); return sprintf('%s/tmp/plugins/%s/lang/%s.json', PIWIK_INCLUDE_PATH, $this->_pluginName, $lang);
} else { } else {
......
...@@ -30,7 +30,7 @@ class ByBaseTranslationsTest extends PHPUnit_Framework_TestCase ...@@ -30,7 +30,7 @@ class ByBaseTranslationsTest extends PHPUnit_Framework_TestCase
'test' => array() 'test' => array()
), ),
), ),
// empty values/plugins are removed // not existing values/plugins are removed
array( array(
array( array(
'test' => array( 'test' => array(
...@@ -55,7 +55,7 @@ class ByBaseTranslationsTest extends PHPUnit_Framework_TestCase ...@@ -55,7 +55,7 @@ class ByBaseTranslationsTest extends PHPUnit_Framework_TestCase
) )
), ),
), ),
// no change if no empty value // no change if all exist
array( array(
array( array(
'test' => array( 'test' => array(
...@@ -74,7 +74,7 @@ class ByBaseTranslationsTest extends PHPUnit_Framework_TestCase ...@@ -74,7 +74,7 @@ class ByBaseTranslationsTest extends PHPUnit_Framework_TestCase
), ),
array() array()
), ),
// empty values are removed, others stay // unavailable removed, others stay
array( array(
array( array(
'empty' => array( 'empty' => array(
...@@ -107,6 +107,38 @@ class ByBaseTranslationsTest extends PHPUnit_Framework_TestCase ...@@ -107,6 +107,38 @@ class ByBaseTranslationsTest extends PHPUnit_Framework_TestCase
) )
) )
), ),
array(
array(
'empty' => array(
'test' => 'test'
),
'test' => array(
'test' => 'test',
'empty' => ' ',
)
),
array(
'empty' => array(
'bla' => 'test'
),
'test' => array(
'test' => 'test',
)
),
array(
'test' => array(
'test' => 'test'
)
),
array(
'empty' => array(
'test' => 'test'
),
'test' => array(
'empty' => ' ',
)
)
),
); );
} }
......
...@@ -7,8 +7,14 @@ use Piwik\Translate\Validate\CoreTranslations; ...@@ -7,8 +7,14 @@ use Piwik\Translate\Validate\CoreTranslations;
* @link http://piwik.org * @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/ */
class BaseTranslationsTest extends PHPUnit_Framework_TestCase class CoreTranslationsTest extends PHPUnit_Framework_TestCase
{ {
public function setUp()
{
include PIWIK_INCLUDE_PATH . '/core/DataFiles/Languages.php';
include PIWIK_INCLUDE_PATH . '/core/DataFiles/Countries.php';
}
public function getFilterTestDataValid() public function getFilterTestDataValid()
{ {
return array( return array(
...@@ -127,9 +133,6 @@ class BaseTranslationsTest extends PHPUnit_Framework_TestCase ...@@ -127,9 +133,6 @@ class BaseTranslationsTest extends PHPUnit_Framework_TestCase
*/ */
public function testFilterInvalid($translations, $msg) public function testFilterInvalid($translations, $msg)
{ {
include PIWIK_INCLUDE_PATH . '/core/DataFiles/Languages.php';
include PIWIK_INCLUDE_PATH . '/core/DataFiles/Countries.php';
$filter = new CoreTranslations(); $filter = new CoreTranslations();
$result = $filter->isValid($translations); $result = $filter->isValid($translations);
$this->assertFalse($result); $this->assertFalse($result);
......
<?php <?php
use Piwik\Common; use Piwik\Common;
use Piwik\Translate\Writer; use Piwik\Translate\Writer;
use Piwik\Translate\Validate\CoreTranslations;
/** /**
* Piwik - Open source web analytics * Piwik - Open source web analytics
...@@ -50,36 +51,166 @@ class WriterTest extends PHPUnit_Framework_TestCase ...@@ -50,36 +51,166 @@ class WriterTest extends PHPUnit_Framework_TestCase
/** /**
* @group Core * @group Core
* @group Translate * @group Translate
* @ expectedException Exception
* @dataProvider getExceptionalTranslations
*/
public function testSetTranslationsThrowsException($translations, $error)
{
$writer = new Writer('de');
try {
$writer->setTranslations($translations);
$this->fail('Exception not thrown');
} catch (Exception $e) {
$this->assertEquals($error, $e->getMessage());
}
}
public function getExceptionalTranslations()
{
$translations = json_decode(file_get_contents(PIWIK_INCLUDE_PATH.'/lang/de.json'), true);
return array(
array(array('test' => array('test' => 'test')), CoreTranslations::__ERRORSTATE_MINIMUMTRANSLATIONS__),
array(array('General' => array('Locale' => '')) + $translations, CoreTranslations::__ERRORSTATE_LOCALEREQUIRED__),
array(array('General' => array('Locale' => 'de_DE.UTF-8')) + $translations, CoreTranslations::__ERRORSTATE_TRANSLATORINFOREQUIRED__),
array(array('General' => array('Locale' => 'de_DE.UTF-8',
'TranslatorName' => 'name')) + $translations, CoreTranslations::__ERRORSTATE_TRANSLATOREMAILREQUIRED__),
array(array('General' => array('Locale' => 'de_DE.UTF-8',
'TranslatorName' => 'name',
'TranslatorEmail' => 'name@domain.com',
'LayoutDirection' => 'fail')) + $translations, CoreTranslations::__ERRORSTATE_LAYOUTDIRECTIONINVALID__),
array(array('General' => array('Locale' => 'invalid',
'TranslatorName' => 'name',
'TranslatorEmail' => 'name@domain.com')) + $translations, CoreTranslations::__ERRORSTATE_LOCALEINVALID__),
array(array('General' => array('Locale' => 'xx_DE.UTF-8',
'TranslatorName' => 'name',
'TranslatorEmail' => 'name@domain.com',)) + $translations, CoreTranslations::__ERRORSTATE_LOCALEINVALIDLANGUAGE__),
array(array('General' => array('Locale' => 'de_XX.UTF-8',
'TranslatorName' => 'name',
'TranslatorEmail' => 'name@domain.com',)) + $translations, CoreTranslations::__ERRORSTATE_LOCALEINVALIDCOUNTRY__),
array(array('General' => array('Locale' => '<script>')) + $translations, 'script tags restricted for language files'),
);
}
/**
* @group Core
* @group Translate
* @group Translate_Write
*/ */
public function testSaveTranslation() public function testSaveTranslation()
{ {
$translations = array( $translations = json_decode(file_get_contents(PIWIK_INCLUDE_PATH.'/lang/en.json'), true);
'General' => array(
'Locale' => 'en_CA.UTF-8', $translationsToWrite = array();
'Id' => 'Id' $translationsToWrite['General'] = $translations['General'];
), $translationsToWrite['UserLanguage'] = $translations['UserLanguage'];
'Goals' => array( $translationsToWrite['UserCountry'] = $translations['UserCountry'];
'Goals' => 'Goals',
), $translationsToWrite['General']['Yes'] = 'string with %1$s';
'Plugin' => array( $translationsToWrite['Plugin'] = array(
'Body' => "Message\nBody" 'Body' => "Message\nBody"
)
); );
$translationWriter = new Writer('en', ''); $translationWriter = new Writer('fr');
$translationWriter->setTranslations($translations); $translationWriter->setTranslations($translationsToWrite);
$rc = $translationWriter->saveTemporary(); $rc = $translationWriter->saveTemporary();
$this->assertNotEquals(false, $rc); $this->assertGreaterThan(50000, $rc);
$contents = file_get_contents(PIWIK_DOCUMENT_ROOT.'/tmp/en.json'); $this->assertCount(4, $translationWriter->getErrors());
}
$options = 0; /**
if (defined('JSON_UNESCAPED_UNICODE')) $options |= JSON_UNESCAPED_UNICODE; * @group Core
if (defined('JSON_PRETTY_PRINT')) $options |= JSON_PRETTY_PRINT; * @group Translate
* @dataProvider getTranslationPathTestData
*/
public function testGetTranslationsPath($language, $plugin, $path)
{
$writer = new Writer($language, $plugin);
$this->assertEquals($path, $writer->getTranslationPath());
}
$expected = json_encode(json_decode('{"General":{"Locale":"en_CA.UTF-8","Id":"Id"},"Goals":{"Goals":"Goals"}}', true), $options); public function getTranslationPathTestData()
{
return array(
array('de', null, PIWIK_INCLUDE_PATH . '/lang/de.json'),
array('te', null, PIWIK_INCLUDE_PATH . '/lang/te.json'),
array('de', 'CoreHome', PIWIK_INCLUDE_PATH . '/plugins/CoreHome/lang/de.json'),
array('pt-br', 'Actions', PIWIK_INCLUDE_PATH . '/plugins/Actions/lang/pt-br.json'),
);
}
$this->assertEquals($expected, $contents); /**
* @group Core
* @group Translate
* @dataProvider getTranslationPathTemporaryTestData
*/
public function testGetTemporaryTranslationPath($language, $plugin, $path)
{
$writer = new Writer($language, $plugin);
$this->assertEquals($path, $writer->getTemporaryTranslationPath());
}
public function getTranslationPathTemporaryTestData()
{
return array(
array('de', null, PIWIK_INCLUDE_PATH . '/tmp/de.json'),
array('te', null, PIWIK_INCLUDE_PATH . '/tmp/te.json'),
array('de', 'CoreHome', PIWIK_INCLUDE_PATH . '/tmp/plugins/CoreHome/lang/de.json'),
array('pt-br', 'Actions', PIWIK_INCLUDE_PATH . '/tmp/plugins/Actions/lang/pt-br.json'),
);
}
/**
* @group Core
* @group Translate
* @dataProvider getValidLanguages
*/
public function testSetLanguageValid($language)
{
$writer = new Writer('en', null);
$writer->setLanguage($language);
$this->assertEquals(strtolower($language), $writer->getLanguage());
}
public function getValidLanguages()
{
return array(
array('de'),
array('te'),
array('pt-br'),
array('tzm'),
array('abc'),
array('de-de'),
array('DE'),
array('DE-DE'),
array('DE-de'),
);
}
/**
* @group Core
* @group Translate
* @expectedException Exception
* @dataProvider getInvalidLanguages
*/
public function testSetLanguageInvalid($language)
{
$writer = new Writer('en', null);
$writer->setLanguage($language);
}
public function getInvalidLanguages()
{
return array(
array(''),
array('abcd'),
array('pt-brfr'),
array('00'),
array('a-b'),
array('x3'),
array('X4-fd'),
array('12-34'),
array('$§'),
);
} }
} }
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter