added multi-select for customer, project and activity (#1557)

This commit is contained in:
Kevin Papst
2020-03-16 14:06:26 +01:00
committed by GitHub
parent 6eeb01ad48
commit 4b1cfa5840
74 changed files with 1262 additions and 754 deletions

View File

@@ -92,9 +92,10 @@ class ActivityControllerTest extends APIControllerBaseTest
yield ['/api/activities', ['globals' => 'true', 'visible' => '2'], [[false]]];
yield ['/api/activities', ['globals' => 'true', 'visible' => 1], [[false], [false]]];
yield ['/api/activities', ['project' => '1'], [[false], [false], [true, 1]]];
yield ['/api/activities', ['project' => '2', 'visible' => 1], [[false], [true, 2], [true, 2], [false]]];
yield ['/api/activities', ['project' => '2', 'visible' => '3'], [[false], [true, 2], [true, 2], [true, 2], [false], [false]]];
yield ['/api/activities', ['project' => '2', 'visible' => 2], [[true, 2], [false]]];
yield ['/api/activities', ['project' => '2', 'projects' => '2', 'visible' => 1], [[false], [true, 2], [true, 2], [false]]];
yield ['/api/activities', ['project' => '2', 'projects' => '2,2', 'visible' => '3'], [[false], [true, 2], [true, 2], [true, 2], [false], [false]]];
yield ['/api/activities', ['projects' => '2,2', 'visible' => 2], [[true, 2], [false]]];
yield ['/api/activities', ['projects' => '2', 'visible' => 2], [[true, 2], [false]]];
}
public function testGetCollectionWithQuery()

View File

@@ -104,8 +104,12 @@ class ProjectControllerTest extends APIControllerBaseTest
// customer is invisible, so nothing should be returned
yield ['/api/projects', ['customer' => '2', 'visible' => VisibilityInterface::SHOW_VISIBLE], []];
yield ['/api/projects', ['customer' => '2', 'visible' => VisibilityInterface::SHOW_BOTH], [[false, 2], [false, 2]]];
yield ['/api/projects', ['customer' => '2', 'customers' => '2', 'visible' => VisibilityInterface::SHOW_BOTH], [[false, 2], [false, 2]]];
yield ['/api/projects', ['customer' => '2', 'customers' => '2,2', 'visible' => VisibilityInterface::SHOW_BOTH], [[false, 2], [false, 2]]];
// customer is invisible, so nothing should be returned
yield ['/api/projects', ['customer' => '2', 'visible' => VisibilityInterface::SHOW_HIDDEN, 'start' => '2010-12-11T23:59:59', 'end' => '2030-12-11T23:59:59'], []];
yield ['/api/projects', ['customers' => '2', 'visible' => VisibilityInterface::SHOW_HIDDEN, 'start' => '2010-12-11T23:59:59', 'end' => '2030-12-11T23:59:59'], []];
yield ['/api/projects', ['customers' => '2,2', 'visible' => VisibilityInterface::SHOW_HIDDEN, 'start' => '2010-12-11T23:59:59', 'end' => '2030-12-11T23:59:59'], []];
}
public function testGetEntity()

View File

@@ -158,9 +158,40 @@ class TimesheetControllerTest extends APIControllerBaseTest
$end->setTime(23, 59, 59);
$query = [
'customer' => 1,
'project' => 1,
'activity' => 1,
'customers' => '1',
'projects' => '1',
'activities' => '1',
'page' => 2,
'size' => 5,
'order' => 'DESC',
'orderBy' => 'rate',
'active' => 0,
'begin' => $begin->format(self::DATE_FORMAT_HTML5),
'end' => $end->format(self::DATE_FORMAT_HTML5),
'exported' => 0,
];
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
$this->assertAccessIsGranted($client, '/api/timesheets', 'GET', $query);
$result = json_decode($client->getResponse()->getContent(), true);
$this->assertIsArray($result);
$this->assertNotEmpty($result);
$this->assertEquals(5, count($result));
$this->assertDefaultStructure($result[0], false);
}
public function testGetCollectionWithDeprecatedQuery()
{
$begin = new \DateTime('first day of this month');
$begin->setTime(0, 0, 0);
$end = new \DateTime('last day of this month');
$end->setTime(23, 59, 59);
$query = [
'customer' => '1',
'project' => '1',
'activity' => '1',
'page' => 2,
'size' => 5,
'order' => 'DESC',

View File

@@ -60,6 +60,8 @@ class ActivityControllerTest extends ControllerBaseTest
'searchTerm' => 'feature:timetracking foo',
'visibility' => 1,
'pageSize' => 50,
'customers' => [1],
'projects' => [1],
'page' => 1,
]);

View File

@@ -194,7 +194,7 @@ class InvoiceControllerTest extends ControllerBaseTest
'template' => 1,
'daterange' => $dateRange,
'customer' => 1,
'project' => 1,
'projects' => [1],
'markAsExported' => 1,
]);
@@ -260,7 +260,7 @@ class InvoiceControllerTest extends ControllerBaseTest
'template' => 1,
'daterange' => $dateRange,
'customer' => 1,
'project' => 1,
'projects' => [1],
'markAsExported' => 1,
]);

