diff options
Diffstat (limited to 'tests/lib/L10N/FactoryTest.php')
-rw-r--r-- | tests/lib/L10N/FactoryTest.php | 674 |
1 files changed, 415 insertions, 259 deletions
diff --git a/tests/lib/L10N/FactoryTest.php b/tests/lib/L10N/FactoryTest.php index 33094f053d8..8c15baba9f6 100644 --- a/tests/lib/L10N/FactoryTest.php +++ b/tests/lib/L10N/FactoryTest.php @@ -1,67 +1,74 @@ <?php + +declare(strict_types=1); + /** - * Copyright (c) 2016 Joas Schilling <nickvergessen@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace Test\L10N; use OC\L10N\Factory; use OC\L10N\LanguageNotFoundException; +use OCP\App\AppPathNotFoundException; +use OCP\App\IAppManager; +use OCP\ICacheFactory; use OCP\IConfig; use OCP\IRequest; use OCP\IUser; use OCP\IUserSession; use OCP\L10N\ILanguageIterator; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; -/** - * Class FactoryTest - * - * @package Test\L10N - */ class FactoryTest extends TestCase { - - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IConfig|MockObject */ protected $config; - /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IRequest|MockObject */ protected $request; - /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IUserSession|MockObject */ protected $userSession; + /** @var ICacheFactory|MockObject */ + protected $cacheFactory; + /** @var string */ protected $serverRoot; + /** @var IAppManager|MockObject */ + protected IAppManager $appManager; + protected function setUp(): void { parent::setUp(); - $this->config = $this->getMockBuilder(IConfig::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->request = $this->getMockBuilder(IRequest::class) - ->disableOriginalConstructor() - ->getMock(); - - $this->userSession = $this->getMockBuilder(IUserSession::class) - ->disableOriginalConstructor() - ->getMock(); + $this->config = $this->createMock(IConfig::class); + $this->request = $this->createMock(IRequest::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->cacheFactory = $this->createMock(ICacheFactory::class); + $this->appManager = $this->createMock(IAppManager::class); $this->serverRoot = \OC::$SERVERROOT; + + $this->config + ->method('getSystemValueBool') + ->willReturnMap([ + ['installed', false, true], + ]); } /** - * @param array $methods + * @param string[] $methods * @param bool $mockRequestGetHeaderMethod - * @return Factory|\PHPUnit\Framework\MockObject\MockObject + * + * @return Factory|MockObject */ protected function getFactory(array $methods = [], $mockRequestGetHeaderMethod = false) { if ($mockRequestGetHeaderMethod) { - $this->request->expects($this->any()) + $this->request->expects(self::any()) ->method('getHeader') ->willReturn(''); } @@ -72,239 +79,192 @@ class FactoryTest extends TestCase { $this->config, $this->request, $this->userSession, + $this->cacheFactory, $this->serverRoot, + $this->appManager, ]) - ->setMethods($methods) + ->onlyMethods($methods) ->getMock(); - } else { - return new Factory($this->config, $this->request, $this->userSession, $this->serverRoot); } + + return new Factory($this->config, $this->request, $this->userSession, $this->cacheFactory, $this->serverRoot, $this->appManager); } - public function dataFindAvailableLanguages() { + public static function dataFindAvailableLanguages(): array { return [ [null], ['files'], ]; } - public function testFindLanguageWithExistingRequestLanguageAndNoApp() { + public function testFindLanguageWithExistingRequestLanguageAndNoApp(): void { $factory = $this->getFactory(['languageExists']); $this->invokePrivate($factory, 'requestLanguage', ['de']); - $factory->expects($this->once()) + $factory->expects(self::once()) ->method('languageExists') ->with(null, 'de') ->willReturn(true); - $this->assertSame('de', $factory->findLanguage()); + self::assertSame('de', $factory->findLanguage()); } - public function testFindLanguageWithExistingRequestLanguageAndApp() { + public function testFindLanguageWithExistingRequestLanguageAndApp(): void { $factory = $this->getFactory(['languageExists']); $this->invokePrivate($factory, 'requestLanguage', ['de']); - $factory->expects($this->once()) - ->method('languageExists') - ->with('MyApp', 'de') - ->willReturn(true); + $factory->expects(self::once()) + ->method('languageExists') + ->with('MyApp', 'de') + ->willReturn(true); - $this->assertSame('de', $factory->findLanguage('MyApp')); + self::assertSame('de', $factory->findLanguage('MyApp')); } - public function testFindLanguageWithNotExistingRequestLanguageAndExistingStoredUserLanguage() { + public function testFindLanguageWithNotExistingRequestLanguageAndExistingStoredUserLanguage(): void { $factory = $this->getFactory(['languageExists']); $this->invokePrivate($factory, 'requestLanguage', ['de']); - $factory->expects($this->at(0)) - ->method('languageExists') - ->with('MyApp', 'de') - ->willReturn(false); - $this->config - ->expects($this->at(0)) - ->method('getSystemValue') - ->with('force_language', false) - ->willReturn(false); + $factory->expects($this->exactly(2)) + ->method('languageExists') + ->willReturnMap([ + ['MyApp', 'de', false], + ['MyApp', 'jp', true], + ]); $this->config - ->expects($this->at(1)) + ->expects($this->exactly(1)) ->method('getSystemValue') - ->with('installed', false) - ->willReturn(true); - $user = $this->getMockBuilder(IUser::class) - ->getMock(); - $user->expects($this->once()) + ->willReturnMap([ + ['force_language', false, false], + ]); + $user = $this->createMock(IUser::class); + $user->expects(self::once()) ->method('getUID') ->willReturn('MyUserUid'); $this->userSession - ->expects($this->exactly(2)) + ->expects(self::exactly(2)) ->method('getUser') ->willReturn($user); $this->config - ->expects($this->once()) - ->method('getUserValue') - ->with('MyUserUid', 'core', 'lang', null) - ->willReturn('jp'); - $factory->expects($this->at(1)) - ->method('languageExists') - ->with('MyApp', 'jp') - ->willReturn(true); + ->expects(self::once()) + ->method('getUserValue') + ->with('MyUserUid', 'core', 'lang', null) + ->willReturn('jp'); - $this->assertSame('jp', $factory->findLanguage('MyApp')); + self::assertSame('jp', $factory->findLanguage('MyApp')); } - public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguage() { + public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguage(): void { $factory = $this->getFactory(['languageExists'], true); $this->invokePrivate($factory, 'requestLanguage', ['de']); - $factory->expects($this->at(0)) - ->method('languageExists') - ->with('MyApp', 'de') - ->willReturn(false); + $factory->expects($this->exactly(3)) + ->method('languageExists') + ->willReturnMap([ + ['MyApp', 'de', false], + ['MyApp', 'jp', false], + ['MyApp', 'es', true], + ]); $this->config - ->expects($this->at(0)) + ->expects($this->exactly(2)) ->method('getSystemValue') - ->with('force_language', false) - ->willReturn(false); - $this->config - ->expects($this->at(1)) - ->method('getSystemValue') - ->with('installed', false) - ->willReturn(true); - $user = $this->getMockBuilder(IUser::class) - ->getMock(); - $user->expects($this->once()) - ->method('getUID') - ->willReturn('MyUserUid'); + ->willReturnMap([ + ['force_language', false, false], + ['default_language', false, 'es'] + ]); + $user = $this->createMock(IUser::class); + $user->expects(self::once()) + ->method('getUID') + ->willReturn('MyUserUid'); $this->userSession - ->expects($this->exactly(2)) - ->method('getUser') - ->willReturn($user); - $this->config - ->expects($this->once()) - ->method('getUserValue') - ->with('MyUserUid', 'core', 'lang', null) - ->willReturn('jp'); - $factory->expects($this->at(1)) - ->method('languageExists') - ->with('MyApp', 'jp') - ->willReturn(false); + ->expects(self::exactly(2)) + ->method('getUser') + ->willReturn($user); $this->config - ->expects($this->at(3)) - ->method('getSystemValue') - ->with('default_language', false) - ->willReturn('es'); - $factory->expects($this->at(2)) - ->method('languageExists') - ->with('MyApp', 'es') - ->willReturn(true); + ->expects(self::once()) + ->method('getUserValue') + ->with('MyUserUid', 'core', 'lang', null) + ->willReturn('jp'); - $this->assertSame('es', $factory->findLanguage('MyApp')); + self::assertSame('es', $factory->findLanguage('MyApp')); } - public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguageAndNotExistingDefault() { + public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguageAndNotExistingDefault(): void { $factory = $this->getFactory(['languageExists'], true); $this->invokePrivate($factory, 'requestLanguage', ['de']); - $factory->expects($this->at(0)) - ->method('languageExists') - ->with('MyApp', 'de') - ->willReturn(false); + $factory->expects($this->exactly(3)) + ->method('languageExists') + ->willReturnMap([ + ['MyApp', 'de', false], + ['MyApp', 'jp', false], + ['MyApp', 'es', false], + ]); $this->config - ->expects($this->at(0)) + ->expects($this->exactly(2)) ->method('getSystemValue') - ->with('force_language', false) - ->willReturn(false); - $this->config - ->expects($this->at(1)) - ->method('getSystemValue') - ->with('installed', false) - ->willReturn(true); - $user = $this->getMockBuilder(IUser::class) - ->getMock(); - $user->expects($this->once()) - ->method('getUID') - ->willReturn('MyUserUid'); + ->willReturnMap([ + ['force_language', false, false], + ['default_language', false, 'es'] + ]); + $user = $this->createMock(IUser::class); + $user->expects(self::once()) + ->method('getUID') + ->willReturn('MyUserUid'); $this->userSession - ->expects($this->exactly(2)) - ->method('getUser') - ->willReturn($user); - $this->config - ->expects($this->once()) - ->method('getUserValue') - ->with('MyUserUid', 'core', 'lang', null) - ->willReturn('jp'); - $factory->expects($this->at(1)) - ->method('languageExists') - ->with('MyApp', 'jp') - ->willReturn(false); + ->expects(self::exactly(2)) + ->method('getUser') + ->willReturn($user); $this->config - ->expects($this->at(3)) - ->method('getSystemValue') - ->with('default_language', false) - ->willReturn('es'); - $factory->expects($this->at(2)) - ->method('languageExists') - ->with('MyApp', 'es') - ->willReturn(false); + ->expects(self::once()) + ->method('getUserValue') + ->with('MyUserUid', 'core', 'lang', null) + ->willReturn('jp'); $this->config - ->expects($this->never()) + ->expects(self::never()) ->method('setUserValue'); - $this->assertSame('en', $factory->findLanguage('MyApp')); + self::assertSame('en', $factory->findLanguage('MyApp')); } - public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguageAndNotExistingDefaultAndNoAppInScope() { + public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguageAndNotExistingDefaultAndNoAppInScope(): void { $factory = $this->getFactory(['languageExists'], true); $this->invokePrivate($factory, 'requestLanguage', ['de']); - $factory->expects($this->at(0)) - ->method('languageExists') - ->with('MyApp', 'de') - ->willReturn(false); + $factory->expects($this->exactly(3)) + ->method('languageExists') + ->willReturnMap([ + ['MyApp', 'de', false], + ['MyApp', 'jp', false], + ['MyApp', 'es', false], + ]); $this->config - ->expects($this->at(0)) + ->expects($this->exactly(2)) ->method('getSystemValue') - ->with('force_language', false) - ->willReturn(false); - $this->config - ->expects($this->at(1)) - ->method('getSystemValue') - ->with('installed', false) - ->willReturn(true); - $user = $this->getMockBuilder(IUser::class) - ->getMock(); - $user->expects($this->once()) - ->method('getUID') - ->willReturn('MyUserUid'); + ->willReturnMap([ + ['force_language', false, false], + ['default_language', false, 'es'] + ]); + $user = $this->createMock(IUser::class); + $user->expects(self::once()) + ->method('getUID') + ->willReturn('MyUserUid'); $this->userSession - ->expects($this->exactly(2)) - ->method('getUser') - ->willReturn($user); - $this->config - ->expects($this->once()) - ->method('getUserValue') - ->with('MyUserUid', 'core', 'lang', null) - ->willReturn('jp'); - $factory->expects($this->at(1)) - ->method('languageExists') - ->with('MyApp', 'jp') - ->willReturn(false); + ->expects(self::exactly(2)) + ->method('getUser') + ->willReturn($user); $this->config - ->expects($this->at(3)) - ->method('getSystemValue') - ->with('default_language', false) - ->willReturn('es'); - $factory->expects($this->at(2)) - ->method('languageExists') - ->with('MyApp', 'es') - ->willReturn(false); + ->expects(self::once()) + ->method('getUserValue') + ->with('MyUserUid', 'core', 'lang', null) + ->willReturn('jp'); $this->config - ->expects($this->never()) - ->method('setUserValue') - ->with('MyUserUid', 'core', 'lang', 'en'); + ->expects(self::never()) + ->method('setUserValue') + ->with('MyUserUid', 'core', 'lang', 'en'); - $this->assertSame('en', $factory->findLanguage('MyApp')); + self::assertSame('en', $factory->findLanguage('MyApp')); } - public function testFindLanguageWithForcedLanguage() { + public function testFindLanguageWithForcedLanguage(): void { $factory = $this->getFactory(['languageExists']); $this->config - ->expects($this->at(0)) + ->expects($this->once()) ->method('getSystemValue') ->with('force_language', false) ->willReturn('de'); @@ -314,25 +274,24 @@ class FactoryTest extends TestCase { ->with('MyApp', 'de') ->willReturn(true); - $this->assertSame('de', $factory->findLanguage('MyApp')); + self::assertSame('de', $factory->findLanguage('MyApp')); } /** - * @dataProvider dataFindAvailableLanguages - * * @param string|null $app */ - public function testFindAvailableLanguages($app) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataFindAvailableLanguages')] + public function testFindAvailableLanguages($app): void { $factory = $this->getFactory(['findL10nDir']); - $factory->expects($this->once()) + $factory->expects(self::once()) ->method('findL10nDir') ->with($app) ->willReturn(\OC::$SERVERROOT . '/tests/data/l10n/'); - $this->assertEqualsCanonicalizing(['cs', 'de', 'en', 'ru'], $factory->findAvailableLanguages($app)); + self::assertEqualsCanonicalizing(['cs', 'de', 'en', 'ru'], $factory->findAvailableLanguages($app)); } - public function dataLanguageExists() { + public static function dataLanguageExists(): array { return [ [null, 'en', [], true], [null, 'de', [], false], @@ -345,43 +304,43 @@ class FactoryTest extends TestCase { ]; } - public function testFindAvailableLanguagesWithThemes() { + public function testFindAvailableLanguagesWithThemes(): void { $this->serverRoot .= '/tests/data'; $app = 'files'; $factory = $this->getFactory(['findL10nDir']); - $factory->expects($this->once()) + $factory->expects(self::once()) ->method('findL10nDir') ->with($app) ->willReturn($this->serverRoot . '/apps/files/l10n/'); $this->config - ->expects($this->once()) - ->method('getSystemValue') + ->expects(self::once()) + ->method('getSystemValueString') ->with('theme') ->willReturn('abc'); - $this->assertEqualsCanonicalizing(['en', 'zz'], $factory->findAvailableLanguages($app)); + self::assertEqualsCanonicalizing(['en', 'zz'], $factory->findAvailableLanguages($app)); } /** - * @dataProvider dataLanguageExists * * @param string|null $app * @param string $lang * @param string[] $availableLanguages * @param string $expected */ - public function testLanguageExists($app, $lang, array $availableLanguages, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataLanguageExists')] + public function testLanguageExists($app, $lang, array $availableLanguages, $expected): void { $factory = $this->getFactory(['findAvailableLanguages']); - $factory->expects(($lang === 'en') ? $this->never() : $this->once()) + $factory->expects(($lang === 'en') ? self::never() : self::once()) ->method('findAvailableLanguages') ->with($app) ->willReturn($availableLanguages); - $this->assertSame($expected, $factory->languageExists($app, $lang)); + self::assertSame($expected, $factory->languageExists($app, $lang)); } - public function dataSetLanguageFromRequest() { + public static function dataSetLanguageFromRequest(): array { return [ // Language is available [null, 'de', ['de'], 'de'], @@ -404,26 +363,26 @@ class FactoryTest extends TestCase { } /** - * @dataProvider dataSetLanguageFromRequest * * @param string|null $app * @param string $header * @param string[] $availableLanguages * @param string $expected */ - public function testGetLanguageFromRequest($app, $header, array $availableLanguages, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataSetLanguageFromRequest')] + public function testGetLanguageFromRequest($app, $header, array $availableLanguages, $expected): void { $factory = $this->getFactory(['findAvailableLanguages', 'respectDefaultLanguage']); - $factory->expects($this->once()) + $factory->expects(self::once()) ->method('findAvailableLanguages') ->with($app) ->willReturn($availableLanguages); - $factory->expects($this->any()) + $factory->expects(self::any()) ->method('respectDefaultLanguage')->willReturnCallback(function ($app, $lang) { return $lang; }); - $this->request->expects($this->once()) + $this->request->expects(self::once()) ->method('getHeader') ->with('ACCEPT_LANGUAGE') ->willReturn($header); @@ -432,13 +391,13 @@ class FactoryTest extends TestCase { $this->expectException(LanguageNotFoundException::class); self::invokePrivate($factory, 'getLanguageFromRequest', [$app]); } else { - $this->assertSame($expected, self::invokePrivate($factory, 'getLanguageFromRequest', [$app]), 'Asserting returned language'); + self::assertSame($expected, self::invokePrivate($factory, 'getLanguageFromRequest', [$app]), 'Asserting returned language'); } } - public function dataGetL10nFilesForApp() { + public static function dataGetL10nFilesForApp(): array { return [ - [null, 'de', [\OC::$SERVERROOT . '/core/l10n/de.json']], + ['', 'de', [\OC::$SERVERROOT . '/core/l10n/de.json']], ['core', 'ru', [\OC::$SERVERROOT . '/core/l10n/ru.json']], ['lib', 'ru', [\OC::$SERVERROOT . '/lib/l10n/ru.json']], ['settings', 'de', [\OC::$SERVERROOT . '/apps/settings/l10n/de.json']], @@ -449,19 +408,30 @@ class FactoryTest extends TestCase { } /** - * @dataProvider dataGetL10nFilesForApp * - * @param string|null $app + * @param string $app * @param string $expected */ - public function testGetL10nFilesForApp($app, $lang, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetL10nFilesForApp')] + public function testGetL10nFilesForApp($app, $lang, $expected): void { $factory = $this->getFactory(); - $this->assertSame($expected, $this->invokePrivate($factory, 'getL10nFilesForApp', [$app, $lang])); + if (in_array($app, ['settings','files'])) { + $this->appManager + ->method('getAppPath') + ->with($app) + ->willReturn(\OC::$SERVERROOT . '/apps/' . $app); + } else { + $this->appManager + ->method('getAppPath') + ->with($app) + ->willThrowException(new AppPathNotFoundException()); + } + self::assertSame($expected, $this->invokePrivate($factory, 'getL10nFilesForApp', [$app, $lang])); } - public function dataFindL10NDir() { + public static function dataFindL10NDir(): array { return [ - [null, \OC::$SERVERROOT . '/core/l10n/'], + ['', \OC::$SERVERROOT . '/core/l10n/'], ['core', \OC::$SERVERROOT . '/core/l10n/'], ['lib', \OC::$SERVERROOT . '/lib/l10n/'], ['settings', \OC::$SERVERROOT . '/apps/settings/l10n/'], @@ -471,17 +441,28 @@ class FactoryTest extends TestCase { } /** - * @dataProvider dataFindL10NDir * - * @param string|null $app + * @param string $app * @param string $expected */ - public function testFindL10NDir($app, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataFindL10NDir')] + public function testFindL10NDir($app, $expected): void { $factory = $this->getFactory(); - $this->assertSame($expected, $this->invokePrivate($factory, 'findL10nDir', [$app])); + if (in_array($app, ['settings','files'])) { + $this->appManager + ->method('getAppPath') + ->with($app) + ->willReturn(\OC::$SERVERROOT . '/apps/' . $app); + } else { + $this->appManager + ->method('getAppPath') + ->with($app) + ->willThrowException(new AppPathNotFoundException()); + } + self::assertSame($expected, $this->invokePrivate($factory, 'findL10nDir', [$app])); } - public function dataFindLanguage() { + public static function dataFindLanguage(): array { return [ // Not logged in [false, [], 'en'], @@ -497,23 +478,21 @@ class FactoryTest extends TestCase { } /** - * @dataProvider dataFindLanguage * * @param bool $loggedIn * @param array $availableLang * @param string $expected */ - public function testFindLanguage($loggedIn, $availableLang, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataFindLanguage')] + public function testFindLanguage($loggedIn, $availableLang, $expected): void { $userLang = 'nl'; $browserLang = 'de'; $defaultLang = 'fr'; - $this->config->expects($this->any()) + $this->config->expects(self::any()) ->method('getSystemValue') ->willReturnCallback(function ($var, $default) use ($defaultLang) { - if ($var === 'installed') { - return true; - } elseif ($var === 'default_language') { + if ($var === 'default_language') { return $defaultLang; } else { return $default; @@ -521,52 +500,165 @@ class FactoryTest extends TestCase { }); if ($loggedIn) { - $user = $this->getMockBuilder(IUser::class) - ->getMock(); - $user->expects($this->any()) + $user = $this->createMock(IUser::class); + $user->expects(self::any()) ->method('getUID') ->willReturn('MyUserUid'); $this->userSession - ->expects($this->any()) + ->expects(self::any()) ->method('getUser') ->willReturn($user); - $this->config->expects($this->any()) + $this->config->expects(self::any()) ->method('getUserValue') ->with('MyUserUid', 'core', 'lang', null) ->willReturn($userLang); } else { $this->userSession - ->expects($this->any()) + ->expects(self::any()) ->method('getUser') ->willReturn(null); } - $this->request->expects($this->any()) + $this->request->expects(self::any()) ->method('getHeader') ->with($this->equalTo('ACCEPT_LANGUAGE')) ->willReturn($browserLang); $factory = $this->getFactory(['languageExists', 'findAvailableLanguages', 'respectDefaultLanguage']); - $factory->expects($this->any()) + $factory->expects(self::any()) ->method('languageExists') ->willReturnCallback(function ($app, $lang) use ($availableLang) { return in_array($lang, $availableLang); }); - $factory->expects($this->any()) + $factory->expects(self::any()) ->method('findAvailableLanguages') ->willReturnCallback(function ($app) use ($availableLang) { return $availableLang; }); - $factory->expects($this->any()) + $factory->expects(self::any()) ->method('respectDefaultLanguage')->willReturnCallback(function ($app, $lang) { return $lang; }); - $lang = $factory->findLanguage(null); - $this->assertSame($expected, $lang); + $lang = $factory->findLanguage(); + + self::assertSame($expected, $lang); + } + + public function testFindGenericLanguageByEnforcedLanguage(): void { + $factory = $this->getFactory(); + $this->config->expects(self::once()) + ->method('getSystemValue') + ->with('force_language', false) + ->willReturn('cz'); + + $lang = $factory->findGenericLanguage(); + + self::assertSame('cz', $lang); } - public function dataTestRespectDefaultLanguage() { + public function testFindGenericLanguageByDefaultLanguage(): void { + $factory = $this->getFactory(['languageExists']); + $this->config->expects(self::exactly(2)) + ->method('getSystemValue') + ->willReturnMap([ + ['force_language', false, false,], + ['default_language', false, 'cz',], + ]); + $factory->expects(self::once()) + ->method('languageExists') + ->with(null, 'cz') + ->willReturn(true); + + $lang = $factory->findGenericLanguage(); + + self::assertSame('cz', $lang); + } + + public function testFindGenericLanguageByUserLanguage(): void { + $factory = $this->getFactory(); + $this->config->expects(self::exactly(2)) + ->method('getSystemValue') + ->willReturnMap([ + ['force_language', false, false,], + ['default_language', false, false,], + ]); + $user = $this->createMock(IUser::class); + $this->userSession->expects(self::once()) + ->method('getUser') + ->willReturn($user); + $user->method('getUID')->willReturn('user123'); + $this->config->expects(self::once()) + ->method('getUserValue') + ->with('user123', 'core', 'lang', null) + ->willReturn('cz'); + + $lang = $factory->findGenericLanguage(); + + self::assertSame('cz', $lang); + } + + public function testFindGenericLanguageByRequestLanguage(): void { + $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); + $this->config->method('getSystemValue') + ->willReturnMap([ + ['force_language', false, false,], + ['default_language', false, false,], + ]); + $user = $this->createMock(IUser::class); + $this->userSession->expects(self::once()) + ->method('getUser') + ->willReturn($user); + $user->method('getUID')->willReturn('user123'); + $this->config->expects(self::once()) + ->method('getUserValue') + ->with('user123', 'core', 'lang', null) + ->willReturn(null); + $this->request->expects(self::once()) + ->method('getHeader') + ->with('ACCEPT_LANGUAGE') + ->willReturn('cz'); + $factory->expects(self::once()) + ->method('findAvailableLanguages') + ->with(null) + ->willReturn(['cz']); + + $lang = $factory->findGenericLanguage(); + + self::assertSame('cz', $lang); + } + + public function testFindGenericLanguageFallback(): void { + $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); + $this->config->method('getSystemValue') + ->willReturnMap([ + ['force_language', false, false,], + ['default_language', false, false,], + ]); + $user = $this->createMock(IUser::class); + $this->userSession->expects(self::once()) + ->method('getUser') + ->willReturn($user); + $user->method('getUID')->willReturn('user123'); + $this->config->expects(self::once()) + ->method('getUserValue') + ->with('user123', 'core', 'lang', null) + ->willReturn(null); + $this->request->expects(self::once()) + ->method('getHeader') + ->with('ACCEPT_LANGUAGE') + ->willReturn(''); + $factory->expects(self::never()) + ->method('findAvailableLanguages'); + $factory->expects(self::never()) + ->method('languageExists'); + + $lang = $factory->findGenericLanguage(); + + self::assertSame('en', $lang); + } + + public static function dataTestRespectDefaultLanguage(): array { return [ ['de', 'de_DE', true, 'de_DE'], ['de', 'de', true, 'de'], @@ -578,40 +670,86 @@ class FactoryTest extends TestCase { /** * test if we respect default language if possible * - * @dataProvider dataTestRespectDefaultLanguage * * @param string $lang * @param string $defaultLanguage * @param bool $langExists * @param string $expected */ - public function testRespectDefaultLanguage($lang, $defaultLanguage, $langExists, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestRespectDefaultLanguage')] + public function testRespectDefaultLanguage($lang, $defaultLanguage, $langExists, $expected): void { $factory = $this->getFactory(['languageExists']); - $factory->expects($this->any()) + $factory->expects(self::any()) ->method('languageExists')->willReturn($langExists); - $this->config->expects($this->any()) + $this->config->expects(self::any()) ->method('getSystemValue')->with('default_language', false)->willReturn($defaultLanguage); $result = $this->invokePrivate($factory, 'respectDefaultLanguage', ['app', $lang]); - $this->assertSame($expected, $result); + self::assertSame($expected, $result); } - public function languageIteratorRequestProvider():array { + public static function dataTestReduceToLanguages(): array { return [ - [ true, $this->createMock(IUser::class)], - [ false, $this->createMock(IUser::class)], - [ false, null] + ['en', ['en', 'de', 'fr', 'it', 'es'], ['en', 'fr', 'de'], ['en', 'fr', 'de']], + ['en', ['en', 'de', 'fr', 'it', 'es'], ['en', 'de'], ['en', 'de']], + ['en', ['en', 'de', 'fr', 'it', 'es'], [], ['de', 'en', 'es', 'fr', 'it']], ]; } /** - * @dataProvider languageIteratorRequestProvider + * test + * - if available languages set can be reduced by configuration + * - if available languages set is not reduced to an empty set if + * the reduce config is an empty set + * + * + * @param string $lang + * @param array $availableLanguages + * @param array $reducedLanguageSet + * @param array $expected */ - public function testGetLanguageIterator(bool $hasSession, IUser $iUserMock = null) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestReduceToLanguages')] + public function testReduceLanguagesByConfiguration(string $lang, array $availableLanguages, array $reducedLanguageSet, array $expected): void { + $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); + $factory->expects(self::any()) + ->method('languageExists')->willReturn(true); + $factory->expects(self::any()) + ->method('findAvailableLanguages') + ->willReturnCallback(function ($app) use ($availableLanguages) { + return $availableLanguages; + }); + + $this->config + ->method('getSystemValue') + ->willReturnMap([ + ['force_language', false, false], + ['default_language', false, $lang], + ['reduce_to_languages', [], $reducedLanguageSet] + ]); + + $result = $this->invokePrivate($factory, 'getLanguages'); + $commonLanguagesCodes = array_map(function ($lang) { + return $lang['code']; + }, $result['commonLanguages']); + + self::assertEqualsCanonicalizing($expected, $commonLanguagesCodes); + } + + public static function languageIteratorRequestProvider(): array { + return [ + [ true, true], + [ false, true], + [ false, false], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('languageIteratorRequestProvider')] + public function testGetLanguageIterator(bool $hasSession, bool $mockUser): void { $factory = $this->getFactory(); + $user = null; - if ($iUserMock === null) { - $matcher = $this->userSession->expects($this->once()) + if (!$mockUser) { + $matcher = $this->userSession->expects(self::once()) ->method('getUser'); if ($hasSession) { @@ -619,9 +757,27 @@ class FactoryTest extends TestCase { } else { $this->expectException(\RuntimeException::class); } + } else { + $user = $this->createMock(IUser::class); } - $iterator = $factory->getLanguageIterator($iUserMock); - $this->assertInstanceOf(ILanguageIterator::class, $iterator); + $iterator = $factory->getLanguageIterator($user); + self::assertInstanceOf(ILanguageIterator::class, $iterator); + } + + public static function dataGetLanguageDirection(): array { + return [ + ['en', 'ltr'], + ['de', 'ltr'], + ['fa', 'rtl'], + ['ar', 'rtl'] + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetLanguageDirection')] + public function testGetLanguageDirection(string $language, string $expectedDirection) { + $factory = $this->getFactory(); + + self::assertEquals($expectedDirection, $factory->getLanguageDirection($language)); } } |