Display meta-fields in datatables (#1116)

This commit is contained in:
Kevin Papst
2019-09-19 20:28:31 +02:00
committed by GitHub
parent 24cbe3d281
commit 5aa422dde1
71 changed files with 1461 additions and 212 deletions

View File

@@ -84,13 +84,13 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
{
$data = ['message' => 'Authentication required, missing headers: X-AUTH-USER, X-AUTH-TOKEN'];
$this->assertEquals(
self::assertEquals(
$data,
json_decode($response->getContent(), true),
sprintf('The secure URL %s is not protected.', $url)
);
$this->assertEquals(
self::assertEquals(
Response::HTTP_FORBIDDEN,
$response->getStatusCode(),
sprintf('The secure URL %s has the wrong status code %s.', $url, $response->getStatusCode())
@@ -107,7 +107,7 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
$client = $this->getClientForAuthenticatedUser($role);
$client->request($method, $this->createUrl($url));
$this->assertFalse(
self::assertFalse(
$client->getResponse()->isSuccessful(),
sprintf('The secure URL %s is not protected for role %s', $url, $role)
);
@@ -117,9 +117,9 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
'message' => 'Access denied.'
];
$this->assertEquals(403, $client->getResponse()->getStatusCode());
self::assertEquals(403, $client->getResponse()->getStatusCode());
$this->assertEquals(
self::assertEquals(
$expected,
json_decode($client->getResponse()->getContent(), true)
);
@@ -142,9 +142,9 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
'message' => 'Not found'
];
$this->assertEquals(404, $client->getResponse()->getStatusCode());
self::assertEquals(404, $client->getResponse()->getStatusCode());
$this->assertEquals(
self::assertEquals(
$expected,
json_decode($client->getResponse()->getContent(), true)
);
@@ -164,11 +164,11 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
$this->request($client, $url, 'PATCH', [], json_encode($data));
$response = $client->getResponse();
$this->assertFalse($response->isSuccessful());
self::assertFalse($response->isSuccessful());
$this->assertEquals($expectedErrors['code'], $client->getResponse()->getStatusCode());
self::assertEquals($expectedErrors['code'], $client->getResponse()->getStatusCode());
$this->assertEquals(
self::assertEquals(
$expectedErrors,
json_decode($client->getResponse()->getContent(), true)
);
@@ -180,16 +180,16 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
$this->request($client, $url, 'DELETE', [], json_encode($data));
$response = $client->getResponse();
$this->assertFalse($response->isSuccessful());
self::assertFalse($response->isSuccessful());
$expected = [
'code' => 404,
'message' => 'Not found'
];
$this->assertEquals(404, $client->getResponse()->getStatusCode());
self::assertEquals(404, $client->getResponse()->getStatusCode());
$this->assertEquals(
self::assertEquals(
$expected,
json_decode($client->getResponse()->getContent(), true)
);
@@ -197,9 +197,9 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
protected function assertApiException(Response $response, string $message)
{
$this->assertFalse($response->isSuccessful());
$this->assertEquals(500, $response->getStatusCode());
$this->assertEquals(['code' => 500, 'message' => $message], json_decode($response->getContent(), true));
self::assertFalse($response->isSuccessful());
self::assertEquals(500, $response->getStatusCode());
self::assertEquals(['code' => 500, 'message' => $message], json_decode($response->getContent(), true));
}
protected function assertApiAccessDenied(Client $client, string $url, string $message)
@@ -210,28 +210,35 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
protected function assertApiResponseAccessDenied(Response $response, string $message)
{
$this->assertFalse($response->isSuccessful());
$this->assertEquals(Response::HTTP_FORBIDDEN, $response->getStatusCode());
self::assertFalse($response->isSuccessful());
self::assertEquals(Response::HTTP_FORBIDDEN, $response->getStatusCode());
$expected = ['code' => Response::HTTP_FORBIDDEN, 'message' => $message];
$this->assertEquals($expected, json_decode($response->getContent(), true));
self::assertEquals($expected, json_decode($response->getContent(), true));
}
/**
* @param Response $response
* @param string[] $failedFields
* @param bool $extraFields
*/
protected function assertApiCallValidationError(Response $response, array $failedFields)
protected function assertApiCallValidationError(Response $response, array $failedFields, bool $extraFields = false)
{
$this->assertFalse($response->isSuccessful());
self::assertFalse($response->isSuccessful());
$result = json_decode($response->getContent(), true);
$this->assertArrayHasKey('errors', $result);
$this->assertArrayHasKey('children', $result['errors']);
self::assertArrayHasKey('errors', $result);
if ($extraFields) {
self::assertArrayHasKey('errors', $result['errors']);
self::assertEquals($result['errors']['errors'][0], 'This form should not contain extra fields.');
}
self::assertArrayHasKey('children', $result['errors']);
$data = $result['errors']['children'];
foreach ($failedFields as $fieldName) {
$this->assertArrayHasKey($fieldName, $data);
$this->assertArrayHasKey('errors', $data[$fieldName]);
self::assertArrayHasKey($fieldName, $data);
self::assertArrayHasKey('errors', $data[$fieldName]);
}
}
}

View File

@@ -164,6 +164,20 @@ class ActivityControllerTest extends APIControllerBaseTest
$this->assertEquals('User cannot create activities', $json['message']);
}
public function testPostActionWithInvalidData()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$data = [
'name' => 'foo',
'project' => 100,
'unexpected' => 'foo-bar',
'visible' => true
];
$this->request($client, '/api/activities', 'POST', [], json_encode($data));
$response = $client->getResponse();
$this->assertApiCallValidationError($response, ['project'], true);
}
public function testPatchAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);

View File

@@ -101,6 +101,22 @@ class CustomerControllerTest extends APIControllerBaseTest
$this->assertEquals('User cannot create customers', $json['message']);
}
public function testPostActionWithInvalidData()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$data = [
'name' => 'foo',
'visible' => true,
'country' => 'XYZ',
'currency' => '---',
'timezone' => 'foo/bar',
'unexpected' => 'field',
];
$this->request($client, '/api/customers', 'POST', [], json_encode($data));
$response = $client->getResponse();
$this->assertApiCallValidationError($response, ['country', 'currency', 'timezone'], true);
}
public function testPatchAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);

View File

@@ -156,6 +156,20 @@ class ProjectControllerTest extends APIControllerBaseTest
$this->assertEquals('User cannot create projects', $json['message']);
}
public function testPostActionWithInvalidData()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
$data = [
'name' => 'foo',
'customer' => 100,
'xxxxx' => 'whoami',
'visible' => true
];
$this->request($client, '/api/projects', 'POST', [], json_encode($data));
$response = $client->getResponse();
$this->assertApiCallValidationError($response, ['customer'], true);
}
public function testPatchAction()
{
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);

