refactored repositories and DB queries (#5026)

* removed unused teams from export order
* added new paginator for query instead of querybuilder
* added field hydrate enums
* hide PARTIAL deprecation
* never log deprecations in production
* replaced InvoiceLoader with native Doctrine feature
* prevent excessive permission queries
* support loading customers of team
* improved findByIds
* internalized API
* fix null string deprecations
This commit is contained in:
Kevin Papst
2024-08-27 10:11:19 +02:00
committed by GitHub
parent 9e3d243b4b
commit 9d933f62c0
81 changed files with 1648 additions and 1436 deletions

View File

@@ -10,6 +10,7 @@
namespace App\Tests\Repository\Loader;
use App\Entity\Activity;
use App\Entity\Project;
use App\Repository\Loader\ActivityLoader;
/**
@@ -19,12 +20,15 @@ class ActivityLoaderTest extends AbstractLoaderTest
{
public function testLoadResults(): void
{
$em = $this->getEntityManagerMock(3);
$sut = new ActivityLoader($em);
$project = $this->createMock(Project::class);
$project->expects($this->once())->method('getId')->willReturn(13);
$entity = $this->createMock(Activity::class);
$entity->expects($this->once())->method('getId')->willReturn(1);
$entity->expects($this->exactly(3))->method('getProject')->willReturn($project);
$em = $this->getEntityManagerMock(3);
$sut = new ActivityLoader($em);
$sut->loadResults([$entity]);
}

View File

@@ -11,6 +11,7 @@ namespace App\Tests\Repository\Loader;
use App\Entity\Customer;
use App\Repository\Loader\CustomerLoader;
use App\Repository\Query\CustomerQuery;
/**
* @covers \App\Repository\Loader\CustomerLoader
@@ -19,13 +20,15 @@ class CustomerLoaderTest extends AbstractLoaderTest
{
public function testLoadResults(): void
{
$em = $this->getEntityManagerMock(2);
$em = $this->getEntityManagerMock(1);
$sut = new CustomerLoader($em);
$query = new CustomerQuery();
$query->loadTeams();
$sut = new CustomerLoader($em, $query);
$entity = $this->createMock(Customer::class);
$entity->expects($this->once())->method('getId')->willReturn(1);
$sut->loadResults([$entity, 4711]);
$sut->loadResults([$entity]);
}
}

View File

@@ -1,29 +0,0 @@
<?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(): void
{
$sut = new DefaultLoader();
$input = [];
$sut->loadResults($input);
self::assertEquals([], $input);
}
}

View File

@@ -1,31 +0,0 @@
<?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\Entity\Invoice;
use App\Repository\Loader\InvoiceLoader;
/**
* @covers \App\Repository\Loader\InvoiceLoader
*/
class InvoiceLoaderTest extends AbstractLoaderTest
{
public function testLoadResults(): void
{
$em = $this->getEntityManagerMock(3);
$sut = new InvoiceLoader($em);
$entity = $this->createMock(Invoice::class);
$entity->expects($this->once())->method('getId')->willReturn(1);
$sut->loadResults([$entity]);
}
}

View File

@@ -25,13 +25,13 @@ class ProjectLoaderTest extends AbstractLoaderTest
$entity = $this->createMock(Project::class);
$entity->expects($this->once())->method('getId')->willReturn(1);
$entity->expects($this->once())->method('getCustomer')->willReturn($customer);
$entity->expects($this->exactly(2))->method('getCustomer')->willReturn($customer);
$results = [$entity];
$em = $this->getEntityManagerMock(4, $results);
$em = $this->getEntityManagerMock(2, $results);
$sut = new ProjectLoader($em);
$sut->loadResults([$entity, 4711]);
$sut->loadResults([$entity]);
}
}

View File

@@ -1,30 +0,0 @@
<?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(): void
{
$em = $this->createMock(EntityManager::class);
$qb = new QueryBuilder($em);
$sut = new QueryBuilderPaginator($qb, 10);
self::assertEquals(10, $sut->getNbResults());
}
}

View File

@@ -18,7 +18,6 @@ use App\Form\Model\DateRange;
use App\Repository\Query\ActivityQuery;
use App\Repository\Query\BaseQuery;
use App\Repository\Query\DateRangeInterface;
use App\Repository\Query\ProjectQuery;
use App\Repository\Query\TimesheetQuery;
use App\Utils\SearchTerm;
use PHPUnit\Framework\TestCase;
@@ -251,8 +250,14 @@ class BaseQueryTest extends TestCase
$this->assertEquals([13, 27], $sut->getActivityIds());
}
protected function assertCustomer(ProjectQuery $sut): void
protected function assertCustomer(BaseQuery $sut): void
{
$this->assertTrue(method_exists($sut, 'getCustomers'));
$this->assertTrue(method_exists($sut, 'setCustomers'));
$this->assertTrue(method_exists($sut, 'hasCustomers'));
$this->assertTrue(method_exists($sut, 'addCustomer'));
$this->assertTrue(method_exists($sut, 'getCustomerIds'));
$this->assertEquals([], $sut->getCustomers());
$this->assertFalse($sut->hasCustomers());