configure am/pm time-format as user preference (#2789)

This commit is contained in:
Kevin Papst
2021-11-14 18:18:26 +01:00
committed by GitHub
parent dce0578a2b
commit 8b0962e192
32 changed files with 216 additions and 260 deletions

View File

@@ -29,13 +29,13 @@ class ConfigurationControllerTest extends APIControllerBaseTest
$this->assertIsArray($result);
$this->assertNotEmpty($result);
$this->assertEquals(8, \count($result));
$this->assertEquals(7, \count($result));
$this->assertI18nStructure($result);
}
protected function assertI18nStructure(array $result)
{
$expectedKeys = ['date', 'dateTime', 'duration', 'formDate', 'formDateTime', 'is24hours', 'time', 'now'];
$expectedKeys = ['date', 'dateTime', 'duration', 'formDate', 'is24hours', 'time', 'now'];
$actual = array_keys($result);
sort($actual);
sort($expectedKeys);

View File

@@ -26,7 +26,6 @@ class I18nConfigTest extends TestCase
$this->assertInstanceOf(I18nConfig::class, $sut->setDate('bar'));
$this->assertInstanceOf(I18nConfig::class, $sut->setDateTime('hello'));
$this->assertInstanceOf(I18nConfig::class, $sut->setFormDate('world'));
$this->assertInstanceOf(I18nConfig::class, $sut->setFormDateTime('testing'));
$this->assertInstanceOf(I18nConfig::class, $sut->setTime('fun'));
}
}

View File

@@ -26,61 +26,50 @@ class LanguageFormattingsTest extends TestCase
{
return [
'de' => [
'date_time_type' => 'dd.MM.yyyy HH:mm',
'date_type' => 'dd.MM.yyyy',
'date' => 'd.m.Y',
'date_time' => 'd.m. H:i',
'duration' => '%h:%m h',
'time' => 'H:i',
'24_hours' => true,
],
'en' => [
'date_time_type' => 'yyyy-MM-dd HH:mm',
'date_type' => 'yyyy-MM-dd',
'date' => 'Y-m-d',
'date_time' => 'm-d H:i',
'duration' => '%h:%m h',
'time' => 'H:i:s',
'24_hours' => false,
],
'pt_BR' => [
'date_time_type' => 'dd-MM-yyyy HH:mm',
'date_type' => 'dd-MM-yyyy',
'date' => 'd-m-Y',
'duration' => '%h:%m h',
],
'it' => [
'date_time_type' => 'dd.MM.yyyy HH:mm',
'date_type' => 'dd.MM.yyyy',
'date' => 'd.m.Y',
'duration' => '%h:%m h',
],
'fr' => [
'date_time_type' => 'dd/MM/yyyy HH:mm',
'date_type' => 'dd/MM/yyyy',
'date' => 'd/m/Y',
'duration' => '%h h %m',
],
'es' => [
'date_time_type' => 'dd.MM.yyyy HH:mm',
'date_type' => 'dd.MM.yyyy',
'date' => 'd.m.Y',
'duration' => '%h:%m h',
],
'ru' => [
'date_time_type' => 'dd.MM.yyyy HH:mm',
'date_type' => 'dd.MM.yyyy',
'date' => 'd.m.Y',
'duration' => '%h:%m h',
],
'ar' => [
'date_time_type' => 'yyyy-MM-dd HH:mm',
'date_type' => 'yyyy-MM-dd',
'date' => 'Y-m-d',
'duration' => '%h:%m h',
],
'hu' => [
'date_time_type' => 'yyyy.MM.dd HH:mm',
'date_type' => 'yyyy.MM.dd',
'date' => 'Y.m.d.',
'duration' => '%h:%m h',
@@ -136,40 +125,10 @@ class LanguageFormattingsTest extends TestCase
$this->assertEquals('DD.MM.YYYY', $sut->getDatePickerFormat('de'));
}
public function testGetDateTimeTypeFormat()
{
$sut = $this->getSut($this->getDefaultSettings());
$this->assertEquals('dd.MM.yyyy HH:mm', $sut->getDateTimeTypeFormat('de'));
}
public function testGetDateTimePickerFormat()
{
$sut = $this->getSut($this->getDefaultSettings());
$this->assertEquals('DD.MM.YYYY HH:mm', $sut->getDateTimePickerFormat('de'));
}
public function testIs24Hours()
{
$sut = $this->getSut($this->getDefaultSettings());
$this->assertTrue($sut->isTwentyFourHours('de'));
$this->assertFalse($sut->isTwentyFourHours('en'));
}
public function testGetTimeFormat()
{
$sut = $this->getSut($this->getDefaultSettings());
$this->assertEquals('H:i', $sut->getTimeFormat('de'));
$this->assertEquals('H:i:s', $sut->getTimeFormat('en'));
}
public function testUnknownSetting()
{
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('Unknown setting for locale en: date_time_type');
$sut = $this->getSut(['en' => [
'xxx' => 'dd.MM.yyyy HH:mm',
]]);
$sut->getDateTimePickerFormat('en');
}
}

View File

@@ -430,7 +430,7 @@ class ProfileControllerTest extends ControllerBaseTest
2 => ['name' => UserPreference::TIMEZONE, 'value' => 'America/Creston'],
3 => ['name' => UserPreference::LOCALE, 'value' => 'ar'],
4 => ['name' => UserPreference::FIRST_WEEKDAY, 'value' => 'sunday'],
5 => ['name' => UserPreference::SKIN, 'value' => 'blue'],
6 => ['name' => UserPreference::SKIN, 'value' => 'blue'],
]
]
]);