View File

@@ -33,6 +33,8 @@ abstract class AbstractMetaEntityTest extends TestCase
self::assertNull($sut->getEntity());
self::assertIsArray($sut->getConstraints());
self::assertEmpty($sut->getConstraints());
self::assertIsArray($sut->getOptions());
self::assertEmpty($sut->getOptions());
self::assertFalse($sut->isVisible());
self::assertFalse($sut->isRequired());
}
@@ -71,6 +73,9 @@ abstract class AbstractMetaEntityTest extends TestCase
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setConstraints([new Length(['min' => 2])]));
self::assertCount(1, $sut->getConstraints());
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setOptions(['foo' => 'bar']));
self::assertCount(1, $sut->getOptions());
$entity = $this->getEntity();
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setEntity($entity));
self::assertSame($entity, $sut->getEntity());
@@ -87,24 +92,29 @@ abstract class AbstractMetaEntityTest extends TestCase
->setType('blub')
->setEntity($entity1)
->setConstraints([new NotNull()])
->setOptions(['foo' => 'bar', 'bar' => 'foo'])
;
self::assertEquals('foo', $meta1->getName());
self::assertEquals('bar', $meta1->getValue());
self::assertEquals('blub', $meta1->getType());
self::assertEquals('foo', $meta1->getLabel());
self::assertFalse($meta1->isRequired());
self::assertFalse($meta1->isVisible());
self::assertSame($entity1, $meta1->getEntity());
self::assertCount(1, $meta1->getConstraints());
self::assertCount(2, $meta1->getOptions());
$meta2 = $this->getMetaEntity();
$meta2
->setName('foo2')
->setLabel('TRALALA')
->setValue('bar2')
->setType('blub2')
->setEntity($entity2)
->setIsRequired(true)
->setisVisible(true)
->setConstraints([new NotBlank(), new Length(['min' => 1])])
->setOptions(['foo1' => 'bar1'])
;
self::assertInstanceOf(MetaTableTypeInterface::class, $meta1->merge($meta2));
@@ -112,9 +122,12 @@ abstract class AbstractMetaEntityTest extends TestCase
self::assertEquals('foo', $meta1->getName());
self::assertEquals('bar', $meta1->getValue());
self::assertEquals('blub2', $meta1->getType());
self::assertEquals('TRALALA', $meta1->getLabel());
self::assertTrue($meta1->isRequired());
self::assertTrue($meta1->isVisible());
self::assertSame($entity1, $meta1->getEntity());
self::assertCount(2, $meta1->getConstraints());
self::assertCount(1, $meta1->getOptions());
self::assertEquals(['foo1' => 'bar1'], $meta1->getOptions());
}
}

