Qiang Xue
12 years ago
2 changed files with 452 additions and 23 deletions
@ -0,0 +1,369 @@
|
||||
<?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 testActionTemplate() |
||||
{ |
||||
$configFileName = $this->configFileName; |
||||
$this->runMessageControllerAction('template', array($configFileName)); |
||||
$this->assertTrue(file_exists($configFileName), 'Unable to create config file template!'); |
||||
} |
||||
|
||||
public function testConfigFileNotExist() |
||||
{ |
||||
$this->setExpectedException('yii\\console\\Exception'); |
||||
$this->runMessageControllerAction('generate', 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('generate', 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('generate', 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('generate', 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('generate', 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, |
||||
'removeOld' => false, |
||||
)); |
||||
$this->runMessageControllerAction('generate', 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('generate', 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('generate', 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)); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue