Files
kimai2/tests/Utils/LocaleFormatterTest.php
2026-05-21 22:14:10 +02:00

121 lines
4.0 KiB
PHP

<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Tests\Utils;
use App\Configuration\LocaleService;
use App\Entity\Timesheet;
use App\Utils\LocaleFormatter;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
#[CoversClass(LocaleFormatter::class)]
class LocaleFormatterTest extends TestCase
{
private ?string $oldTimezone = null;
protected function setUp(): void
{
$this->oldTimezone = date_default_timezone_get();
date_default_timezone_set('Europe/Vienna');
}
protected function tearDown(): void
{
if ($this->oldTimezone !== null) {
date_default_timezone_set($this->oldTimezone);
}
$this->oldTimezone = null;
}
public function testDurationFormattingWithTimesheet(): void
{
$sut = $this->getSut('en');
$timesheet = (new Timesheet())
->setBegin(new \DateTime('2020-07-09 08:00:00', new \DateTimeZone('Europe/Vienna')))
->setEnd(new \DateTime('2020-07-09 10:37:17', new \DateTimeZone('Europe/Vienna')))
->setDuration(9437);
self::assertSame('2:37', $sut->duration($timesheet));
self::assertSame('2.62', $sut->duration($timesheet, true));
self::assertSame('2.62', $sut->durationDecimal($timesheet));
}
public function testDurationDecimalWorksAfterAmountFormatting(): void
{
$sut = $this->getSut('de');
self::assertSame('1.234,5', $sut->amount(1234.5));
self::assertSame('2,62', $sut->durationDecimal(9437));
}
public function testAmountAndMoneyFormatting(): void
{
$sut = $this->getSut('en');
self::assertSame('0', $sut->amount(null));
self::assertSame('2,345.009', $sut->amount(2345.009));
self::assertSame('€2,345.01', $sut->money(2345.009, 'EUR'));
self::assertSame('2,345.01', $sut->money(2345.009, 'EUR', false));
}
public function testCurrencyFormattingFallsBackToInput(): void
{
$sut = $this->getSut('de');
self::assertSame('', $sut->currency(null));
self::assertSame('€', $sut->currency('eur'));
self::assertSame('INVALID', $sut->currency('INVALID'));
}
public function testDateAndTimeFormatting(): void
{
$sut = $this->getSut('de');
$date = new \DateTimeImmutable('1980-12-14 13:27:55', new \DateTimeZone('Europe/Vienna'));
self::assertSame('14.12.1980', $sut->dateShort($date));
self::assertSame('14.12.1980 13:27:55', $sut->dateTime($date));
self::assertSame('1980-12-14T13:27:55+01:00', $sut->dateFormat($date, 'c'));
self::assertSame('13:27:55', $sut->time($date));
}
public function testInvalidDateInputReturnsNull(): void
{
$sut = $this->getSut('en');
self::assertNull($sut->dateShort('not-a-date'));
self::assertNull($sut->dateTime('not-a-date'));
self::assertNull($sut->dateFormat('not-a-date', 'c'));
self::assertNull($sut->time('not-a-date'));
}
public function testLocalizedNames(): void
{
$sut = $this->getSut('en');
$date = new \DateTimeImmutable('2020-07-09 12:00:00', new \DateTimeZone('Europe/Vienna'));
self::assertSame('July', $sut->monthName($date));
self::assertSame('July 2020', $sut->monthName($date, true));
self::assertSame('Q3', $sut->quarterName($date));
self::assertSame('Q3 2020', $sut->quarterName($date, true));
self::assertSame('Thursday', $sut->dayName($date));
self::assertSame('Thu', $sut->dayName($date, true));
}
private function getSut(string $locale): LocaleFormatter
{
return new LocaleFormatter(new LocaleService([
'de' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'dd.MM.Y', 'time' => 'HH:mm:ss']),
'en' => array_merge(LocaleService::DEFAULT_SETTINGS, ['date' => 'Y-MM-dd', 'time' => 'HH:mm']),
]), $locale);
}
}