View File

@@ -0,0 +1,39 @@
<?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\Event;
use App\Entity\ActivityMeta;
use App\Event\ActivityMetaDisplayEvent;
use App\Event\MetaDisplayEventInterface;
use App\Repository\Query\ActivityQuery;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Event\ActivityMetaDisplayEvent
*/
class ActivityMetaDisplayEventTest extends TestCase
{
public function testGetterAndSetter()
{
$query = new ActivityQuery();
$sut = new ActivityMetaDisplayEvent($query, ActivityMetaDisplayEvent::EXPORT);
self::assertInstanceOf(MetaDisplayEventInterface::class, $sut);
self::assertSame($sut->getQuery(), $query);
self::assertIsArray($sut->getFields());
self::assertEmpty($sut->getFields());
self::assertEquals('export', $sut->getLocation());
$sut->addField(new ActivityMeta());
$sut->addField(new ActivityMeta());
self::assertCount(2, $sut->getFields());
}
}

View File

@@ -0,0 +1,39 @@
<?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\Event;
use App\Entity\CustomerMeta;
use App\Event\CustomerMetaDisplayEvent;
use App\Event\MetaDisplayEventInterface;
use App\Repository\Query\CustomerQuery;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Event\CustomerMetaDisplayEvent
*/
class CustomerMetaDisplayEventTest extends TestCase
{
public function testGetterAndSetter()
{
$query = new CustomerQuery();
$sut = new CustomerMetaDisplayEvent($query, CustomerMetaDisplayEvent::EXPORT);
self::assertInstanceOf(MetaDisplayEventInterface::class, $sut);
self::assertSame($sut->getQuery(), $query);
self::assertIsArray($sut->getFields());
self::assertEmpty($sut->getFields());
self::assertEquals('export', $sut->getLocation());
$sut->addField(new CustomerMeta());
$sut->addField(new CustomerMeta());
self::assertCount(2, $sut->getFields());
}
}

View File

