Skip to content

Commit f4f48cf

Browse files
authored
IBX-7862: Fixed user setting value (#77)
1 parent 36ee5cd commit f4f48cf

File tree

3 files changed

+75
-6
lines changed

3 files changed

+75
-6
lines changed

phpstan-baseline.neon

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -760,11 +760,6 @@ parameters:
760760
count: 1
761761
path: src/lib/UserSetting/Setting/FullDateTimeFormat.php
762762

763-
-
764-
message: "#^Method Ibexa\\\\User\\\\UserSetting\\\\Setting\\\\Language\\:\\:getDefaultValue\\(\\) should return string but returns string\\|false\\.$#"
765-
count: 1
766-
path: src/lib/UserSetting/Setting/Language.php
767-
768763
-
769764
message: "#^Method Ibexa\\\\User\\\\UserSetting\\\\Setting\\\\ShortDateTimeFormat\\:\\:getDefaultValue\\(\\) should return string but returns string\\|null\\.$#"
770765
count: 1

src/lib/UserSetting/Setting/Language.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,16 @@ public function getDisplayValue(string $storageValue): string
7272
*/
7373
public function getDefaultValue(): string
7474
{
75+
$defaultLocale = '';
7576
$preferredLocales = $this->userLanguagePreferenceProvider->getPreferredLocales();
7677

77-
return reset($preferredLocales);
78+
$list = $this->availableLocaleChoiceLoader->getChoiceList();
79+
$commonLocales = array_intersect($preferredLocales, $list);
80+
if (!empty($commonLocales)) {
81+
$defaultLocale = reset($commonLocales);
82+
}
83+
84+
return $defaultLocale;
7885
}
7986

8087
/**
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Tests\User\UserSetting;
10+
11+
use Ibexa\Core\MVC\Symfony\Locale\UserLanguagePreferenceProviderInterface;
12+
use Ibexa\User\Form\ChoiceList\Loader\AvailableLocaleChoiceLoader;
13+
use Ibexa\User\UserSetting\Setting\Language;
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Contracts\Translation\TranslatorInterface;
16+
17+
final class LanguageTest extends TestCase
18+
{
19+
/** @var \Ibexa\Core\MVC\Symfony\Locale\UserLanguagePreferenceProviderInterface&\PHPUnit\Framework\MockObject\MockObject */
20+
private UserLanguagePreferenceProviderInterface $userLanguagePreferenceProvider;
21+
22+
/** @var \Ibexa\User\Form\ChoiceList\Loader\AvailableLocaleChoiceLoader&\PHPUnit\Framework\MockObject\MockObject */
23+
private AvailableLocaleChoiceLoader $availableLocaleChoiceLoader;
24+
25+
protected function setUp(): void
26+
{
27+
$this->userLanguagePreferenceProvider = $this->createMock(
28+
UserLanguagePreferenceProviderInterface::class
29+
);
30+
$this->availableLocaleChoiceLoader = $this->createMock(
31+
AvailableLocaleChoiceLoader::class
32+
);
33+
}
34+
35+
/**
36+
* @dataProvider providerForDefaultValue
37+
*
38+
* @param string[] $availableLocales
39+
* @param string[] $preferredLocales
40+
*/
41+
public function testGetDefaultValue(
42+
array $preferredLocales,
43+
array $availableLocales,
44+
string $expectedDefaultValue
45+
): void {
46+
$this->userLanguagePreferenceProvider->method('getPreferredLocales')->willReturn($preferredLocales);
47+
$this->availableLocaleChoiceLoader->method('getChoiceList')->willReturn($availableLocales);
48+
49+
$language = new Language(
50+
$this->createMock(TranslatorInterface::class),
51+
$this->userLanguagePreferenceProvider,
52+
$this->availableLocaleChoiceLoader,
53+
);
54+
55+
self::assertSame($expectedDefaultValue, $language->getDefaultValue());
56+
}
57+
58+
/**
59+
* @return iterable<string, array<mixed>>
60+
*/
61+
public function providerForDefaultValue(): iterable
62+
{
63+
yield 'intersection' => [['en_GB', 'en'], ['en', 'de', 'el', 'en_US'], 'en'];
64+
yield 'no available locale' => [['en_GB', 'en'], ['de', 'el', 'en_US'], ''];
65+
yield 'user preferred language priority' => [['en_GB', 'en', 'de'], ['de', 'en', 'el'], 'en'];
66+
}
67+
}

0 commit comments

Comments
 (0)