View File

@@ -49,6 +49,7 @@ class UserTest extends TestCase
self::assertFalse($user->canSeeAllData());
self::assertFalse($user->isSmallLayout());
self::assertFalse($user->isExportDecimal());
self::assertTrue($user->is24Hour());
$user->setAvatar('https://www.gravatar.com/avatar/00000000000000000000000000000000?d=retro&f=y');
self::assertEquals('https://www.gravatar.com/avatar/00000000000000000000000000000000?d=retro&f=y', $user->getAvatar());
@@ -481,4 +482,15 @@ class UserTest extends TestCase
$member->setUser(new User());
$sut->addMembership($member);
}
public function test24Hour()
{
$user = new User();
self::assertTrue($user->is24Hour());
self::assertEquals('H:i', $user->getTimeFormat());
$user->setPreferenceValue(UserPreference::HOUR_24, false);
self::assertFalse($user->is24Hour());
self::assertEquals('h:i A', $user->getTimeFormat());
}
}

View File

@@ -30,6 +30,7 @@ class UserPreferenceSubscriberTest extends TestCase
'language',
'first_weekday',
'skin',
'hours_24',
'theme.layout',
'theme.collapsed_sidebar',
'theme.update_browser_title',

View File

@@ -34,6 +34,7 @@ use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
abstract class AbstractRendererTest extends KernelTestCase
@@ -52,8 +53,11 @@ abstract class AbstractRendererTest extends KernelTestCase
]
];
$security = $this->createMock(Security::class);
$security->expects($this->any())->method('getUser')->willReturn(new User());
$translator = $this->createMock(TranslatorInterface::class);
$dateExtension = new LocaleFormatExtensions(new LanguageFormattings($languages));
$dateExtension = new LocaleFormatExtensions(new LanguageFormattings($languages), $security);
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new MetaFieldColumnSubscriber());

View File

@@ -10,10 +10,14 @@
namespace App\Tests\Export\Renderer;
use App\Activity\ActivityStatisticService;
use App\Entity\User;
use App\Export\Renderer\HtmlRenderer;
use App\Project\ProjectStatisticService;
use Symfony\Bridge\Twig\AppVariable;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Twig\Environment;
/**
@@ -43,6 +47,16 @@ class HtmlRendererTest extends AbstractRendererTest
$kernel = self::bootKernel();
/** @var Environment $twig */
$twig = $kernel->getContainer()->get('twig');
$token = $this->createMock(TokenInterface::class);
$token->expects($this->any())->method('getUser')->willReturn(new User());
$tokenStorage = new TokenStorage();
$tokenStorage->setToken($token);
/** @var AppVariable $app */
$app = $twig->getGlobals()['app'];
$twig->addGlobal('app', $app);
$app->setTokenStorage($tokenStorage);
$stack = $kernel->getContainer()->get('request_stack');
$request = new Request();
$request->setLocale('en');

View File

@@ -33,6 +33,7 @@ use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
abstract class AbstractRendererTest extends KernelTestCase
@@ -51,8 +52,11 @@ abstract class AbstractRendererTest extends KernelTestCase
]
];
$security = $this->createMock(Security::class);
$security->expects($this->any())->method('getUser')->willReturn(new User());
$translator = $this->getMockBuilder(TranslatorInterface::class)->getMock();
$dateExtension = new LocaleFormatExtensions(new LanguageFormattings($languages));
$dateExtension = new LocaleFormatExtensions(new LanguageFormattings($languages), $security);
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new MetaFieldColumnSubscriber());

View File