@@ -0,0 +1,39 @@
<?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\Event;
use App\Entity\ProjectMeta;
use App\Event\MetaDisplayEventInterface;
use App\Event\ProjectMetaDisplayEvent;
use App\Repository\Query\ProjectQuery;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Event\ProjectMetaDisplayEvent
*/
class ProjectMetaQueryDisplayTest extends TestCase
{
public function testGetterAndSetter()
{
$query = new ProjectQuery();
$sut = new ProjectMetaDisplayEvent($query, ProjectMetaDisplayEvent::EXPORT);
self::assertInstanceOf(MetaDisplayEventInterface::class, $sut);
self::assertSame($sut->getQuery(), $query);
self::assertIsArray($sut->getFields());
self::assertEmpty($sut->getFields());
self::assertEquals('export', $sut->getLocation());
$sut->addField(new ProjectMeta());
$sut->addField(new ProjectMeta());
self::assertCount(2, $sut->getFields());
}
}

View File

@@ -0,0 +1,39 @@
<?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\Event;
use App\Entity\TimesheetMeta;
use App\Event\MetaDisplayEventInterface;
use App\Event\TimesheetMetaDisplayEvent;
use App\Repository\Query\TimesheetQuery;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Event\TimesheetMetaDisplayEvent
*/
class TimesheetMetaDisplayEventTest extends TestCase
{
public function testGetterAndSetter()
{
$query = new TimesheetQuery();
$sut = new TimesheetMetaDisplayEvent($query, TimesheetMetaDisplayEvent::EXPORT);
self::assertInstanceOf(MetaDisplayEventInterface::class, $sut);
self::assertSame($sut->getQuery(), $query);
self::assertIsArray($sut->getFields());
self::assertEmpty($sut->getFields());
self::assertEquals('export', $sut->getLocation());
$sut->addField(new TimesheetMeta());
$sut->addField(new TimesheetMeta());
self::assertCount(2, $sut->getFields());
}
}

View File