View File

@@ -67,6 +67,7 @@ class ProjectControllerTest extends ControllerBaseTest
$client->submit($form, [
'searchTerm' => 'feature:timetracking foo',
'visibility' => 1,
'customers' => [1],
'pageSize' => 50,
'page' => 1,
]);

View File

@@ -69,7 +69,9 @@ class TimesheetControllerTest extends ControllerBaseTest
'state' => 1,
'pageSize' => 25,
'daterange' => $dateRange,
'customer' => null,
'customers' => [1],
'projects' => [1],
'activities' => [1],
]);
$this->assertTrue($client->getResponse()->isSuccessful());
@@ -141,7 +143,7 @@ class TimesheetControllerTest extends ControllerBaseTest
'state' => 1,
'pageSize' => 25,
'daterange' => $dateRange,
'customer' => null,
'customers' => [],
]);
$this->assertTrue($client->getResponse()->isSuccessful());

View File

@@ -74,7 +74,7 @@ class TimesheetTeamControllerTest extends ControllerBaseTest
'users' => [$user->getId()],
'pageSize' => 25,
'daterange' => $dateRange,
'customer' => null,
'customers' => [],
]);
$this->assertTrue($client->getResponse()->isSuccessful());
@@ -151,7 +151,7 @@ class TimesheetTeamControllerTest extends ControllerBaseTest
'state' => 1,
'pageSize' => 25,
'daterange' => $dateRange,
'customer' => null,
'customers' => [],
]);
$this->assertTrue($client->getResponse()->isSuccessful());

View File

@@ -167,10 +167,10 @@ abstract class AbstractRendererTest extends KernelTestCase
$entries = [$timesheet, $timesheet2, $timesheet3, $timesheet4, $timesheet5];
$query = new TimesheetQuery();
$query->setActivity($activity);
$query->setActivities([$activity]);
$query->setBegin(new \DateTime());
$query->setEnd(new \DateTime());
$query->setProject($project);
$query->setProjects([$project]);
return $renderer->render($entries, $query);
}

View File

@@ -167,10 +167,10 @@ abstract class AbstractRendererTest extends KernelTestCase
$entries = [$timesheet, $timesheet2, $timesheet3, $timesheet4, $timesheet5];
$query = new TimesheetQuery();
$query->setActivity($activity);
$query->setActivities([$activity]);
$query->setBegin(new \DateTime());
$query->setEnd(new \DateTime());
$query->setProject($project);
$query->setProjects([$project]);
return $renderer->render($entries, $query);
}

View File

@@ -73,9 +73,9 @@ abstract class AbstractCalculatorTest extends TestCase
$query = new InvoiceQuery();
if ($addProject === true) {
$query->setProject($project);
$query->setProjects([$project]);
} elseif ($addActivity === true) {
$query->setActivity($activity);
$query->setActivities([$activity]);
}
$timesheet = new Timesheet();

View File

@@ -105,7 +105,7 @@ class DateInvoiceCalculatorTest extends AbstractCalculatorTest
$entries = [$timesheet, $timesheet2, $timesheet3, $timesheet4, $timesheet5];
$query = new InvoiceQuery();
$query->setProject($project1);
$query->setProjects([$project1]);
$model = new InvoiceModel(new DebugFormatter());
$model->setCustomer($customer);

View File

@@ -105,7 +105,7 @@ class ProjectInvoiceCalculatorTest extends AbstractCalculatorTest
$entries = [$timesheet, $timesheet2, $timesheet3, $timesheet4, $timesheet5];
$query = new InvoiceQuery();
$query->setProject($project1);
$query->setProjects([$project1]);
$model = new InvoiceModel(new DebugFormatter());
$model->setCustomer($customer);

View File

@@ -29,7 +29,7 @@ class InvoiceModelActivityHydratorTest extends TestCase
$result = $sut->hydrate($model);
$this->assertModelStructure($result);
$model->getQuery()->setActivity(null);
$model->getQuery()->setActivities([]);
$result = $sut->hydrate($model);
self::assertEmpty($result);
}
@@ -41,6 +41,10 @@ class InvoiceModelActivityHydratorTest extends TestCase
'activity.name',
'activity.comment',
'activity.meta.foo-activity',
'activity.1.id',
'activity.1.name',
'activity.1.comment',
'activity.1.meta.foo-activity',
];
$givenKeys = array_keys($model);

View File

@@ -29,7 +29,7 @@ class InvoiceModelProjectHydratorTest extends TestCase
$result = $sut->hydrate($model);
$this->assertModelStructure($result);
$model->getQuery()->setProject(null);
$model->getQuery()->setProjects([]);
$result = $sut->hydrate($model);
self::assertEmpty($result);
}
@@ -51,6 +51,20 @@ class InvoiceModelProjectHydratorTest extends TestCase
'project.budget_time',
'project.budget_time_decimal',
'project.budget_time_minutes',
'project.1.id',
'project.1.name',
'project.1.comment',
'project.1.order_date',
'project.1.order_number',
'project.1.meta.foo-project',
'project.1.start_date',
'project.1.end_date',
'project.1.budget_money',
'project.1.budget_money_nc',
'project.1.budget_money_plain',
'project.1.budget_time',
'project.1.budget_time_decimal',
'project.1.budget_time_minutes',
];
$givenKeys = array_keys($model);