@@ -15,6 +15,7 @@ use App\Entity\User;
use App\Twig\LocaleFormatExtensions;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Intl\Util\IntlTestHelper;
use Symfony\Component\Security\Core\Security;
use Twig\TwigFilter;
use Twig\TwigFunction;
use Twig\TwigTest;
@@ -43,7 +44,11 @@ class LocaleFormatExtensionsTest extends TestCase
$language = $dateSettings;
$dateSettings = $locale;
}
$sut = new LocaleFormatExtensions(new LanguageFormattings($dateSettings));
$security = $this->createMock(Security::class);
$security->expects($this->any())->method('getUser')->willReturn(new User());
$sut = new LocaleFormatExtensions(new LanguageFormattings($dateSettings), $security);
$sut->setLocale($language);
return $sut;
@@ -220,31 +225,21 @@ class LocaleFormatExtensionsTest extends TestCase
$this->assertEquals('17:53', $sut->time('2016-06-23 17:53'));
}
public function testHour24()
{
$sut = $this->getSut('en', [
'en' => ['24_hours' => false],
]);
$this->assertEquals('bar', $sut->hour24('foo', 'bar'));
$sut = $this->getSut('de', [
'de' => ['24_hours' => true],
]);
$this->assertEquals('foo', $sut->hour24('foo', 'bar'));
}
public function testDateTimeFull()
{
$sut = $this->getSut('en', [
'en' => ['date_time_type' => 'yyyy-MM-dd HH:mm:ss'],
'en' => ['date_type' => 'dd-yyyy-MM-'],
]);
$dateTime = new \DateTime('2019-08-17 12:29:47', new \DateTimeZone(date_default_timezone_get()));
$dateTime->setDate(2019, 8, 17);
$dateTime->setTime(12, 29, 47);
$this->assertEquals('2019-08-17 12:29:47', $sut->dateTimeFull($dateTime));
$this->assertEquals('2019-08-17 12:29:47', $sut->dateTimeFull('2019-08-17 12:29:47'));
$this->assertEquals('17-2019-08- 12:29', $sut->dateTimeFull($dateTime));
$this->assertEquals('17-2019-08- 12:29', $sut->dateTimeFull('2019-08-17 12:29:47'));
$dateTime = new \DateTime('2019-08-17 00:00:00');
$this->assertEquals('17-2019-08-', $sut->dateTimeFull($dateTime, true));
// next test checks the fallback for errors while converting the date
/* @phpstan-ignore-next-line */

View File

@@ -28,61 +28,50 @@ class LocaleFormatsTest extends TestCase
{
return [
'de' => [
'date_time_type' => 'dd.MM.yyyy HH:mm',
'date_type' => 'dd.MM.yyyy',
'date' => 'd.m.Y',
'date_time' => 'd.m. H:i',
'duration' => '%h:%m h',
'time' => 'H:i',
'24_hours' => true,
],
'en' => [
'date_time_type' => 'yyyy-MM-dd HH:mm',
'date_type' => 'yyyy-MM-dd',
'date' => 'Y-m-d',
'date_time' => 'm-d H:i',
'duration' => '%h:%m h',
'time' => 'H:i:s',
'24_hours' => false,
],
'pt_BR' => [
'date_time_type' => 'dd-MM-yyyy HH:mm',
'date_type' => 'dd-MM-yyyy',
'date' => 'd-m-Y',
'duration' => '%h:%m h',
],
'it' => [
'date_time_type' => 'dd.MM.yyyy HH:mm',
'date_type' => 'dd.MM.yyyy',
'date' => 'd.m.Y',
'duration' => '%h:%m h',
],
'fr' => [
'date_time_type' => 'dd/MM/yyyy HH:mm',
'date_type' => 'dd/MM/yyyy',
'date' => 'd/m/Y',
'duration' => '%h h %m',
],
'es' => [
'date_time_type' => 'dd.MM.yyyy HH:mm',
'date_type' => 'dd.MM.yyyy',
'date' => 'd.m.Y',
'duration' => '%h:%m h',
],
'ru' => [
'date_time_type' => 'dd.MM.yyyy HH:mm',
'date_type' => 'dd.MM.yyyy',
'date' => 'd.m.Y',
'duration' => '%h:%m h',
],
'ar' => [
'date_time_type' => 'yyyy-MM-dd HH:mm',
'date_type' => 'yyyy-MM-dd',
'date' => 'Y-m-d',
'duration' => '%h:%m h',
],
'hu' => [
'date_time_type' => 'yyyy.MM.dd HH:mm',
'date_type' => 'yyyy.MM.dd',
'date' => 'Y.m.d.',
'duration' => '%h:%m h',
@@ -160,32 +149,9 @@ class LocaleFormatsTest extends TestCase
$this->assertEquals('yyyy-MM-dd HH:mm', $sut->getDateTimeTypeFormat());
}
public function testGetDateTimePickerFormat()
{
$sut = $this->getSut('en', $this->getDefaultSettings());
$this->assertEquals('YYYY-MM-DD HH:mm', $sut->getDateTimePickerFormat());
}
public function testIs24Hours()
{
$sut = $this->getSut('en', $this->getDefaultSettings());
$this->assertFalse($sut->isTwentyFourHours());
}
public function testGetTimeFormat()
{
$sut = $this->getSut('en', $this->getDefaultSettings());
$this->assertEquals('H:i:s', $sut->getTimeFormat());
}
public function testUnknownSetting()
{
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('Unknown setting for locale en: date_time_type');
$sut = $this->getSut('en', ['en' => [
'xxx' => 'dd.MM.yyyy HH:mm',
]]);
$sut->getDateTimePickerFormat();
}
}