@@ -11,17 +11,28 @@ namespace App\Tests\Export\Renderer;
use App\Configuration\LanguageFormattings;
use App\Entity\Activity;
use App\Entity\ActivityMeta;
use App\Entity\Customer;
use App\Entity\CustomerMeta;
use App\Entity\MetaTableTypeInterface;
use App\Entity\Project;
use App\Entity\ProjectMeta;
use App\Entity\Tag;
use App\Entity\Timesheet;
use App\Entity\TimesheetMeta;
use App\Entity\User;
use App\Event\ActivityMetaDisplayEvent;
use App\Event\CustomerMetaDisplayEvent;
use App\Event\ProjectMetaDisplayEvent;
use App\Event\TimesheetMetaDisplayEvent;
use App\Export\RendererInterface;
use App\Repository\Query\TimesheetQuery;
use App\Twig\DateExtensions;
use App\Utils\LocaleSettings;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\Translation\TranslatorInterface;
@@ -52,7 +63,10 @@ abstract class AbstractRendererTest extends KernelTestCase
$translator = $this->getMockBuilder(TranslatorInterface::class)->getMock();
$dateExtension = new DateExtensions($localeSettings);
return new $classname($translator, $dateExtension);
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new MetaFieldColumnSubscriber());
return new $classname($translator, $dateExtension, $dispatcher);
}
/**
@@ -63,14 +77,18 @@ abstract class AbstractRendererTest extends KernelTestCase
{
$customer = new Customer();
$customer->setName('Customer Name');
$customer->setMetaField((new CustomerMeta())->setName('customer-foo')->setValue('customer-bar')->setIsVisible(true));
$project = new Project();
$project->setName('project name');
$project->setCustomer($customer);
$project->setMetaField((new ProjectMeta())->setName('project-bar')->setValue('project-bar')->setIsVisible(true));
$project->setMetaField((new ProjectMeta())->setName('project-foo2')->setValue('project-foo2')->setIsVisible(true));
$activity = new Activity();
$activity->setName('activity description');
$activity->setProject($project);
$activity->setMetaField((new ActivityMeta())->setName('activity-foo')->setValue('activity-bar')->setIsVisible(true));
$userMethods = ['getId', 'getPreferenceValue', 'getUsername'];
$user1 = $this->getMockBuilder(User::class)->setMethods($userMethods)->disableOriginalConstructor()->getMock();
@@ -153,3 +171,47 @@ abstract class AbstractRendererTest extends KernelTestCase
return $renderer->render($entries, $query);
}
}
class MetaFieldColumnSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
TimesheetMetaDisplayEvent::class => ['loadTimesheetField', 200],
CustomerMetaDisplayEvent::class => ['loadCustomerField', 200],
ProjectMetaDisplayEvent::class => ['loadProjectField', 200],
ActivityMetaDisplayEvent::class => ['loadActivityField', 200],
];
}
public function loadTimesheetField(TimesheetMetaDisplayEvent $event)
{
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo'));
$event->addField($this->prepareEntity(new TimesheetMeta(), 'foo2'));
}
public function loadCustomerField(CustomerMetaDisplayEvent $event)
{
$event->addField($this->prepareEntity(new CustomerMeta(), 'customer-foo'));
}
public function loadProjectField(ProjectMetaDisplayEvent $event)
{
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo'));
$event->addField($this->prepareEntity(new ProjectMeta(), 'project-foo2')->setIsVisible(false));
}
public function loadActivityField(ActivityMetaDisplayEvent $event)
{
$event->addField($this->prepareEntity(new ActivityMeta(), 'activity-foo'));
}
private function prepareEntity(MetaTableTypeInterface $meta, string $name)
{
return $meta
->setLabel('Working place')
->setName($name)
->setType(TextType::class)
->setIsVisible(true);
}
}

View File

@@ -92,12 +92,15 @@ class CsvRendererTest extends AbstractRendererTest
13 => ' EUR 84.00 ',
14 => 'meta-bar',
15 => 'meta-bar2',
16 => 'customer-bar',
17 => '',
18 => 'project-foo2',
19 => 'activity-bar',
];
self::assertEquals(7, count($all));
self::assertEquals($expected, $all[5]);
self::assertEquals(count($expected), count($all[0]));
self::assertEquals('foo', $all[4][11]);
self::assertEquals($expected, $all[5]);
}
}

View File

@@ -10,6 +10,7 @@
namespace App\Tests\Export\Renderer;
use App\Export\Renderer\HtmlRenderer;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpFoundation\Request;
use Twig\Environment;
@@ -23,7 +24,8 @@ class HtmlRendererTest extends AbstractRendererTest
public function testConfiguration()
{
$sut = new HtmlRenderer(
$this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock()
$this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock(),
new EventDispatcher()
);
$this->assertEquals('html', $sut->getId());
@@ -41,7 +43,7 @@ class HtmlRendererTest extends AbstractRendererTest
$request->setLocale('en');
$stack->push($request);
$sut = new HtmlRenderer($twig);
$sut = new HtmlRenderer($twig, new EventDispatcher());
$response = $this->render($sut);

View File

@@ -12,6 +12,7 @@ namespace App\Tests\Export;
use App\Export\Renderer\HtmlRenderer;
use App\Export\ServiceExport;
use PHPUnit\Framework\TestCase;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Twig\Environment;
/**
@@ -36,7 +37,8 @@ class ServiceExportTest extends TestCase
$sut = new ServiceExport([]);
$sut->addRenderer(new HtmlRenderer(
$this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock()
$this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock(),
new EventDispatcher()
));
$this->assertEquals(1, count($sut->getRenderer()));
@@ -45,7 +47,8 @@ class ServiceExportTest extends TestCase
public function testAddViaConstruct()
{
$renderer = [new HtmlRenderer(
$this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock()
$this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock(),
new EventDispatcher()
)];
$sut = new ServiceExport($renderer);

View File

@@ -0,0 +1,29 @@
<?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\Repository\Loader;
use App\Repository\Loader\DefaultLoader;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Repository\Loader\DefaultLoader
*/
class DefaultLoaderTest extends TestCase
{
public function testLoadResults()
{
$sut = new DefaultLoader();
$input = [];
$sut->loadResults($input);
self::assertEquals([], $input);
}
}

View File

