You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
369 lines
11 KiB
369 lines
11 KiB
<?php |
|
|
|
use yiiunit\TestCase; |
|
use yii\console\controllers\MessageController; |
|
|
|
/** |
|
* Unit test for [[\yii\console\controllers\MessageController]]. |
|
* @see MessageController |
|
*/ |
|
class MessageControllerTest extends TestCase |
|
{ |
|
protected $sourcePath = ''; |
|
protected $messagePath = ''; |
|
protected $configFileName = ''; |
|
|
|
public function setUp() |
|
{ |
|
$this->sourcePath = Yii::getAlias('@yiiunit/runtime/test_source'); |
|
$this->createDir($this->sourcePath); |
|
if (!file_exists($this->sourcePath)) { |
|
$this->markTestIncomplete('Unit tests runtime directory should have writable permissions!'); |
|
} |
|
$this->messagePath = Yii::getAlias('@yiiunit/runtime/test_messages'); |
|
$this->createDir($this->messagePath); |
|
$this->configFileName = Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . 'message_controller_test_config.php'; |
|
} |
|
|
|
public function tearDown() |
|
{ |
|
$this->removeDir($this->sourcePath); |
|
$this->removeDir($this->messagePath); |
|
if (file_exists($this->configFileName)) { |
|
unlink($this->configFileName); |
|
} |
|
} |
|
|
|
/** |
|
* Creates directory. |
|
* @param $dirName directory full name |
|
*/ |
|
protected function createDir($dirName) |
|
{ |
|
if (!file_exists($dirName)) { |
|
mkdir($dirName, 0777, true); |
|
} |
|
} |
|
|
|
/** |
|
* Removes directory. |
|
* @param $dirName directory full name |
|
*/ |
|
protected function removeDir($dirName) |
|
{ |
|
if (!empty($dirName) && file_exists($dirName)) { |
|
$this->removeFileSystemObject($dirName); |
|
} |
|
} |
|
|
|
/** |
|
* Removes file system object: directory or file. |
|
* @param string $fileSystemObjectFullName file system object full name. |
|
*/ |
|
protected function removeFileSystemObject($fileSystemObjectFullName) |
|
{ |
|
if (!is_dir($fileSystemObjectFullName)) { |
|
unlink($fileSystemObjectFullName); |
|
} else { |
|
$dirHandle = opendir($fileSystemObjectFullName); |
|
while (($fileSystemObjectName = readdir($dirHandle)) !== false) { |
|
if ($fileSystemObjectName==='.' || $fileSystemObjectName==='..') { |
|
continue; |
|
} |
|
$this->removeFileSystemObject($fileSystemObjectFullName . DIRECTORY_SEPARATOR . $fileSystemObjectName); |
|
} |
|
closedir($dirHandle); |
|
rmdir($fileSystemObjectFullName); |
|
} |
|
} |
|
|
|
/** |
|
* Creates test message controller instance. |
|
* @return MessageController message command instance. |
|
*/ |
|
protected function createMessageController() |
|
{ |
|
$module = $this->getMock('yii\\base\\Module', array('fake'), array('console')); |
|
$messageController = new MessageController('message', $module); |
|
$messageController->interactive = false; |
|
return $messageController; |
|
} |
|
|
|
/** |
|
* Emulates running of the message controller action. |
|
* @param string $actionId id of action to be run. |
|
* @param array $args action arguments. |
|
* @return string command output. |
|
*/ |
|
protected function runMessageControllerAction($actionId, array $args = array()) |
|
{ |
|
$controller = $this->createMessageController(); |
|
ob_start(); |
|
ob_implicit_flush(false); |
|
$params = array( |
|
\yii\console\Request::ANONYMOUS_PARAMS => $args |
|
); |
|
$controller->run($actionId, $params); |
|
return ob_get_clean(); |
|
} |
|
|
|
/** |
|
* Creates message command config file at {@link configFileName} |
|
* @param array $config message command config. |
|
*/ |
|
protected function composeConfigFile(array $config) |
|
{ |
|
if (file_exists($this->configFileName)) { |
|
unlink($this->configFileName); |
|
} |
|
$fileContent = '<?php return ' . var_export($config, true) . ';'; |
|
file_put_contents($this->configFileName, $fileContent); |
|
} |
|
|
|
/** |
|
* Creates source file with given content |
|
* @param string $content file content |
|
* @param string|null $name file self name |
|
*/ |
|
protected function createSourceFile($content, $name = null) |
|
{ |
|
if (empty($name)) { |
|
$name = md5(uniqid()) . '.php'; |
|
} |
|
file_put_contents($this->sourcePath . DIRECTORY_SEPARATOR . $name, $content); |
|
} |
|
|
|
/** |
|
* Creates message file with given messages. |
|
* @param string $name file name |
|
* @param array $messages messages. |
|
*/ |
|
protected function createMessageFile($name, array $messages = array()) |
|
{ |
|
$fileName = $this->messagePath . DIRECTORY_SEPARATOR . $name; |
|
if (file_exists($fileName)) { |
|
unlink($fileName); |
|
} else { |
|
$dirName = dirname($fileName); |
|
if (!file_exists($dirName)) { |
|
mkdir($dirName, 0777, true); |
|
} |
|
} |
|
$fileContent = '<?php return ' . var_export($messages, true) . ';'; |
|
file_put_contents($fileName, $fileContent); |
|
} |
|
|
|
// Tests: |
|
|
|
public function testActionConfig() |
|
{ |
|
$configFileName = $this->configFileName; |
|
$this->runMessageControllerAction('config', array($configFileName)); |
|
$this->assertTrue(file_exists($configFileName), 'Unable to create config file template!'); |
|
} |
|
|
|
public function testConfigFileNotExist() |
|
{ |
|
$this->setExpectedException('yii\\console\\Exception'); |
|
$this->runMessageControllerAction('extract', array('not_existing_file.php')); |
|
} |
|
|
|
public function testCreateTranslation() |
|
{ |
|
$language = 'en'; |
|
|
|
$category = 'test_category'; |
|
$message = 'test message'; |
|
$sourceFileContent = "Yii::t('{$category}', '{$message}')"; |
|
$this->createSourceFile($sourceFileContent); |
|
|
|
$this->composeConfigFile(array( |
|
'languages' => array($language), |
|
'sourcePath' => $this->sourcePath, |
|
'messagePath' => $this->messagePath, |
|
)); |
|
$this->runMessageControllerAction('extract', array($this->configFileName)); |
|
|
|
$this->assertTrue(file_exists($this->messagePath . DIRECTORY_SEPARATOR . $language), 'No language dir created!'); |
|
$messageFileName = $this->messagePath . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $category . '.php'; |
|
$this->assertTrue(file_exists($messageFileName), 'No message file created!'); |
|
$messages = require($messageFileName); |
|
$this->assertTrue(is_array($messages), 'Unable to compose messages!'); |
|
$this->assertTrue(array_key_exists($message, $messages), 'Source message is missing!'); |
|
} |
|
|
|
/** |
|
* @depends testCreateTranslation |
|
*/ |
|
public function testNothingNew() |
|
{ |
|
$language = 'en'; |
|
|
|
$category = 'test_category'; |
|
$message = 'test message'; |
|
$sourceFileContent = "Yii::t('{$category}', '{$message}')"; |
|
$this->createSourceFile($sourceFileContent); |
|
|
|
$this->composeConfigFile(array( |
|
'languages' => array($language), |
|
'sourcePath' => $this->sourcePath, |
|
'messagePath' => $this->messagePath, |
|
)); |
|
$this->runMessageControllerAction('extract', array($this->configFileName)); |
|
|
|
$messageFileName = $this->messagePath . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $category . '.php'; |
|
|
|
// check file not overwritten: |
|
$messageFileContent = file_get_contents($messageFileName); |
|
$messageFileContent .= '// some not generated by command content'; |
|
file_put_contents($messageFileName, $messageFileContent); |
|
|
|
$this->runMessageControllerAction('extract', array($this->configFileName)); |
|
|
|
$this->assertEquals($messageFileContent, file_get_contents($messageFileName)); |
|
} |
|
|
|
/** |
|
* @depends testCreateTranslation |
|
*/ |
|
public function testMerge() |
|
{ |
|
$language = 'en'; |
|
$category = 'test_category'; |
|
$messageFileName = $language . DIRECTORY_SEPARATOR . $category . '.php'; |
|
|
|
$existingMessage = 'test existing message'; |
|
$existingMessageContent = 'test existing message content'; |
|
$this->createMessageFile($messageFileName, array( |
|
$existingMessage => $existingMessageContent |
|
)); |
|
|
|
$newMessage = 'test new message'; |
|
$sourceFileContent = "Yii::t('{$category}', '{$existingMessage}')"; |
|
$sourceFileContent .= "Yii::t('{$category}', '{$newMessage}')"; |
|
$this->createSourceFile($sourceFileContent); |
|
|
|
$this->composeConfigFile(array( |
|
'languages' => array($language), |
|
'sourcePath' => $this->sourcePath, |
|
'messagePath' => $this->messagePath, |
|
'overwrite' => true, |
|
)); |
|
$this->runMessageControllerAction('extract', array($this->configFileName)); |
|
|
|
$messages = require($this->messagePath . DIRECTORY_SEPARATOR . $messageFileName); |
|
$this->assertTrue(array_key_exists($newMessage, $messages), 'Unable to add new message!'); |
|
$this->assertTrue(array_key_exists($existingMessage, $messages), 'Unable to keep existing message!'); |
|
$this->assertEquals('', $messages[$newMessage], 'Wrong new message content!'); |
|
$this->assertEquals($existingMessageContent, $messages[$existingMessage], 'Unable to keep existing message content!'); |
|
} |
|
|
|
/** |
|
* @depends testMerge |
|
*/ |
|
public function testNoLongerNeedTranslation() |
|
{ |
|
$language = 'en'; |
|
$category = 'test_category'; |
|
$messageFileName = $language . DIRECTORY_SEPARATOR . $category . '.php'; |
|
|
|
$oldMessage = 'test old message'; |
|
$oldMessageContent = 'test old message content'; |
|
$this->createMessageFile($messageFileName, array( |
|
$oldMessage => $oldMessageContent |
|
)); |
|
|
|
$sourceFileContent = "Yii::t('{$category}', 'some new message')"; |
|
$this->createSourceFile($sourceFileContent); |
|
|
|
$this->composeConfigFile(array( |
|
'languages' => array($language), |
|
'sourcePath' => $this->sourcePath, |
|
'messagePath' => $this->messagePath, |
|
'overwrite' => true, |
|
'removeUnused' => false, |
|
)); |
|
$this->runMessageControllerAction('extract', array($this->configFileName)); |
|
|
|
$messages = require($this->messagePath . DIRECTORY_SEPARATOR . $messageFileName); |
|
|
|
$this->assertTrue(array_key_exists($oldMessage, $messages), 'No longer needed message removed!'); |
|
$this->assertEquals('@@' . $oldMessageContent . '@@', $messages[$oldMessage], 'No longer needed message content does not marked properly!'); |
|
} |
|
|
|
/** |
|
* @depends testMerge |
|
*/ |
|
public function testMergeWithContentZero() |
|
{ |
|
$language = 'en'; |
|
$category = 'test_category'; |
|
$messageFileName = $language . DIRECTORY_SEPARATOR . $category . '.php'; |
|
|
|
$zeroMessage = 'test zero message'; |
|
$zeroMessageContent = '0'; |
|
$falseMessage = 'test false message'; |
|
$falseMessageContent = 'false'; |
|
$this->createMessageFile($messageFileName, array( |
|
$zeroMessage => $zeroMessageContent, |
|
$falseMessage => $falseMessageContent, |
|
)); |
|
|
|
$newMessage = 'test new message'; |
|
$sourceFileContent = "Yii::t('{$category}', '{$zeroMessage}')"; |
|
$sourceFileContent .= "Yii::t('{$category}', '{$falseMessage}')"; |
|
$sourceFileContent .= "Yii::t('{$category}', '{$newMessage}')"; |
|
$this->createSourceFile($sourceFileContent); |
|
|
|
$this->composeConfigFile(array( |
|
'languages' => array($language), |
|
'sourcePath' => $this->sourcePath, |
|
'messagePath' => $this->messagePath, |
|
'overwrite' => true, |
|
)); |
|
$this->runMessageControllerAction('extract', array($this->configFileName)); |
|
|
|
$messages = require($this->messagePath . DIRECTORY_SEPARATOR . $messageFileName); |
|
$this->assertTrue($zeroMessageContent === $messages[$zeroMessage], 'Message content "0" is lost!'); |
|
$this->assertTrue($falseMessageContent === $messages[$falseMessage], 'Message content "false" is lost!'); |
|
} |
|
|
|
/** |
|
* @depends testCreateTranslation |
|
*/ |
|
public function testMultiplyTranslators() |
|
{ |
|
$language = 'en'; |
|
$category = 'test_category'; |
|
|
|
$translators = array( |
|
'Yii::t', |
|
'Custom::translate', |
|
); |
|
|
|
$sourceMessages = array( |
|
'first message', |
|
'second message', |
|
); |
|
$sourceFileContent = ''; |
|
foreach ($sourceMessages as $key => $message) { |
|
$sourceFileContent .= $translators[$key] . "('{$category}', '{$message}');\n"; |
|
} |
|
$this->createSourceFile($sourceFileContent); |
|
|
|
$this->composeConfigFile(array( |
|
'languages' => array($language), |
|
'sourcePath' => $this->sourcePath, |
|
'messagePath' => $this->messagePath, |
|
'translator' => $translators, |
|
)); |
|
$this->runMessageControllerAction('extract', array($this->configFileName)); |
|
|
|
$messageFileName = $this->messagePath . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $category . '.php'; |
|
$messages = require($messageFileName); |
|
|
|
foreach ($sourceMessages as $sourceMessage) { |
|
$this->assertTrue(array_key_exists($sourceMessage, $messages)); |
|
} |
|
} |
|
}
|
|
|