Display meta-fields in datatables (#1116)
This commit is contained in:
@@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
39
tests/Event/ActivityMetaDisplayEventTest.php
Normal file
39
tests/Event/ActivityMetaDisplayEventTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
39
tests/Event/CustomerMetaDisplayEventTest.php
Normal file
39
tests/Event/CustomerMetaDisplayEventTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
39
tests/Event/ProjectMetaQueryDisplayTest.php
Normal file
39
tests/Event/ProjectMetaQueryDisplayTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
39
tests/Event/TimesheetMetaDisplayEventTest.php
Normal file
39
tests/Event/TimesheetMetaDisplayEventTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
29
tests/Repository/Loader/DefaultLoaderTest.php
Normal file
29
tests/Repository/Loader/DefaultLoaderTest.php
Normal 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);
|
||||
}
|
||||
}
|
||||
30
tests/Repository/Paginator/QueryBuilderPaginatorTest.php
Normal file
30
tests/Repository/Paginator/QueryBuilderPaginatorTest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
@@ -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'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user