@@ -0,0 +1,30 @@
<?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\Repository\Paginator;
use App\Repository\Paginator\QueryBuilderPaginator;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\QueryBuilder;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Repository\Paginator\QueryBuilderPaginator
*/
class QueryBuilderPaginatorTest extends TestCase
{
public function testPaginator()
{
$em = $this->getMockBuilder(EntityManager::class)->disableOriginalConstructor()->getMock();
$qb = new QueryBuilder($em);
$sut = new QueryBuilderPaginator($qb, 10);
self::assertEquals(10, $sut->getNbResults());
}
}

View File

@@ -69,11 +69,11 @@ class DateExtensionsTest extends TestCase
/**
* @param string $locale
* @param \DateTime $date
* @param \DateTime|string $date
* @param string $result
* @dataProvider getDateShortData
*/
public function testDateShort($locale, \DateTime $date, $result)
public function testDateShort($locale, $date, $result)
{
$sut = $this->getSut($locale, [
'de' => ['date' => 'd.m.Y'],
@@ -90,16 +90,17 @@ class DateExtensionsTest extends TestCase
['en', new \DateTime('2016-06-23'), '2016-06-23'],
['de', new \DateTime('1980-12-14'), '14.12.1980'],
['ru', new \DateTime('1980-12-14'), '14.12.1980'],
['ru', '1980-12-14', '14.12.1980'],
];
}
/**
* @param string $locale
* @param \DateTime $date
* @param \DateTime|string $date
* @param string $result
* @dataProvider getDateTimeData
*/
public function testDateTime($locale, \DateTime $date, $result)
public function testDateTime($locale, $date, $result)
{
$sut = $this->getSut($locale, [
'de' => ['date_time' => 'd.m.Y H:i:s'],
@@ -113,6 +114,7 @@ class DateExtensionsTest extends TestCase
return [
['en', new \DateTime('7 January 2010'), '2010-01-07 12:01 AM'],
['de', (new \DateTime('1980-12-14'))->setTime(13, 27, 55), '14.12.1980 13:27:55'],
['de', '1980-12-14 13:27:55', '14.12.1980 13:27:55'],
];
}
@@ -141,6 +143,7 @@ class DateExtensionsTest extends TestCase
$date = new \DateTime('7 January 2010 17:43:21', new \DateTimeZone('Europe/Berlin'));
$sut = $this->getSut('en', []);
$this->assertEquals('2010-01-07T17:43:21+01:00', $sut->dateFormat($date, 'c'));
$this->assertStringStartsWith('2010-01-07T17:43:21', $sut->dateFormat('7 January 2010 17:43:21', 'c'));
}
public function testTime()
@@ -150,6 +153,7 @@ class DateExtensionsTest extends TestCase
$sut = $this->getSut('en', ['en' => ['time' => 'H:i']]);
$this->assertEquals('17:53', $sut->time($time));
$this->assertEquals('17:53', $sut->time('2016-06-23 17:53'));
}
public function testHour24()
@@ -176,5 +180,6 @@ class DateExtensionsTest extends TestCase
$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'));
}
}

View File

@@ -50,7 +50,7 @@ class ExtensionsTest extends TestCase
public function testGetFilters()
{
$filters = ['duration', 'duration_decimal', 'money', 'currency', 'country', 'docu_link'];
$filters = ['duration', 'duration_decimal', 'money', 'currency', 'country', 'language', 'docu_link'];
$sut = $this->getSut($this->localeDe);
$twigFilters = $sut->getFilters();
$this->assertCount(count($filters), $twigFilters);
@@ -117,6 +117,20 @@ class ExtensionsTest extends TestCase
}
}
public function testLanguage()
{
$languages = [
'de' => 'German',
'ru' => 'Russian',
'es' => 'Spanish',
];
$sut = $this->getSut($this->localeEn);
foreach ($languages as $locale => $name) {
$this->assertEquals($name, $sut->language($locale));
}
}
public function testMoneyNull()
{
$sut = $this->getSut($this->localeEn, 'en');