support custom fields for timesheets, customers, projects and activities (#871)
This commit is contained in:
114
tests/Entity/AbstractMetaEntityTest.php
Normal file
114
tests/Entity/AbstractMetaEntityTest.php
Normal file
@@ -0,0 +1,114 @@
|
||||
<?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\Entity;
|
||||
|
||||
use App\Entity\EntityWithMetaFields;
|
||||
use App\Entity\MetaTableTypeInterface;
|
||||
use App\Form\Type\DateTimePickerType;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Validator\Constraints\Length;
|
||||
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||
use Symfony\Component\Validator\Constraints\NotNull;
|
||||
|
||||
abstract class AbstractMetaEntityTest extends TestCase
|
||||
{
|
||||
abstract protected function getEntity(): EntityWithMetaFields;
|
||||
|
||||
abstract protected function getMetaEntity(): MetaTableTypeInterface;
|
||||
|
||||
public function testDefaultValues()
|
||||
{
|
||||
$sut = $this->getMetaEntity();
|
||||
self::assertNull($sut->getName());
|
||||
self::assertNull($sut->getType());
|
||||
self::assertNull($sut->getValue());
|
||||
self::assertNull($sut->getEntity());
|
||||
self::assertIsArray($sut->getConstraints());
|
||||
self::assertEmpty($sut->getConstraints());
|
||||
self::assertFalse($sut->isVisible());
|
||||
self::assertFalse($sut->isRequired());
|
||||
}
|
||||
|
||||
public function testSetterAndGetter()
|
||||
{
|
||||
$sut = $this->getMetaEntity();
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setName('foo-bar'));
|
||||
self::assertEquals('foo-bar', $sut->getName());
|
||||
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setisVisible(true));
|
||||
self::assertTrue($sut->isVisible());
|
||||
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setIsRequired(true));
|
||||
self::assertTrue($sut->isRequired());
|
||||
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setValue('hello world'));
|
||||
self::assertEquals('hello world', $sut->getValue());
|
||||
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setValue(956.32));
|
||||
self::assertEquals(956.32, $sut->getValue());
|
||||
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setType(DateTimePickerType::class));
|
||||
self::assertEquals(DateTimePickerType::class, $sut->getType());
|
||||
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->addConstraint(new Length(['max' => 10])));
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->addConstraint(new NotNull([])));
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->addConstraint(new NotBlank([])));
|
||||
self::assertCount(3, $sut->getConstraints());
|
||||
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setConstraints([new Length(['min' => 2])]));
|
||||
self::assertCount(1, $sut->getConstraints());
|
||||
|
||||
$entity = $this->getEntity();
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $sut->setEntity($entity));
|
||||
self::assertSame($entity, $sut->getEntity());
|
||||
}
|
||||
|
||||
public function testMerge()
|
||||
{
|
||||
$entity1 = $this->getEntity();
|
||||
$entity2 = $this->getEntity();
|
||||
$meta1 = $this->getMetaEntity();
|
||||
$meta1
|
||||
->setName('foo')
|
||||
->setValue('bar')
|
||||
->setType('blub')
|
||||
->setEntity($entity1)
|
||||
->setConstraints([new NotNull()])
|
||||
;
|
||||
self::assertEquals('foo', $meta1->getName());
|
||||
self::assertEquals('bar', $meta1->getValue());
|
||||
self::assertEquals('blub', $meta1->getType());
|
||||
self::assertFalse($meta1->isRequired());
|
||||
self::assertFalse($meta1->isVisible());
|
||||
self::assertSame($entity1, $meta1->getEntity());
|
||||
self::assertCount(1, $meta1->getConstraints());
|
||||
|
||||
$meta2 = $this->getMetaEntity();
|
||||
$meta2
|
||||
->setName('foo2')
|
||||
->setValue('bar2')
|
||||
->setType('blub2')
|
||||
->setEntity($entity2)
|
||||
->setIsRequired(true)
|
||||
->setisVisible(true)
|
||||
->setConstraints([new NotBlank(), new Length(['min' => 1])])
|
||||
;
|
||||
|
||||
self::assertInstanceOf(MetaTableTypeInterface::class, $meta1->merge($meta2));
|
||||
|
||||
self::assertEquals('foo', $meta1->getName());
|
||||
self::assertEquals('bar', $meta1->getValue());
|
||||
self::assertEquals('blub2', $meta1->getType());
|
||||
self::assertTrue($meta1->isRequired());
|
||||
self::assertTrue($meta1->isVisible());
|
||||
self::assertSame($entity1, $meta1->getEntity());
|
||||
self::assertCount(2, $meta1->getConstraints());
|
||||
}
|
||||
}
|
||||
42
tests/Entity/ActivityMetaTest.php
Normal file
42
tests/Entity/ActivityMetaTest.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?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\Entity;
|
||||
|
||||
use App\Entity\Activity;
|
||||
use App\Entity\ActivityMeta;
|
||||
use App\Entity\EntityWithMetaFields;
|
||||
use App\Entity\MetaTableTypeInterface;
|
||||
use App\Entity\Timesheet;
|
||||
|
||||
/**
|
||||
* @covers \App\Entity\ActivityMeta
|
||||
*/
|
||||
class ActivityMetaTest extends AbstractMetaEntityTest
|
||||
{
|
||||
protected function getEntity(): EntityWithMetaFields
|
||||
{
|
||||
return new Activity();
|
||||
}
|
||||
|
||||
protected function getMetaEntity(): MetaTableTypeInterface
|
||||
{
|
||||
return new ActivityMeta();
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \InvalidArgumentException
|
||||
* @expectedExceptionMessage Expected instanceof Activity, received "App\Entity\Timesheet"
|
||||
*/
|
||||
public function testSetEntityThrowsException()
|
||||
{
|
||||
$sut = new ActivityMeta();
|
||||
$sut->setEntity(new Timesheet());
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,8 @@
|
||||
namespace App\Tests\Entity;
|
||||
|
||||
use App\Entity\Activity;
|
||||
use App\Entity\ActivityMeta;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
@@ -31,6 +33,9 @@ class ActivityTest extends TestCase
|
||||
$this->assertNull($sut->getColor());
|
||||
$this->assertEquals(0.0, $sut->getBudget());
|
||||
$this->assertEquals(0, $sut->getTimeBudget());
|
||||
$this->assertInstanceOf(Collection::class, $sut->getMetaFields());
|
||||
$this->assertEquals(0, $sut->getMetaFields()->count());
|
||||
$this->assertNull($sut->getMetaField('foo'));
|
||||
}
|
||||
|
||||
public function testSetterAndGetter()
|
||||
@@ -61,4 +66,31 @@ class ActivityTest extends TestCase
|
||||
$this->assertInstanceOf(Activity::class, $sut->setTimeBudget(937321));
|
||||
$this->assertEquals(937321, $sut->getTimeBudget());
|
||||
}
|
||||
|
||||
public function testMetaFields()
|
||||
{
|
||||
$sut = new Activity();
|
||||
$meta = new ActivityMeta();
|
||||
$meta->setName('foo')->setValue('bar')->setType('test');
|
||||
$this->assertInstanceOf(Activity::class, $sut->setMetaField($meta));
|
||||
self::assertEquals(1, $sut->getMetaFields()->count());
|
||||
$result = $sut->getMetaField('foo');
|
||||
self::assertSame($result, $meta);
|
||||
self::assertEquals('test', $result->getType());
|
||||
|
||||
$meta2 = new ActivityMeta();
|
||||
$meta2->setName('foo')->setValue('bar')->setType('test2');
|
||||
$this->assertInstanceOf(Activity::class, $sut->setMetaField($meta2));
|
||||
self::assertEquals(1, $sut->getMetaFields()->count());
|
||||
self::assertCount(0, $sut->getVisibleMetaFields());
|
||||
|
||||
$result = $sut->getMetaField('foo');
|
||||
self::assertSame($result, $meta);
|
||||
self::assertEquals('test2', $result->getType());
|
||||
|
||||
$sut->setMetaField((new ActivityMeta())->setName('blub')->setIsVisible(true));
|
||||
$sut->setMetaField((new ActivityMeta())->setName('blab')->setIsVisible(true));
|
||||
self::assertEquals(3, $sut->getMetaFields()->count());
|
||||
self::assertCount(2, $sut->getVisibleMetaFields());
|
||||
}
|
||||
}
|
||||
|
||||
42
tests/Entity/CustomerMetaTest.php
Normal file
42
tests/Entity/CustomerMetaTest.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?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\Entity;
|
||||
|
||||
use App\Entity\Activity;
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\CustomerMeta;
|
||||
use App\Entity\EntityWithMetaFields;
|
||||
use App\Entity\MetaTableTypeInterface;
|
||||
|
||||
/**
|
||||
* @covers \App\Entity\CustomerMeta
|
||||
*/
|
||||
class CustomerMetaTest extends AbstractMetaEntityTest
|
||||
{
|
||||
protected function getEntity(): EntityWithMetaFields
|
||||
{
|
||||
return new Customer();
|
||||
}
|
||||
|
||||
protected function getMetaEntity(): MetaTableTypeInterface
|
||||
{
|
||||
return new CustomerMeta();
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \InvalidArgumentException
|
||||
* @expectedExceptionMessage Expected instanceof Customer, received "App\Entity\Activity"
|
||||
*/
|
||||
public function testSetEntityThrowsException()
|
||||
{
|
||||
$sut = new CustomerMeta();
|
||||
$sut->setEntity(new Activity());
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,8 @@
|
||||
namespace App\Tests\Entity;
|
||||
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\CustomerMeta;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
@@ -46,6 +48,9 @@ class CustomerTest extends TestCase
|
||||
$this->assertNull($sut->getColor());
|
||||
$this->assertEquals(0.0, $sut->getBudget());
|
||||
$this->assertEquals(0, $sut->getTimeBudget());
|
||||
$this->assertInstanceOf(Collection::class, $sut->getMetaFields());
|
||||
$this->assertEquals(0, $sut->getMetaFields()->count());
|
||||
$this->assertNull($sut->getMetaField('foo'));
|
||||
}
|
||||
|
||||
public function testSetterAndGetter()
|
||||
@@ -97,4 +102,31 @@ class CustomerTest extends TestCase
|
||||
$this->assertInstanceOf(Customer::class, $sut->setTimeBudget(937321));
|
||||
$this->assertEquals(937321, $sut->getTimeBudget());
|
||||
}
|
||||
|
||||
public function testMetaFields()
|
||||
{
|
||||
$sut = new Customer();
|
||||
$meta = new CustomerMeta();
|
||||
$meta->setName('foo')->setValue('bar')->setType('test');
|
||||
$this->assertInstanceOf(Customer::class, $sut->setMetaField($meta));
|
||||
self::assertEquals(1, $sut->getMetaFields()->count());
|
||||
$result = $sut->getMetaField('foo');
|
||||
self::assertSame($result, $meta);
|
||||
self::assertEquals('test', $result->getType());
|
||||
|
||||
$meta2 = new CustomerMeta();
|
||||
$meta2->setName('foo')->setValue('bar')->setType('test2');
|
||||
$this->assertInstanceOf(Customer::class, $sut->setMetaField($meta2));
|
||||
self::assertEquals(1, $sut->getMetaFields()->count());
|
||||
self::assertCount(0, $sut->getVisibleMetaFields());
|
||||
|
||||
$result = $sut->getMetaField('foo');
|
||||
self::assertSame($result, $meta);
|
||||
self::assertEquals('test2', $result->getType());
|
||||
|
||||
$sut->setMetaField((new CustomerMeta())->setName('blub')->setIsVisible(true));
|
||||
$sut->setMetaField((new CustomerMeta())->setName('blab')->setIsVisible(true));
|
||||
self::assertEquals(3, $sut->getMetaFields()->count());
|
||||
self::assertCount(2, $sut->getVisibleMetaFields());
|
||||
}
|
||||
}
|
||||
|
||||
42
tests/Entity/ProjectMetaTest.php
Normal file
42
tests/Entity/ProjectMetaTest.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?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\Entity;
|
||||
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\EntityWithMetaFields;
|
||||
use App\Entity\MetaTableTypeInterface;
|
||||
use App\Entity\Project;
|
||||
use App\Entity\ProjectMeta;
|
||||
|
||||
/**
|
||||
* @covers \App\Entity\ProjectMeta
|
||||
*/
|
||||
class ProjectMetaTest extends AbstractMetaEntityTest
|
||||
{
|
||||
protected function getEntity(): EntityWithMetaFields
|
||||
{
|
||||
return new Project();
|
||||
}
|
||||
|
||||
protected function getMetaEntity(): MetaTableTypeInterface
|
||||
{
|
||||
return new ProjectMeta();
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \InvalidArgumentException
|
||||
* @expectedExceptionMessage Expected instanceof Project, received "App\Entity\Customer"
|
||||
*/
|
||||
public function testSetEntityThrowsException()
|
||||
{
|
||||
$sut = new ProjectMeta();
|
||||
$sut->setEntity(new Customer());
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,8 @@ namespace App\Tests\Entity;
|
||||
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\Project;
|
||||
use App\Entity\ProjectMeta;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
@@ -36,6 +38,9 @@ class ProjectTest extends TestCase
|
||||
$this->assertNull($sut->getColor());
|
||||
$this->assertEquals(0.0, $sut->getBudget());
|
||||
$this->assertEquals(0, $sut->getTimeBudget());
|
||||
$this->assertInstanceOf(Collection::class, $sut->getMetaFields());
|
||||
$this->assertEquals(0, $sut->getMetaFields()->count());
|
||||
$this->assertNull($sut->getMetaField('foo'));
|
||||
}
|
||||
|
||||
public function testSetterAndGetter()
|
||||
@@ -73,4 +78,31 @@ class ProjectTest extends TestCase
|
||||
$this->assertInstanceOf(Project::class, $sut->setTimeBudget(937321));
|
||||
$this->assertEquals(937321, $sut->getTimeBudget());
|
||||
}
|
||||
|
||||
public function testMetaFields()
|
||||
{
|
||||
$sut = new Project();
|
||||
$meta = new ProjectMeta();
|
||||
$meta->setName('foo')->setValue('bar')->setType('test');
|
||||
$this->assertInstanceOf(Project::class, $sut->setMetaField($meta));
|
||||
self::assertEquals(1, $sut->getMetaFields()->count());
|
||||
$result = $sut->getMetaField('foo');
|
||||
self::assertSame($result, $meta);
|
||||
self::assertEquals('test', $result->getType());
|
||||
|
||||
$meta2 = new ProjectMeta();
|
||||
$meta2->setName('foo')->setValue('bar')->setType('test2');
|
||||
$this->assertInstanceOf(Project::class, $sut->setMetaField($meta2));
|
||||
self::assertEquals(1, $sut->getMetaFields()->count());
|
||||
self::assertCount(0, $sut->getVisibleMetaFields());
|
||||
|
||||
$result = $sut->getMetaField('foo');
|
||||
self::assertSame($result, $meta);
|
||||
self::assertEquals('test2', $result->getType());
|
||||
|
||||
$sut->setMetaField((new ProjectMeta())->setName('blub')->setIsVisible(true));
|
||||
$sut->setMetaField((new ProjectMeta())->setName('blab')->setIsVisible(true));
|
||||
self::assertEquals(3, $sut->getMetaFields()->count());
|
||||
self::assertCount(2, $sut->getVisibleMetaFields());
|
||||
}
|
||||
}
|
||||
|
||||
42
tests/Entity/TimesheetMetaTest.php
Normal file
42
tests/Entity/TimesheetMetaTest.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?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\Entity;
|
||||
|
||||
use App\Entity\EntityWithMetaFields;
|
||||
use App\Entity\MetaTableTypeInterface;
|
||||
use App\Entity\Project;
|
||||
use App\Entity\Timesheet;
|
||||
use App\Entity\TimesheetMeta;
|
||||
|
||||
/**
|
||||
* @covers \App\Entity\TimesheetMeta
|
||||
*/
|
||||
class TimesheetMetaTest extends AbstractMetaEntityTest
|
||||
{
|
||||
protected function getEntity(): EntityWithMetaFields
|
||||
{
|
||||
return new Timesheet();
|
||||
}
|
||||
|
||||
protected function getMetaEntity(): MetaTableTypeInterface
|
||||
{
|
||||
return new TimesheetMeta();
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \InvalidArgumentException
|
||||
* @expectedExceptionMessage Expected instanceof Timesheet, received "App\Entity\Project"
|
||||
*/
|
||||
public function testSetEntityThrowsException()
|
||||
{
|
||||
$sut = new TimesheetMeta();
|
||||
$sut->setEntity(new Project());
|
||||
}
|
||||
}
|
||||
@@ -14,8 +14,10 @@ use App\Entity\Customer;
|
||||
use App\Entity\Project;
|
||||
use App\Entity\Tag;
|
||||
use App\Entity\Timesheet;
|
||||
use App\Entity\TimesheetMeta;
|
||||
use App\Entity\User;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
@@ -39,11 +41,13 @@ class TimesheetTest extends TestCase
|
||||
$this->assertNull($sut->getHourlyRate());
|
||||
$this->assertEquals(new ArrayCollection(), $sut->getTags());
|
||||
$this->assertEquals([], $sut->getTagsAsArray());
|
||||
|
||||
$this->assertInstanceOf(Timesheet::class, $sut->setFixedRate(13.47));
|
||||
$this->assertEquals(13.47, $sut->getFixedRate());
|
||||
$this->assertInstanceOf(Timesheet::class, $sut->setHourlyRate(99));
|
||||
$this->assertEquals(99, $sut->getHourlyRate());
|
||||
$this->assertInstanceOf(Collection::class, $sut->getMetaFields());
|
||||
$this->assertEquals(0, $sut->getMetaFields()->count());
|
||||
$this->assertNull($sut->getMetaField('foo'));
|
||||
}
|
||||
|
||||
protected function getEntity()
|
||||
@@ -89,4 +93,31 @@ class TimesheetTest extends TestCase
|
||||
$sut->removeTag($tag1);
|
||||
$this->assertEmpty($sut->getTags());
|
||||
}
|
||||
|
||||
public function testMetaFields()
|
||||
{
|
||||
$sut = new Timesheet();
|
||||
$meta = new TimesheetMeta();
|
||||
$meta->setName('foo')->setValue('bar')->setType('test');
|
||||
$this->assertInstanceOf(Timesheet::class, $sut->setMetaField($meta));
|
||||
self::assertEquals(1, $sut->getMetaFields()->count());
|
||||
$result = $sut->getMetaField('foo');
|
||||
self::assertSame($result, $meta);
|
||||
self::assertEquals('test', $result->getType());
|
||||
|
||||
$meta2 = new TimesheetMeta();
|
||||
$meta2->setName('foo')->setValue('bar')->setType('test2');
|
||||
$this->assertInstanceOf(Timesheet::class, $sut->setMetaField($meta2));
|
||||
self::assertEquals(1, $sut->getMetaFields()->count());
|
||||
self::assertCount(0, $sut->getVisibleMetaFields());
|
||||
|
||||
$result = $sut->getMetaField('foo');
|
||||
self::assertSame($result, $meta);
|
||||
self::assertEquals('test2', $result->getType());
|
||||
|
||||
$sut->setMetaField((new TimesheetMeta())->setName('blub')->setIsVisible(true));
|
||||
$sut->setMetaField((new TimesheetMeta())->setName('blab')->setIsVisible(true));
|
||||
self::assertEquals(3, $sut->getMetaFields()->count());
|
||||
self::assertCount(2, $sut->getVisibleMetaFields());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user