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.
 
 
 
 
 
 

329 lines
14 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
require_once(__DIR__ . '/../../language/CollectFiles.php');
require_once(__DIR__ . '/../../language/WriteFile.php');
require_once(__DIR__ . '/../../language/GetStrings.php');
require_once(__DIR__ . '/../../language/FileType.php');
require_once(__DIR__ . '/../../language/FileType/Php.php');
require_once(__DIR__ . '/../../language/FileType/Tpl.php');
use org\bovigo\vfs\vfsStream;
use org\bovigo\vfs\vfsStreamFile;
class Language_GetStringsTest extends TikiTestCase
{
/** @var Language_CollectFiles */
protected $collectFiles;
/** @var Language_FileType_Php */
protected $fileType;
/** @var Language_GetStrings */
protected $obj;
private $baseDir;
private $writeFileFactory;
private $writeFile;
protected function setUp(): void
{
$this->baseDir = __DIR__ . '/../../../';
$this->collectFiles = $this->createMock('Language_CollectFiles');
$this->fileType = $this->createMock('Language_FileType_Php');
$this->writeFileFactory = $this->createMock('Language_WriteFile_Factory');
$this->writeFile = $this->getMockBuilder('Language_WriteFile')
->onlyMethods(['writeStringsToFile'])
->disableOriginalConstructor()
->getMock();
$this->obj = new Language_GetStrings($this->collectFiles, $this->writeFileFactory, ['baseDir' => $this->baseDir]);
}
public function testConstructShouldRaiseExceptionForInvalidBaseDir(): void
{
$this->expectException('Language_Exception');
$this->obj = new Language_GetStrings($this->collectFiles, $this->writeFileFactory, ['baseDir' => 'invalidDir']);
}
public function testAddFileType(): void
{
$php = $this->createMock('Language_FileType_Php');
$php->expects($this->once())->method('getExtensions')->willReturn(['.php']);
$tpl = $this->createMock('Language_FileType_Tpl');
$tpl->expects($this->once())->method('getExtensions')->willReturn(['.tpl']);
$this->obj->addFileType($php);
$this->obj->addFileType($tpl);
$this->assertEquals(['.php', '.tpl'], $this->obj->getExtensions());
$this->assertEquals([$php, $tpl], $this->obj->getFileTypes());
}
public function testAddFileTypeShouldRaiseExceptionIfSameTypeIsAddedMoreThanOnce(): void
{
$this->expectException('Language_Exception');
$php = $this->createMock('Language_FileType_Php');
$php->expects($this->once(
))->method('getExtensions')->willReturn(['.php']);
$this->obj->addFileType($php);
$this->obj->addFileType($php);
}
public function testCollectStringsShouldRaiseExceptionIfEmptyFileTypes(): void
{
$this->expectException('Language_Exception');
$this->obj->collectStrings('file.php');
}
public function testCollectStringsShouldRaiseExceptionIfInvalidFileExtension(): void
{
$this->expectException('Language_Exception');
$this->fileType->method('getExtensions')->willReturn(['.php']);
$this->obj->addFileType($this->fileType);
$this->obj->collectStrings('file.');
}
public function testCollectStringsWithFileTypePhp(): void
{
$this->obj->addFileType(new Language_FileType_Php());
$strings = $this->obj->collectStrings(__DIR__ . '/fixtures/test_collecting_strings.php');
$expectedResult = ['%0 enabled', '%0 disabled', 'Features', 'Enable/disable Tiki features here, but configure them elsewhere',
'General', 'General preferences and settings', 'Login', 'User registration, login and authentication', 'Wiki', 'Wiki settings',
'Help on $admintitle Config', "Congratulations!\n\nYour server can send emails.\n\n",
];
$this->assertEquals($expectedResult, $strings);
}
public function testCollectStringsShouldCallRegexPostProcessMethodIfOneExists(): void
{
$php = $this->getMockBuilder('Language_FileType_Php')
->onlyMethods(['getExtensions', 'getCleanupRegexes', 'singleQuoted', 'doubleQuoted'])
->getMock();
$php->expects($this->exactly(2))->method('getExtensions')->willReturn(['.php']);
$php->expects($this->once())->method('getCleanupRegexes')->willReturn([]);
$php->expects($this->once(
))->method('singleQuoted')->willReturn([0 => '', 1 => '']);
$php->expects($this->once(
))->method('doubleQuoted')->willReturn([0 => '', 1 => '']);
$this->obj->addFileType($php);
$this->obj->addFileType(new Language_FileType_Tpl());
$this->obj->collectStrings(__DIR__ . '/fixtures/test_collecting_strings.php');
}
public function testCollectStringsWithFileTypeTpl(): void
{
$this->obj->addFileType(new Language_FileType_Tpl());
$strings = $this->obj->collectStrings(__DIR__ . '/fixtures/test_collecting_strings.tpl');
$expectedResult = ['Bytecode Cache', 'Using <strong>%0</strong>.These stats affect all PHP applications running on the server.',
'Configuration setting <em>xcache.admin.enable_auth</em> prevents from accessing statistics. This will also prevent the cache from being cleared when clearing template cache.',
'Used', 'Available', 'Memory', 'Hit', 'Miss', 'Cache Hits', 'Few hits recorded. Statistics may not be representative.',
'Low hit ratio. %0 may be misconfigured and not used.',
'Bytecode cache is not used. Using a bytecode cache (APC, XCache) is highly recommended for production environments.', 'Errors', 'Errors:', 'Created',
];
$this->assertEquals($expectedResult, $strings);
}
public function testCollectStringShouldNotConsiderEmptyCallsToTra(): void
{
$this->obj->addFileType(new Language_FileType_Php());
$fileName = 'file1.php';
$root = vfsStream::setup('root');
$file = new vfsStreamFile($fileName);
$file->setContent(
"'sub' => array(
'required' => false,
'default' => 'n',
'filter' => 'alpha',
'options' => array(
array('text' => tra(''), 'value' => ''),
array('text' => tra('Yes'), 'value' => 'y'),
array('text' => tra('No'), 'value' => 'n')
),
),"
);
$root->addChild($file);
$expectedResult = ['Yes', 'No'];
$this->assertEquals($expectedResult, $this->obj->collectStrings(vfsStream::url('root/' . $fileName)));
}
public function testRunShouldRaiseExceptionIfEmptyFileTypes(): void
{
$this->expectException('Language_Exception');
$this->obj->run();
}
public function testRunShouldReturnCollectedStrings(): void
{
$files = ['file1', 'file2', 'file3'];
$strings = [
'string1' => ['name' => 'string1'],
'string2' => ['name' => 'string2'],
'string3' => ['name' => 'string3'],
'string4' => ['name' => 'string4'],
];
$this->collectFiles->expects($this->once())->method('setExtensions');
$this->collectFiles->expects($this->once())->method('run')->with($this->baseDir)->willReturn($files);
$obj = $this->getMockBuilder('Language_GetStrings')
->onlyMethods(['collectStrings', 'writeToFiles'])
->setConstructorArgs([
$this->collectFiles,
$this->writeFileFactory,
['baseDir' => $this->baseDir]])
->getMock();
$obj->expects($this->once())->method('writeToFiles')->with($strings);
$obj->expects($this->at(0))->method('collectStrings')->with('file1')->willReturn(['string1', 'string2']);
$obj->expects($this->at(1))->method('collectStrings')->with('file2')->willReturn(['string2', 'string3']);
$obj->expects($this->at(2))->method('collectStrings')->with('file3')->willReturn(['string3', 'string4']);
$this->fileType->expects($this->once())->method('getExtensions')->willReturn(['.php']);
$obj->addFileType($this->fileType);
$this->assertNull($obj->run());
}
public function testSetLanguagesShouldSetLanguagesForArrayParam(): void
{
$languages = ['en', 'es', 'pt-br'];
$this->obj->setLanguages($languages);
$this->assertEquals($this->obj->getLanguages(), $languages);
}
public function testSetLanguagesShouldSetLanguagesForStringParam(): void
{
$language = 'en';
$this->obj->setLanguages($language);
$this->assertEquals($this->obj->getLanguages(), [$language]);
}
public function testSetLanguagesShouldRaiseExceptionForInvalidLanguage(): void
{
$languages = ['en', 'invalid'];
$this->expectException('Language_Exception');
$this->obj->setLanguages($languages);
}
public function testSetLanguagesShouldCallGetAllLanguagesIfLanguageParamIsNull(): void
{
$obj = $this->getMockBuilder('Language_GetStrings')
->onlyMethods(['getAllLanguages'])
->setConstructorArgs([$this->collectFiles, $this->writeFileFactory])
->getMock();
$obj->expects($this->once())->method('getAllLanguages');
$obj->setLanguages();
}
public function testWriteToFilesShouldCallWriteStringsThreeTimes(): void
{
$strings = ['string1', 'string2', 'string3', 'string4'];
$this->writeFile->expects($this->exactly(3))->method('writeStringsToFile')->with($strings, false);
$this->obj->setLanguages(['en', 'es', 'pt-br']);
$this->writeFileFactory->expects($this->at(0))->method('factory')
->willReturn($this->writeFile)
->with($this->stringContains('en/language.php'));
$this->writeFileFactory->expects($this->at(1))->method('factory')
->willReturn($this->writeFile)
->with($this->stringContains('es/language.php'));
$this->writeFileFactory->expects($this->at(2))->method('factory')
->willReturn($this->writeFile)
->with($this->stringContains('pt-br/language.php'));
$this->obj->writeToFiles($strings);
}
public function testWriteToFilesShouldCallWriteStringsWithOutputFileParam(): void
{
$strings = ['string1', 'string2', 'string3', 'string4'];
$this->writeFile->expects($this->atLeastOnce())->method('writeStringsToFile')->with($strings, true);
$this->writeFileFactory->expects($this->atLeastOnce())->method('factory')->willReturn($this->writeFile);
$obj = new Language_GetStrings($this->collectFiles, $this->writeFileFactory, ['outputFiles' => true, 'baseDir' => $this->baseDir]);
$obj->writeToFiles($strings);
}
public function testWriteToFilesShouldUseCustomFileName(): void
{
$strings = ['string1', 'string2', 'string3', 'string4'];
$this->writeFile->expects($this->once())->method('writeStringsToFile')->with($strings, false);
$this->writeFileFactory->expects($this->once())->method('factory')->with($this->stringContains('language_r.php'))->willReturn($this->writeFile);
$obj = new Language_GetStrings($this->collectFiles, $this->writeFileFactory, ['baseDir' => $this->baseDir, 'lang' => 'es', 'fileName' => 'language_r.php']);
$obj->writeToFiles($strings);
}
public function testScanFilesShouldReturnStringsFromFiles(): void
{
$files = ['file1', 'file2', 'file3'];
$strings = [
'string1' => ['name' => 'string1'],
'string2' => ['name' => 'string2'],
'string3' => ['name' => 'string3'],
'string4' => ['name' => 'string4'],
];
$obj = $this->getMockBuilder('Language_GetStrings')
->onlyMethods(['collectStrings', 'setLanguages'])
->setConstructorArgs([$this->collectFiles, $this->writeFileFactory])
->getMock();
$obj->expects($this->at(0))->method('collectStrings')->with('file1')->willReturn(['string1', 'string2']);
$obj->expects($this->at(1))->method('collectStrings')->with('file2')->willReturn(['string2', 'string3']);
$obj->expects($this->at(2))->method('collectStrings')->with('file3')->willReturn(['string3', 'string4']);
$this->assertEquals($strings, $obj->scanFiles($files));
}
public function testScanFilesShouldReturnInformationAboutTheFilesWhereTheStringsWereFound(): void
{
$files = ['file1', 'file2', 'file3'];
$strings = [
'string1' => ['name' => 'string1', 'files' => ['file1']],
'string2' => ['name' => 'string2', 'files' => ['file1', 'file2']],
'string3' => ['name' => 'string3', 'files' => ['file2', 'file3']],
'string4' => ['name' => 'string4', 'files' => ['file3']],
];
$obj = $this->getMockBuilder('Language_GetStrings')
->onlyMethods(['collectStrings', 'setLanguages'])
->setConstructorArgs([$this->collectFiles, $this->writeFileFactory, ['outputFiles' => true]])
->getMock();
$obj->expects($this->at(0))->method('collectStrings')->with('file1')->willReturn(['string1', 'string2']);
$obj->expects($this->at(1))->method('collectStrings')->with('file2')->willReturn(['string2', 'string3']);
$obj->expects($this->at(2))->method('collectStrings')->with('file3')->willReturn(['string3', 'string4']);
$this->assertEquals($strings, $obj->scanFiles($files));
}
}