|
|
|
<?php
|
|
|
|
|
|
|
|
use yiiunit\TestCase;
|
|
|
|
use yii\console\controllers\MessageController;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Unit test for [[\yii\console\controllers\MessageController]].
|
|
|
|
* @see MessageController
|
|
|
|
*
|
|
|
|
* @group console
|
|
|
|
*/
|
|
|
|
class MessageControllerTest extends TestCase
|
|
|
|
{
|
|
|
|
protected $sourcePath = '';
|
|
|
|
protected $messagePath = '';
|
|
|
|
protected $configFileName = '';
|
|
|
|
|
|
|
|
public function setUp()
|
|
|
|
{
|
|
|
|
$this->mockApplication();
|
|
|
|
$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', ['fake'], ['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 = [])
|
|
|
|
{
|
|
|
|
$controller = $this->createMessageController();
|
|
|
|
ob_start();
|
|
|
|
ob_implicit_flush(false);
|
|
|
|
$controller->run($actionId, $args);
|
|
|
|
return ob_get_clean();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates message command config file named as [[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 = [])
|
|
|
|
{
|
|
|
|
$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', [$configFileName]);
|
|
|
|
$this->assertTrue(file_exists($configFileName), 'Unable to create config file template!');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testConfigFileNotExist()
|
|
|
|
{
|
|
|
|
$this->setExpectedException('yii\\console\\Exception');
|
|
|
|
$this->runMessageControllerAction('extract', ['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([
|
|
|
|
'languages' => [$language],
|
|
|
|
'sourcePath' => $this->sourcePath,
|
|
|
|
'messagePath' => $this->messagePath,
|
|
|
|
]);
|
|
|
|
$this->runMessageControllerAction('extract', [$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([
|
|
|
|
'languages' => [$language],
|
|
|
|
'sourcePath' => $this->sourcePath,
|
|
|
|
'messagePath' => $this->messagePath,
|
|
|
|
]);
|
|
|
|
$this->runMessageControllerAction('extract', [$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', [$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, [
|
|
|
|
$existingMessage => $existingMessageContent
|
|
|
|
]);
|
|
|
|
|
|
|
|
$newMessage = 'test new message';
|
|
|
|
$sourceFileContent = "Yii::t('{$category}', '{$existingMessage}')";
|
|
|
|
$sourceFileContent .= "Yii::t('{$category}', '{$newMessage}')";
|
|
|
|
$this->createSourceFile($sourceFileContent);
|
|
|
|
|
|
|
|
$this->composeConfigFile([
|
|
|
|
'languages' => [$language],
|
|
|
|
'sourcePath' => $this->sourcePath,
|
|
|
|
'messagePath' => $this->messagePath,
|
|
|
|
'overwrite' => true,
|
|
|
|
]);
|
|
|
|
$this->runMessageControllerAction('extract', [$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, [
|
|
|
|
$oldMessage => $oldMessageContent
|
|
|
|
]);
|
|
|
|
|
|
|
|
$sourceFileContent = "Yii::t('{$category}', 'some new message')";
|
|
|
|
$this->createSourceFile($sourceFileContent);
|
|
|
|
|
|
|
|
$this->composeConfigFile([
|
|
|
|
'languages' => [$language],
|
|
|
|
'sourcePath' => $this->sourcePath,
|
|
|
|
'messagePath' => $this->messagePath,
|
|
|
|
'overwrite' => true,
|
|
|
|
'removeUnused' => false,
|
|
|
|
]);
|
|
|
|
$this->runMessageControllerAction('extract', [$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, [
|
|
|
|
$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([
|
|
|
|
'languages' => [$language],
|
|
|
|
'sourcePath' => $this->sourcePath,
|
|
|
|
'messagePath' => $this->messagePath,
|
|
|
|
'overwrite' => true,
|
|
|
|
]);
|
|
|
|
$this->runMessageControllerAction('extract', [$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 = [
|
|
|
|
'Yii::t',
|
|
|
|
'Custom::translate',
|
|
|
|
];
|
|
|
|
|
|
|
|
$sourceMessages = [
|
|
|
|
'first message',
|
|
|
|
'second message',
|
|
|
|
];
|
|
|
|
$sourceFileContent = '';
|
|
|
|
foreach ($sourceMessages as $key => $message) {
|
|
|
|
$sourceFileContent .= $translators[$key] . "('{$category}', '{$message}');\n";
|
|
|
|
}
|
|
|
|
$this->createSourceFile($sourceFileContent);
|
|
|
|
|
|
|
|
$this->composeConfigFile([
|
|
|
|
'languages' => [$language],
|
|
|
|
'sourcePath' => $this->sourcePath,
|
|
|
|
'messagePath' => $this->messagePath,
|
|
|
|
'translator' => $translators,
|
|
|
|
]);
|
|
|
|
$this->runMessageControllerAction('extract', [$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));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|