Release 2.40.0 (#5621)

This commit is contained in:
Kevin Papst
2025-09-26 10:49:06 +02:00
committed by GitHub
parent 6d78c6ba36
commit 7937fa281a
54 changed files with 531 additions and 399 deletions

View File

@@ -45,4 +45,27 @@ abstract class AbstractEntityTestCase extends TestCase
self::assertEquals('Unknown budget type: foo', $e->getMessage());
}
}
public function assertCloneResetsId(object $sut): void
{
if (!property_exists($sut, 'id')) {
$this->fail('Entity does not have an ID property');
}
if (!method_exists($sut, 'getId')) {
$this->fail('Entity does not have a getId() method');
}
self::assertNull($sut->getId());
$obj = new \ReflectionObject($sut);
$prop = $obj->getProperty('id');
$prop->setAccessible(true);
$prop->setValue($sut, 123);
self::assertEquals(123, $sut->getId());
$clone = clone $sut;
self::assertNull($clone->getId());
$prop->setValue($sut, null);
$prop->setAccessible(false);
}
}

View File

@@ -48,4 +48,11 @@ class AccessTokenTest extends AbstractEntityTestCase
$sut->setExpiresAt(new \DateTimeImmutable('-1 day'));
self::assertFalse($sut->isValid());
}
public function testClone(): void
{
$user = new User();
$sut = new AccessToken($user, 'foo');
$this->assertCloneResetsId($sut);
}
}

View File

@@ -11,13 +11,12 @@ namespace App\Tests\Entity;
use App\Entity\Activity;
use App\Entity\ActivityRate;
use App\Entity\Rate;
use App\Entity\User;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Entity\Rate
*/
#[CoversClass(Rate::class)]
#[CoversClass(ActivityRate::class)]
class ActivityRateTest extends TestCase
{

View File

@@ -175,6 +175,8 @@ class ActivityTest extends AbstractEntityTestCase
$sut->setName('activity1111');
$sut->setComment('DE-0123456789');
$this->assertCloneResetsId($sut);
$project = new Project();
$project->setName('foo');
$project->setOrderNumber('1234567890');

View File

@@ -12,10 +12,9 @@ namespace App\Tests\Entity;
use App\Entity\Bookmark;
use App\Entity\User;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
#[CoversClass(Bookmark::class)]
class BookmarkTest extends TestCase
class BookmarkTest extends AbstractEntityTestCase
{
public function testDefaultValues(): void
{
@@ -48,4 +47,10 @@ class BookmarkTest extends TestCase
self::assertEquals('sdsdsd', $sut2->getType());
self::assertEquals('foo-bar', $sut2->getName());
}
public function testClone(): void
{
$sut = new Bookmark();
$this->assertCloneResetsId($sut);
}
}

View File

@@ -31,5 +31,14 @@ class ConfigurationTest extends TestCase
self::assertEquals('foo-bar', $sut->getName());
self::assertInstanceOf(Configuration::class, $sut->setValue('hello world'));
self::assertEquals('hello world', $sut->getValue());
self::assertInstanceOf(Configuration::class, $sut->setValue(true));
self::assertEquals('1', $sut->getValue());
self::assertInstanceOf(Configuration::class, $sut->setValue(null));
self::assertNull($sut->getValue());
self::assertInstanceOf(Configuration::class, $sut->setValue(false));
self::assertEquals('0', $sut->getValue());
}
}

View File