View File

@@ -41,7 +41,7 @@ class CsvRendererTest extends TestCase
public function getTestModel()
{
yield [$this->getInvoiceModel(), '€1,947.99', 6, 5, 1, 2, 2];
yield [$this->getInvoiceModel(), '€1,947.99', 6, 4, 1, 2, 2];
yield [$this->getInvoiceModelOneEntry(), '$293.27', 2, 1, 0, 1, 0];
}

View File

@@ -58,7 +58,7 @@ class DebugRendererTest extends TestCase
$response = $sut->render($document, $model);
$data = json_decode($response->getContent(), true);
$this->assertModelStructure($data['model'], $hasProject);
$this->assertModelStructure($data['model'], count($model->getQuery()->getProjects()), count($model->getQuery()->getActivities()));
$rows = $data['entries'];
$this->assertEquals($expectedRows, count($rows));
@@ -74,7 +74,7 @@ class DebugRendererTest extends TestCase
// TODO check values or formats?
}
protected function assertModelStructure(array $model, $hasProject = true)
protected function assertModelStructure(array $model, int $projectCounter = 0, int $activityCounter = 0)
{
$keys = [
'invoice.due_date',
@@ -133,7 +133,16 @@ class DebugRendererTest extends TestCase
'testFromModelHydrator'
];
if ($hasProject) {
if ($activityCounter > 1) {
$keys = array_merge($keys, [
'activity.1.id',
'activity.1.name',
'activity.1.comment',
'activity.1.meta.foo-activity',
]);
}
if ($projectCounter > 0) {
$keys = array_merge($keys, [
'project.id',
'project.name',
@@ -150,6 +159,24 @@ class DebugRendererTest extends TestCase
'project.budget_time_decimal',
'project.budget_time_minutes',
]);
if ($projectCounter > 1) {
$keys = array_merge($keys, [
'project.1.id',
'project.1.name',
'project.1.comment',
'project.1.order_date',
'project.1.order_number',
'project.1.meta.foo-project',
'project.1.start_date',
'project.1.end_date',
'project.1.budget_money',
'project.1.budget_money_nc',
'project.1.budget_money_plain',
'project.1.budget_time',
'project.1.budget_time_decimal',
'project.1.budget_time_minutes',
]);
}
}
$givenKeys = array_keys($model);

View File

@@ -126,6 +126,16 @@ trait RendererTestTrait
$activity->setProject($project);
$activity->setMetaField((new ActivityMeta())->setName('foo-activity')->setValue('bar-activity')->setIsVisible(true));
$project2 = new Project();
$project2->setName('project 2 name');
$project2->setCustomer($customer);
$project2->setMetaField((new ProjectMeta())->setName('foo-project')->setValue('bar-project2')->setIsVisible(true));
$activity2 = new Activity();
$activity2->setName('activity 1 description');
$activity2->setProject($project2);
$activity2->setMetaField((new ActivityMeta())->setName('foo-activity')->setValue('bar-activity2')->setIsVisible(true));
$userMethods = ['getId', 'getPreferenceValue', 'getUsername'];
$user1 = $this->getMockBuilder(User::class)->onlyMethods($userMethods)->disableOriginalConstructor()->getMock();
$user1->method('getId')->willReturn(1);
@@ -165,8 +175,8 @@ trait RendererTestTrait
->setDuration(1800)
->setRate(111.11)
->setUser($user1)
->setActivity($activity)
->setProject($project)
->setActivity($activity2)
->setProject($project2)
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setMetaField((new TimesheetMeta())->setName('foo-timesheet')->setValue('bar-timesheet1')->setIsVisible(true))
@@ -198,10 +208,10 @@ trait RendererTestTrait
$entries = [$timesheet, $timesheet2, $timesheet3, $timesheet4, $timesheet5];
$query = new InvoiceQuery();
$query->setActivity($activity);
$query->setActivities([$activity, $activity2]);
$query->setBegin(new \DateTime());
$query->setEnd(new \DateTime());
$query->setProject($project);
$query->setProjects([$project, $project2]);
$model = new InvoiceModel($this->getFormatter());
$model->setCustomer($customer);
@@ -272,7 +282,7 @@ trait RendererTestTrait
$entries = [$timesheet];
$query = new InvoiceQuery();
$query->setActivity($activity);
$query->addActivity($activity);
$query->setBegin(new \DateTime());
$query->setEnd(new \DateTime());

View File

@@ -67,6 +67,6 @@ class TwigRendererTest extends KernelTestCase
$this->assertStringContainsString('<h2 class="page-header">
<span contenteditable="true">a very *long* test invoice / template title with [special] character</span>
</h2>', $content);
$this->assertEquals(5, substr_count($content, 'activity description'));
$this->assertEquals(4, substr_count($content, 'activity description'));
}
}

View File

@@ -10,13 +10,13 @@
namespace App\Tests\Repository\Query;
use App\Entity\Activity;
use App\Entity\Project;
use App\Repository\Query\ActivityFormTypeQuery;
/**
* @covers \App\Repository\Query\ActivityFormTypeQuery
* @covers \App\Repository\Query\BaseFormTypeQuery
*/
class ActivityFormTypeQueryTest extends BaseQueryTest
class ActivityFormTypeQueryTest extends BaseFormTypeQueryTest
{
public function testQuery()
{
@@ -24,15 +24,7 @@ class ActivityFormTypeQueryTest extends BaseQueryTest
self::assertTrue($sut->isGlobalsOnly());
$project = new Project();
self::assertNull($sut->getProject());
self::assertInstanceOf(ActivityFormTypeQuery::class, $sut->setProject($project));
self::assertSame($project, $sut->getProject());
$activity = new Activity();
self::assertNull($sut->getActivity());
self::assertInstanceOf(ActivityFormTypeQuery::class, $sut->setActivity($activity));
self::assertSame($activity, $sut->getActivity());
$this->assertBaseQuery($sut);
self::assertFalse($sut->isGlobalsOnly());

View File

@@ -9,13 +9,12 @@
namespace App\Tests\Repository\Query;
use App\Entity\Customer;
use App\Entity\Project;
use App\Repository\Query\ActivityQuery;
use App\Repository\Query\VisibilityInterface;
/**
* @covers \App\Repository\Query\ActivityQuery
* @covers \App\Repository\Query\BaseQuery
*/
class ActivityQueryTest extends BaseQueryTest
{
@@ -26,27 +25,8 @@ class ActivityQueryTest extends BaseQueryTest
$this->assertBaseQuery($sut, 'name');
$this->assertInstanceOf(VisibilityInterface::class, $sut);
$this->assertNull($sut->getCustomer());
$this->assertNull($sut->getProject());
$expected = new Customer();
$expected->setName('foo-bar');
$sut->setCustomer($expected);
$this->assertEquals($expected, $sut->getCustomer());
$expected = new Project();
$expected->setName('foo-bar');
$sut->setProject($expected);
$this->assertEquals($expected, $sut->getProject());
// make sure int is allowed as well
$sut->setProject(99);
$this->assertEquals(99, $sut->getProject());
$sut->setCustomer(99);
$this->assertEquals(99, $sut->getCustomer());
$this->assertCustomer($sut);
$this->assertProject($sut);
$this->assertResetByFormError(new ActivityQuery(), 'name');
}

View File

@@ -0,0 +1,159 @@
<?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\Query;
use App\Entity\Activity;
use App\Entity\Customer;
use App\Entity\Project;
use App\Entity\Team;
use App\Entity\User;
use App\Repository\Query\BaseFormTypeQuery;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Repository\Query\BaseQuery
*/
abstract class BaseFormTypeQueryTest extends TestCase
{
protected function assertBaseQuery(BaseFormTypeQuery $sut)
{
$this->assertActivity($sut);
$this->assertProject($sut);
$this->assertCustomer($sut);
$this->assertTeams($sut);
$this->assertUser($sut);
}
protected function assertUser(BaseFormTypeQuery $sut)
{
self::assertEmpty($sut->getUser());
$user = new User();
self::assertInstanceOf(BaseFormTypeQuery::class, $sut->setUser($user));
self::assertSame($user, $sut->getUser());
}
protected function assertTeams(BaseFormTypeQuery $sut)
{
self::assertEmpty($sut->getTeams());
self::assertInstanceOf(BaseFormTypeQuery::class, $sut->addTeam(new Team()));
self::assertEquals(1, count($sut->getTeams()));
$team = new Team();
self::assertInstanceOf(BaseFormTypeQuery::class, $sut->addTeam($team));
self::assertEquals(1, count($sut->getTeams()));
self::assertSame($team, $sut->getTeams()[0]);
}
protected function assertActivity(BaseFormTypeQuery $sut)
{
$this->assertNull($sut->getActivity());
$this->assertEquals([], $sut->getActivities());
$this->assertFalse($sut->hasActivities());
$expected = new Activity();
$expected->setName('foo-bar');
$sut->setActivity($expected);
$this->assertEquals($expected, $sut->getActivity());
$sut->setActivities([]);
$this->assertEquals([], $sut->getActivities());
$sut->addActivity($expected);
$this->assertEquals([$expected], $sut->getActivities());
$this->assertTrue($sut->hasActivities());
$expected2 = new Activity();
$expected2->setName('foo-bar2');
$sut->addActivity($expected2);
$this->assertEquals([$expected, $expected2], $sut->getActivities());
$sut->setActivity(null);
$this->assertNull($sut->getActivity());
$this->assertFalse($sut->hasActivities());
// make sure int is allowed as well
$sut->setActivities([99]);
$this->assertEquals(99, $sut->getActivity());
$this->assertEquals([99], $sut->getActivities());
}
protected function assertCustomer(BaseFormTypeQuery $sut)
{
$this->assertNull($sut->getCustomer());
$this->assertEquals([], $sut->getCustomers());
$this->assertFalse($sut->hasCustomers());
$expected = new Customer();
$expected->setName('foo-bar');
$sut->setCustomer($expected);
$this->assertEquals($expected, $sut->getCustomer());
$sut->setCustomers([]);
$this->assertEquals([], $sut->getCustomers());
$sut->addCustomer($expected);
$this->assertEquals([$expected], $sut->getCustomers());
$this->assertTrue($sut->hasCustomers());
$expected2 = new Customer();
$expected2->setName('foo-bar2');
$sut->addCustomer($expected2);
$this->assertEquals([$expected, $expected2], $sut->getCustomers());
$sut->setCustomer(null);
$this->assertNull($sut->getCustomer());
$this->assertFalse($sut->hasCustomers());
// make sure int is allowed as well
$sut->setCustomers([99]);
$this->assertEquals(99, $sut->getCustomer());
$this->assertEquals([99], $sut->getCustomers());
}
protected function assertProject(BaseFormTypeQuery $sut)
{
$this->assertNull($sut->getProject());
$this->assertEquals([], $sut->getProjects());
$this->assertFalse($sut->hasProjects());
$expected = new Project();
$expected->setName('foo-bar');
$sut->setProject($expected);
$this->assertEquals($expected, $sut->getProject());
$sut->setProjects([]);
$this->assertEquals([], $sut->getProjects());
$sut->addProject($expected);
$this->assertEquals([$expected], $sut->getProjects());
$this->assertTrue($sut->hasProjects());
$expected2 = new Project();
$expected2->setName('foo-bar2');
$sut->addProject($expected2);
$this->assertEquals([$expected, $expected2], $sut->getProjects());
$sut->setProject(null);
$this->assertNull($sut->getProject());
$this->assertFalse($sut->hasProjects());
// make sure int is allowed as well
$sut->setProjects([99]);
$this->assertEquals(99, $sut->getProject());
$this->assertEquals([99], $sut->getProjects());
}
}

View File

@@ -9,8 +9,14 @@
namespace App\Tests\Repository\Query;
use App\Entity\Activity;
use App\Entity\Customer;
use App\Entity\Project;
use App\Entity\Team;
use App\Repository\Query\ActivityQuery;
use App\Repository\Query\BaseQuery;
use App\Repository\Query\ProjectQuery;
use App\Repository\Query\TimesheetQuery;
use App\Utils\SearchTerm;
use PHPUnit\Framework\TestCase;
use Symfony\Component\EventDispatcher\EventDispatcher;
@@ -164,4 +170,109 @@ class BaseQueryTest extends TestCase
self::assertEquals('foo bar', $term->getOriginalSearch());
self::assertSame($term, $sut->getSearchTerm());
}
protected function assertActivity(TimesheetQuery $sut)
{
$this->assertNull($sut->getActivity());
$this->assertEquals([], $sut->getActivities());
$this->assertFalse($sut->hasActivities());
$expected = new Activity();
$expected->setName('foo-bar');
$sut->setActivity($expected);
$this->assertEquals($expected, $sut->getActivity());
$sut->setActivities([]);
$this->assertEquals([], $sut->getActivities());
$sut->addActivity($expected);
$this->assertEquals([$expected], $sut->getActivities());
$this->assertTrue($sut->hasActivities());
$expected2 = new Activity();
$expected2->setName('foo-bar2');
$sut->addActivity($expected2);
$this->assertEquals([$expected, $expected2], $sut->getActivities());
$sut->setActivity(null);
$this->assertNull($sut->getActivity());
$this->assertFalse($sut->hasActivities());
// make sure int is allowed as well
$sut->setActivities([99]);
$this->assertEquals(99, $sut->getActivity());
$this->assertEquals([99], $sut->getActivities());
}
protected function assertCustomer(ProjectQuery $sut)
{
$this->assertNull($sut->getCustomer());
$this->assertEquals([], $sut->getCustomers());
$this->assertFalse($sut->hasCustomers());
$expected = new Customer();
$expected->setName('foo-bar');
$sut->setCustomer($expected);
$this->assertEquals($expected, $sut->getCustomer());
$sut->setCustomers([]);
$this->assertEquals([], $sut->getCustomers());
$sut->addCustomer($expected);
$this->assertEquals([$expected], $sut->getCustomers());
$this->assertTrue($sut->hasCustomers());
$expected2 = new Customer();
$expected2->setName('foo-bar2');
$sut->addCustomer($expected2);
$this->assertEquals([$expected, $expected2], $sut->getCustomers());
$sut->setCustomer(null);
$this->assertNull($sut->getCustomer());
$this->assertFalse($sut->hasCustomers());
// make sure int is allowed as well
$sut->setCustomers([99]);
$this->assertEquals(99, $sut->getCustomer());
$this->assertEquals([99], $sut->getCustomers());
}
protected function assertProject(ActivityQuery $sut)
{
$this->assertNull($sut->getProject());
$this->assertEquals([], $sut->getProjects());
$this->assertFalse($sut->hasProjects());
$expected = new Project();
$expected->setName('foo-bar');
$sut->setProject($expected);
$this->assertEquals($expected, $sut->getProject());
$sut->setProjects([]);
$this->assertEquals([], $sut->getProjects());
$sut->addProject($expected);
$this->assertEquals([$expected], $sut->getProjects());
$this->assertTrue($sut->hasProjects());
$expected2 = new Project();
$expected2->setName('foo-bar2');
$sut->addProject($expected2);
$this->assertEquals([$expected, $expected2], $sut->getProjects());
$sut->setProject(null);
$this->assertNull($sut->getProject());
$this->assertFalse($sut->hasProjects());
// make sure int is allowed as well
$sut->setProjects([99]);
$this->assertEquals(99, $sut->getProject());
$this->assertEquals([99], $sut->getProjects());
}
}

View File

@@ -10,36 +10,23 @@
namespace App\Tests\Repository\Query;
use App\Entity\Customer;
use App\Entity\Team;
use App\Entity\User;
use App\Repository\Query\CustomerFormTypeQuery;
/**
* @covers \App\Repository\Query\CustomerFormTypeQuery
* @covers \App\Repository\Query\BaseFormTypeQuery
*/
class CustomerFormTypeQueryTest extends BaseQueryTest
class CustomerFormTypeQueryTest extends BaseFormTypeQueryTest
{
public function testQuery()
{
$sut = new CustomerFormTypeQuery();
self::assertEmpty($sut->getTeams());
self::assertInstanceOf(CustomerFormTypeQuery::class, $sut->addTeam(new Team()));
self::assertCount(1, $sut->getTeams());
$customer = new Customer();
self::assertNull($sut->getCustomer());
self::assertInstanceOf(CustomerFormTypeQuery::class, $sut->setCustomer($customer));
self::assertSame($customer, $sut->getCustomer());
$this->assertBaseQuery($sut);
$customer = new Customer();
self::assertNull($sut->getCustomerToIgnore());
self::assertInstanceOf(CustomerFormTypeQuery::class, $sut->setCustomerToIgnore($customer));
self::assertSame($customer, $sut->getCustomerToIgnore());
$user = new User();
self::assertNull($sut->getUser());
self::assertInstanceOf(CustomerFormTypeQuery::class, $sut->setUser($user));
self::assertSame($user, $sut->getUser());
}
}

View File

@@ -9,16 +9,13 @@
namespace App\Tests\Repository\Query;
use App\Entity\Activity;
use App\Entity\Customer;
use App\Entity\Project;
use App\Entity\User;
use App\Repository\Query\ExportQuery;
/**
* @covers \App\Repository\Query\ExportQuery
* @covers \App\Repository\Query\TimesheetQuery
*/
class ExportQueryTest extends BaseQueryTest
class ExportQueryTest extends TimesheetQueryTest
{
public function testQuery()
{
@@ -47,80 +44,6 @@ class ExportQueryTest extends BaseQueryTest
$this->assertTrue($sut->isMarkAsExported());
}
protected function assertUser(ExportQuery $sut)
{
$this->assertNull($sut->getUser());
$expected = new User();
$expected->setUsername('foo-bar');
$sut->setUser($expected);
$this->assertEquals($expected, $sut->getUser());
}
protected function assertCustomer(ExportQuery $sut)
{
$this->assertNull($sut->getCustomer());
$expected = new Customer();
$expected->setName('foo-bar');
$sut->setCustomer($expected);
$this->assertEquals($expected, $sut->getCustomer());
}
protected function assertProject(ExportQuery $sut)
{
$this->assertNull($sut->getProject());
$expected = new Project();
$expected->setName('foo-bar');
$sut->setProject($expected);
$this->assertEquals($expected, $sut->getProject());
}
protected function assertActivity(ExportQuery $sut)
{
$this->assertNull($sut->getActivity());
$expected = new Activity();
$expected->setName('foo-bar');
$sut->setActivity($expected);
$this->assertEquals($expected, $sut->getActivity());
}
protected function assertState(ExportQuery $sut)
{
$this->assertEquals(ExportQuery::STATE_ALL, $sut->getState());
$sut->setState(PHP_INT_MAX);
$this->assertEquals(ExportQuery::STATE_ALL, $sut->getState());
$sut->setState(ExportQuery::STATE_STOPPED);
$this->assertEquals(ExportQuery::STATE_STOPPED, $sut->getState());
$sut->setState(ExportQuery::STATE_RUNNING);
$this->assertEquals(ExportQuery::STATE_RUNNING, $sut->getState());
$sut->setState(ExportQuery::STATE_ALL);
$this->assertEquals(ExportQuery::STATE_ALL, $sut->getState());
}
protected function assertExported(ExportQuery $sut)
{
$this->assertEquals(ExportQuery::STATE_ALL, $sut->getExported());
$sut->setExported(PHP_INT_MAX);
$this->assertEquals(ExportQuery::STATE_ALL, $sut->getExported());
$sut->setExported(ExportQuery::STATE_EXPORTED);
$this->assertEquals(ExportQuery::STATE_EXPORTED, $sut->getExported());
$sut->setExported(ExportQuery::STATE_NOT_EXPORTED);
$this->assertEquals(ExportQuery::STATE_NOT_EXPORTED, $sut->getExported());
$sut->setExported(ExportQuery::STATE_ALL);
$this->assertEquals(ExportQuery::STATE_ALL, $sut->getExported());
}
protected function assertType(ExportQuery $sut)
{
$this->assertNull($sut->getType());

View File

@@ -9,16 +9,13 @@
namespace App\Tests\Repository\Query;
use App\Entity\Activity;
use App\Entity\Customer;
use App\Entity\Project;
use App\Entity\User;
use App\Repository\Query\InvoiceQuery;
/**
* @covers \App\Repository\Query\InvoiceQuery
* @covers \App\Repository\Query\TimesheetQuery
*/
class InvoiceQueryTest extends BaseQueryTest
class InvoiceQueryTest extends TimesheetQueryTest
{
public function testQuery()
{
@@ -45,78 +42,4 @@ class InvoiceQueryTest extends BaseQueryTest
$sut->setMarkAsExported(true);
$this->assertTrue($sut->isMarkAsExported());
}
protected function assertUser(InvoiceQuery $sut)
{
$this->assertNull($sut->getUser());
$expected = new User();
$expected->setUsername('foo-bar');
$sut->setUser($expected);
$this->assertEquals($expected, $sut->getUser());
}
protected function assertCustomer(InvoiceQuery $sut)
{
$this->assertNull($sut->getCustomer());
$expected = new Customer();
$expected->setName('foo-bar');
$sut->setCustomer($expected);
$this->assertEquals($expected, $sut->getCustomer());
}
protected function assertProject(InvoiceQuery $sut)
{
$this->assertNull($sut->getProject());
$expected = new Project();
$expected->setName('foo-bar');
$sut->setProject($expected);
$this->assertEquals($expected, $sut->getProject());
}
protected function assertActivity(InvoiceQuery $sut)
{
$this->assertNull($sut->getActivity());
$expected = new Activity();
$expected->setName('foo-bar');
$sut->setActivity($expected);
$this->assertEquals($expected, $sut->getActivity());
}
protected function assertState(InvoiceQuery $sut)
{
$this->assertEquals(InvoiceQuery::STATE_ALL, $sut->getState());
$sut->setState(PHP_INT_MAX);
$this->assertEquals(InvoiceQuery::STATE_ALL, $sut->getState());
$sut->setState(InvoiceQuery::STATE_STOPPED);
$this->assertEquals(InvoiceQuery::STATE_STOPPED, $sut->getState());
$sut->setState(InvoiceQuery::STATE_RUNNING);
$this->assertEquals(InvoiceQuery::STATE_RUNNING, $sut->getState());
$sut->setState(InvoiceQuery::STATE_ALL);
$this->assertEquals(InvoiceQuery::STATE_ALL, $sut->getState());
}
protected function assertExported(InvoiceQuery $sut)
{
$this->assertEquals(InvoiceQuery::STATE_ALL, $sut->getExported());
$sut->setExported(PHP_INT_MAX);
$this->assertEquals(InvoiceQuery::STATE_ALL, $sut->getExported());
$sut->setExported(InvoiceQuery::STATE_EXPORTED);
$this->assertEquals(InvoiceQuery::STATE_EXPORTED, $sut->getExported());
$sut->setExported(InvoiceQuery::STATE_NOT_EXPORTED);
$this->assertEquals(InvoiceQuery::STATE_NOT_EXPORTED, $sut->getExported());
$sut->setExported(InvoiceQuery::STATE_ALL);
$this->assertEquals(InvoiceQuery::STATE_ALL, $sut->getExported());
}
}

View File

@@ -9,43 +9,24 @@
namespace App\Tests\Repository\Query;
use App\Entity\Customer;
use App\Entity\Project;
use App\Entity\Team;
use App\Entity\User;
use App\Repository\Query\ProjectFormTypeQuery;
/**
* @covers \App\Repository\Query\ProjectFormTypeQuery
* @covers \App\Repository\Query\BaseFormTypeQuery
*/
class ProjectFormTypeQueryTest extends BaseQueryTest
class ProjectFormTypeQueryTest extends BaseFormTypeQueryTest
{
public function testQuery()
{
$sut = new ProjectFormTypeQuery();
self::assertEmpty($sut->getTeams());
self::assertInstanceOf(ProjectFormTypeQuery::class, $sut->addTeam(new Team()));
self::assertCount(1, $sut->getTeams());
$project = new Project();
self::assertNull($sut->getProject());
self::assertInstanceOf(ProjectFormTypeQuery::class, $sut->setProject($project));
self::assertSame($project, $sut->getProject());
$this->assertBaseQuery($sut);
$project = new Project();
self::assertNull($sut->getProjectToIgnore());
self::assertInstanceOf(ProjectFormTypeQuery::class, $sut->setProjectToIgnore($project));
self::assertSame($project, $sut->getProjectToIgnore());
$customer = new Customer();
self::assertNull($sut->getCustomer());
self::assertInstanceOf(ProjectFormTypeQuery::class, $sut->setCustomer($customer));
self::assertSame($customer, $sut->getCustomer());
$user = new User();
self::assertNull($sut->getUser());
self::assertInstanceOf(ProjectFormTypeQuery::class, $sut->setUser($user));
self::assertSame($user, $sut->getUser());
}
}

View File

@@ -9,12 +9,12 @@
namespace App\Tests\Repository\Query;
use App\Entity\Customer;
use App\Repository\Query\ProjectQuery;
use App\Repository\Query\VisibilityInterface;
/**
* @covers \App\Repository\Query\ProjectQuery
* @covers \App\Repository\Query\BaseQuery
*/
class ProjectQueryTest extends BaseQueryTest
{
@@ -25,17 +25,7 @@ class ProjectQueryTest extends BaseQueryTest
$this->assertBaseQuery($sut, 'name');
$this->assertInstanceOf(VisibilityInterface::class, $sut);
$this->assertNull($sut->getCustomer());
$expected = new Customer();
$expected->setName('foo-bar');
$sut->setCustomer($expected);
$this->assertEquals($expected, $sut->getCustomer());
// make sure int is allowed as well
$sut->setCustomer(99);
$this->assertEquals(99, $sut->getCustomer());
$this->assertCustomer($sut);
$this->assertResetByFormError(new ProjectQuery(), 'name');

View File

@@ -9,21 +9,18 @@
namespace App\Tests\Repository\Query;
use App\Entity\User;
use App\Repository\Query\TagFormTypeQuery;
/**
* @covers \App\Repository\Query\TagFormTypeQuery
* @covers \App\Repository\Query\BaseFormTypeQuery
*/
class TagFormTypeQueryTest extends BaseQueryTest
class TagFormTypeQueryTest extends BaseFormTypeQueryTest
{
public function testQuery()
{
$sut = new TagFormTypeQuery();
$user = new User();
self::assertNull($sut->getUser());
self::assertInstanceOf(TagFormTypeQuery::class, $sut->setUser($user));
self::assertSame($user, $sut->getUser());
$this->assertBaseQuery($sut);
}
}

View File

@@ -9,6 +9,7 @@
namespace App\Tests\Repository\Query;
use App\Entity\User;
use App\Repository\Query\TeamQuery;
/**
@@ -23,6 +24,32 @@ class TeamQueryTest extends BaseQueryTest
$this->assertBaseQuery($sut, 'name');
$this->assertInstanceOf(TeamQuery::class, $sut);
$this->assertUsers($sut);
$this->assertResetByFormError(new TeamQuery(), 'name');
}
protected function assertUsers(TeamQuery $sut)
{
$this->assertEmpty($sut->getUsers());
$user = $this->createMock(User::class);
$user->method('getId')->willReturn(1);
$sut->addUser($user);
$user = $this->createMock(User::class);
$user->method('getId')->willReturn(1);
$sut->addUser($user);
$user = $this->createMock(User::class);
$user->method('getId')->willReturn(13);
$sut->addUser($user);
$user = $this->createMock(User::class);
$user->method('getId')->willReturn(27);
$sut->addUser($user);
$sut->removeUser($user);
$this->assertCount(2, $sut->getUsers());
}
}

View File

@@ -9,9 +9,6 @@
namespace App\Tests\Repository\Query;
use App\Entity\Activity;
use App\Entity\Customer;
use App\Entity\Project;
use App\Entity\User;
use App\Repository\Query\TimesheetQuery;
@@ -76,36 +73,6 @@ class TimesheetQueryTest extends BaseQueryTest
$this->assertCount(2, $sut->getUsers());
}
protected function assertCustomer(TimesheetQuery $sut)
{
$this->assertNull($sut->getCustomer());
$expected = new Customer();
$expected->setName('foo-bar');
$sut->setCustomer($expected);
$this->assertEquals($expected, $sut->getCustomer());
}
protected function assertProject(TimesheetQuery $sut)
{
$this->assertNull($sut->getProject());
$expected = new Project();
$expected->setName('foo-bar');
$sut->setProject($expected);
$this->assertEquals($expected, $sut->getProject());
}
protected function assertActivity(TimesheetQuery $sut)
{
$this->assertNull($sut->getActivity());
$expected = new Activity();
$expected->setName('foo-bar');
$sut->setActivity($expected);
$this->assertEquals($expected, $sut->getActivity());
}
protected function assertState(TimesheetQuery $sut)
{
$this->assertEquals(TimesheetQuery::STATE_ALL, $sut->getState());

View File

@@ -9,26 +9,18 @@
namespace App\Tests\Repository\Query;
use App\Entity\Team;
use App\Entity\User;
use App\Repository\Query\UserFormTypeQuery;
/**
* @covers \App\Repository\Query\UserFormTypeQuery
* @covers \App\Repository\Query\BaseFormTypeQuery
*/
class UserFormTypeQueryTest extends BaseQueryTest
class UserFormTypeQueryTest extends BaseFormTypeQueryTest
{
public function testQuery()
{
$sut = new UserFormTypeQuery();
self::assertEmpty($sut->getTeams());
self::assertInstanceOf(UserFormTypeQuery::class, $sut->addTeam(new Team()));
self::assertCount(1, $sut->getTeams());
$user = new User();
self::assertNull($sut->getUser());
self::assertInstanceOf(UserFormTypeQuery::class, $sut->setUser($user));
self::assertSame($user, $sut->getUser());
$this->assertBaseQuery($sut);
}
}