@@ -9,13 +9,12 @@
namespace App\Tests\Entity;
use App\Entity\CommentTableTypeTrait;
use App\Entity\Customer;
use App\Entity\CustomerComment;
use PHPUnit\Framework\Attributes\CoversClass;
/**
* @covers \App\Entity\CommentTableTypeTrait
*/
#[CoversClass(CommentTableTypeTrait::class)]
#[CoversClass(CustomerComment::class)]
class CustomerCommentTest extends AbstractCommentEntityTestCase
{

View File

@@ -11,13 +11,12 @@ namespace App\Tests\Entity;
use App\Entity\Customer;
use App\Entity\CustomerRate;
use App\Entity\Rate;
use App\Entity\User;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Entity\Rate
*/
#[CoversClass(Rate::class)]
#[CoversClass(CustomerRate::class)]
class CustomerRateTest extends TestCase
{

View File

@@ -12,6 +12,7 @@ namespace App\Tests\Entity;
use App\Constants;
use App\Entity\Customer;
use App\Entity\CustomerMeta;
use App\Entity\InvoiceTemplate;
use App\Entity\Team;
use App\Export\Spreadsheet\ColumnDefinition;
use App\Export\Spreadsheet\Extractor\AnnotationExtractor;
@@ -51,6 +52,26 @@ class CustomerTest extends AbstractEntityTestCase
self::assertNull($sut->getMetaField('foo'));
self::assertInstanceOf(Collection::class, $sut->getTeams());
self::assertEquals(0, $sut->getTeams()->count());
self::assertTrue($sut->isNew());
self::assertNull($sut->getInvoiceText());
self::assertNull($sut->getInvoiceTemplate());
}
public function testInvoiceText(): void
{
$sut = new Customer('foo');
self::assertNull($sut->getInvoiceText());
$sut->setInvoiceText('Some fancy long text to explain that tax should be handled by the receiving party');
self::assertEquals('Some fancy long text to explain that tax should be handled by the receiving party', $sut->getInvoiceText());
}
public function testInvoiceTemplate(): void
{
$tpl = new InvoiceTemplate();
$sut = new Customer('foo');
self::assertNull($sut->getInvoiceTemplate());
$sut->setInvoiceTemplate($tpl);
self::assertSame($tpl, $sut->getInvoiceTemplate());
}
public function testBudgets(): void
@@ -221,6 +242,9 @@ class CustomerTest extends AbstractEntityTestCase
public function testClone(): void
{
$sut = new Customer('mycustomer');
$this->assertCloneResetsId($sut);
$sut->setVatId('DE-0123456789');
$sut->setTimeBudget(123456);
$sut->setBudget(1234.56);

View File

@@ -19,6 +19,7 @@ class ExportTemplateTest extends AbstractEntityTestCase
{
$sut = new ExportTemplate();
self::assertNull($sut->getId());
self::assertTrue($sut->isNew());
self::assertNull($sut->getTitle());
self::assertEquals('csv', $sut->getRenderer());
self::assertNull($sut->getLanguage());
@@ -115,6 +116,7 @@ class ExportTemplateTest extends AbstractEntityTestCase
$p->setAccessible(true);
$p->setValue($sut, 13);
self::assertEquals(13, $sut->getId());
self::assertFalse($sut->isNew());
$sut2 = clone $sut;
self::assertNull($sut2->getId());

View File

@@ -34,6 +34,7 @@ class InvoiceTemplateTest extends TestCase
self::assertEquals('default', $sut->getNumberGenerator());
self::assertEquals('default', $sut->getRenderer());
self::assertEquals(30, $sut->getDueDays());
self::assertTrue($sut->isDecimalDuration()); // @phpstan-ignore method.deprecated
}
public function testSetNullForOptionalValues(): void

View File

@@ -29,10 +29,9 @@ use App\Repository\Query\InvoiceQuery;
use App\Tests\Invoice\DebugFormatter;
use App\Tests\Mocks\InvoiceModelFactoryFactory;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
#[CoversClass(Invoice::class)]
class InvoiceTest extends TestCase
class InvoiceTest extends AbstractEntityTestCase
{
public function testDefaultValues(): void
{
@@ -219,6 +218,8 @@ class InvoiceTest extends TestCase
public function testClone(): void
{
$sut = new Invoice();
$this->assertCloneResetsId($sut);
$sut->setComment('foo kajsdhgf aksjdhfg');
$sut->setFilename('1234567890');

View File

@@ -9,13 +9,12 @@
namespace App\Tests\Entity;
use App\Entity\CommentTableTypeTrait;
use App\Entity\Project;
use App\Entity\ProjectComment;
use PHPUnit\Framework\Attributes\CoversClass;
/**
* @covers \App\Entity\CommentTableTypeTrait
*/
#[CoversClass(CommentTableTypeTrait::class)]
#[CoversClass(ProjectComment::class)]
class ProjectCommentTest extends AbstractCommentEntityTestCase
{

View File

@@ -11,13 +11,12 @@ namespace App\Tests\Entity;
use App\Entity\Project;
use App\Entity\ProjectRate;
use App\Entity\Rate;
use App\Entity\User;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Entity\Rate
*/
#[CoversClass(Rate::class)]
#[CoversClass(ProjectRate::class)]
class ProjectRateTest extends TestCase
{