added user-specific rates (#1455)
This commit is contained in:
@@ -285,7 +285,7 @@ class ActivityControllerTest extends APIControllerBaseTest
|
||||
protected function assertStructure(array $result, $full = true)
|
||||
{
|
||||
$expectedKeys = [
|
||||
'id', 'name', 'visible', 'project', 'hourlyRate', 'fixedRate', 'color', 'metaFields', 'parentTitle'
|
||||
'id', 'name', 'visible', 'project', 'color', 'metaFields', 'parentTitle'
|
||||
];
|
||||
|
||||
if ($full) {
|
||||
|
||||
@@ -230,7 +230,7 @@ class CustomerControllerTest extends APIControllerBaseTest
|
||||
protected function assertStructure(array $result, $full = true)
|
||||
{
|
||||
$expectedKeys = [
|
||||
'id', 'name', 'visible', 'hourlyRate', 'fixedRate', 'color', 'metaFields', 'teams'
|
||||
'id', 'name', 'visible', 'color', 'metaFields', 'teams'
|
||||
];
|
||||
|
||||
if ($full) {
|
||||
|
||||
@@ -152,7 +152,7 @@ class ProjectControllerTest extends APIControllerBaseTest
|
||||
$data = [
|
||||
'name' => 'foo',
|
||||
'customer' => 1,
|
||||
'visible' => true
|
||||
'visible' => true,
|
||||
];
|
||||
$this->request($client, '/api/projects', 'POST', [], json_encode($data));
|
||||
$response = $client->getResponse();
|
||||
@@ -283,7 +283,7 @@ class ProjectControllerTest extends APIControllerBaseTest
|
||||
protected function assertStructure(array $result, $full = true)
|
||||
{
|
||||
$expectedKeys = [
|
||||
'id', 'name', 'visible', 'customer', 'hourlyRate', 'fixedRate', 'color', 'metaFields', 'parentTitle', 'start', 'end', 'teams'
|
||||
'id', 'name', 'visible', 'customer', 'color', 'metaFields', 'parentTitle', 'start', 'end', 'teams'
|
||||
];
|
||||
|
||||
if ($full) {
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace App\Tests\Controller;
|
||||
|
||||
use App\Entity\Activity;
|
||||
use App\Entity\ActivityMeta;
|
||||
use App\Entity\Project;
|
||||
use App\Entity\Timesheet;
|
||||
use App\Entity\User;
|
||||
use App\Tests\DataFixtures\ActivityFixtures;
|
||||
@@ -67,7 +68,7 @@ class ActivityControllerTest extends ControllerBaseTest
|
||||
$this->assertDataTableRowCount($client, 'datatable_activity_admin', 5);
|
||||
}
|
||||
|
||||
public function testBudgetAction()
|
||||
public function testDetailsAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
/** @var EntityManager $em */
|
||||
@@ -79,9 +80,70 @@ class ActivityControllerTest extends ControllerBaseTest
|
||||
$fixture->setUser($this->getUserByRole($em, User::ROLE_ADMIN));
|
||||
$this->importFixture($client, $fixture);
|
||||
|
||||
$project = $em->getRepository(Project::class)->find(1);
|
||||
$fixture = new ActivityFixtures();
|
||||
$fixture->setAmount(6); // to trigger a second page
|
||||
$fixture->setProjects([$project]);
|
||||
$this->importFixture($client, $fixture);
|
||||
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
$this->assertAccessIsGranted($client, '/admin/activity/1/budget');
|
||||
$this->assertAccessIsGranted($client, '/admin/activity/1/details');
|
||||
self::assertHasProgressbar($client);
|
||||
|
||||
$node = $client->getCrawler()->filter('div.box#activity_details_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#budget_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#activity_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
}
|
||||
|
||||
public function testAddRateAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
$this->assertAccessIsGranted($client, '/admin/activity/1/rate');
|
||||
$form = $client->getCrawler()->filter('form[name=activity_rate_form]')->form();
|
||||
$client->submit($form, [
|
||||
'activity_rate_form' => [
|
||||
'user' => null,
|
||||
'rate' => 123.45,
|
||||
]
|
||||
]);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/activity/1/details'));
|
||||
$client->followRedirect();
|
||||
$node = $client->getCrawler()->filter('div.box#activity_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#activity_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(1, $node->count());
|
||||
self::assertStringContainsString('123.45', $node->text(null, true));
|
||||
}
|
||||
|
||||
public function testDeleteRateAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
$this->assertAccessIsGranted($client, '/admin/activity/1/rate');
|
||||
$form = $client->getCrawler()->filter('form[name=activity_rate_form]')->form();
|
||||
$client->submit($form, [
|
||||
'activity_rate_form' => [
|
||||
'user' => null,
|
||||
'rate' => 123.45,
|
||||
]
|
||||
]);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/activity/1/details'));
|
||||
$client->followRedirect();
|
||||
$node = $client->getCrawler()->filter('div.box#activity_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#activity_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(1, $node->count());
|
||||
self::assertStringContainsString('123.45', $node->text(null, true));
|
||||
|
||||
$node = $client->getCrawler()->filter('div.box#activity_rates_box table.dataTable tbody tr td.actions a');
|
||||
self::assertEquals(1, $node->count());
|
||||
$url = $node->attr('href');
|
||||
$client->request('GET', $url);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/activity/1/details'));
|
||||
$node = $client->getCrawler()->filter('div.box#activity_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(0, $node->count());
|
||||
}
|
||||
|
||||
public function testCreateAction()
|
||||
|
||||
@@ -87,6 +87,56 @@ class CustomerControllerTest extends ControllerBaseTest
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#team_listing_box a.btn-box-tool');
|
||||
self::assertEquals(2, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#customer_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
}
|
||||
|
||||
public function testAddRateAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
$this->assertAccessIsGranted($client, '/admin/customer/1/rate');
|
||||
$form = $client->getCrawler()->filter('form[name=customer_rate_form]')->form();
|
||||
$client->submit($form, [
|
||||
'customer_rate_form' => [
|
||||
'user' => null,
|
||||
'rate' => 123.45,
|
||||
]
|
||||
]);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/customer/1/details'));
|
||||
$client->followRedirect();
|
||||
$node = $client->getCrawler()->filter('div.box#customer_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#customer_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(1, $node->count());
|
||||
self::assertStringContainsString('123.45', $node->text(null, true));
|
||||
}
|
||||
|
||||
public function testDeleteRateAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
$this->assertAccessIsGranted($client, '/admin/customer/1/rate');
|
||||
$form = $client->getCrawler()->filter('form[name=customer_rate_form]')->form();
|
||||
$client->submit($form, [
|
||||
'customer_rate_form' => [
|
||||
'user' => null,
|
||||
'rate' => 123.45,
|
||||
]
|
||||
]);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/customer/1/details'));
|
||||
$client->followRedirect();
|
||||
$node = $client->getCrawler()->filter('div.box#customer_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#customer_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(1, $node->count());
|
||||
self::assertStringContainsString('123.45', $node->text(null, true));
|
||||
|
||||
$node = $client->getCrawler()->filter('div.box#customer_rates_box table.dataTable tbody tr td.actions a');
|
||||
self::assertEquals(1, $node->count());
|
||||
$url = $node->attr('href');
|
||||
$client->request('GET', $url);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/customer/1/details'));
|
||||
$node = $client->getCrawler()->filter('div.box#customer_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(0, $node->count());
|
||||
}
|
||||
|
||||
public function testAddCommentAction()
|
||||
|
||||
@@ -106,6 +106,56 @@ class ProjectControllerTest extends ControllerBaseTest
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#team_listing_box a.btn-box-tool');
|
||||
self::assertEquals(2, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#project_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
}
|
||||
|
||||
public function testAddRateAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
$this->assertAccessIsGranted($client, '/admin/project/1/rate');
|
||||
$form = $client->getCrawler()->filter('form[name=project_rate_form]')->form();
|
||||
$client->submit($form, [
|
||||
'project_rate_form' => [
|
||||
'user' => null,
|
||||
'rate' => 123.45,
|
||||
]
|
||||
]);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/project/1/details'));
|
||||
$client->followRedirect();
|
||||
$node = $client->getCrawler()->filter('div.box#project_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#project_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(1, $node->count());
|
||||
self::assertStringContainsString('123.45', $node->text(null, true));
|
||||
}
|
||||
|
||||
public function testDeleteRateAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
$this->assertAccessIsGranted($client, '/admin/project/1/rate');
|
||||
$form = $client->getCrawler()->filter('form[name=project_rate_form]')->form();
|
||||
$client->submit($form, [
|
||||
'project_rate_form' => [
|
||||
'user' => null,
|
||||
'rate' => 123.45,
|
||||
]
|
||||
]);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/project/1/details'));
|
||||
$client->followRedirect();
|
||||
$node = $client->getCrawler()->filter('div.box#project_rates_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#project_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(1, $node->count());
|
||||
self::assertStringContainsString('123.45', $node->text(null, true));
|
||||
|
||||
$node = $client->getCrawler()->filter('div.box#project_rates_box table.dataTable tbody tr td.actions a');
|
||||
self::assertEquals(1, $node->count());
|
||||
$url = $node->attr('href');
|
||||
$client->request('GET', $url);
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/project/1/details'));
|
||||
$node = $client->getCrawler()->filter('div.box#project_rates_box table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals(0, $node->count());
|
||||
}
|
||||
|
||||
public function testAddCommentAction()
|
||||
|
||||
@@ -33,7 +33,7 @@ class SystemConfigurationControllerTest extends ControllerBaseTest
|
||||
$result = $client->getCrawler()->filter('section.content div.box.box-primary');
|
||||
$this->assertEquals(count($expectedForms), count($result));
|
||||
|
||||
$result = $client->getCrawler()->filter('section.content form div.box.box-primary');
|
||||
$result = $client->getCrawler()->filter('section.content div.box.box-primary form');
|
||||
$this->assertEquals(count($expectedForms), count($result));
|
||||
|
||||
foreach ($expectedForms as $formConfig) {
|
||||
|
||||
55
tests/Entity/ActivityRateTest.php
Normal file
55
tests/Entity/ActivityRateTest.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?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\ActivityRate;
|
||||
use App\Entity\User;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @covers \App\Entity\ActivityRate
|
||||
* @covers \App\Entity\Rate
|
||||
*/
|
||||
class ActivityRateTest extends TestCase
|
||||
{
|
||||
public function testDefaultValues()
|
||||
{
|
||||
$sut = new ActivityRate();
|
||||
self::assertNull($sut->getId());
|
||||
self::assertEquals(0.00, $sut->getRate());
|
||||
self::assertNull($sut->getActivity());
|
||||
self::assertNull($sut->getUser());
|
||||
self::assertEquals(5, $sut->getScore());
|
||||
self::assertFalse($sut->isFixed());
|
||||
}
|
||||
|
||||
public function testSetterAndGetter()
|
||||
{
|
||||
$sut = new ActivityRate();
|
||||
|
||||
self::assertInstanceOf(ActivityRate::class, $sut->setIsFixed(true));
|
||||
self::assertTrue($sut->isFixed());
|
||||
|
||||
self::assertInstanceOf(ActivityRate::class, $sut->setRate(12.34));
|
||||
self::assertEquals(12.34, $sut->getRate());
|
||||
|
||||
$user = new User();
|
||||
$user->setAlias('foo');
|
||||
$user->setUsername('bar');
|
||||
self::assertInstanceOf(ActivityRate::class, $sut->setUser($user));
|
||||
self::assertSame($user, $sut->getUser());
|
||||
|
||||
$entity = new Activity();
|
||||
$entity->setName('foo');
|
||||
self::assertInstanceOf(ActivityRate::class, $sut->setActivity($entity));
|
||||
self::assertSame($entity, $sut->getActivity());
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ namespace App\Tests\Entity;
|
||||
|
||||
use App\Entity\Activity;
|
||||
use App\Entity\ActivityMeta;
|
||||
use App\Entity\Project;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
@@ -27,8 +28,7 @@ class ActivityTest extends TestCase
|
||||
$this->assertNull($sut->getName());
|
||||
$this->assertNull($sut->getComment());
|
||||
$this->assertTrue($sut->getVisible());
|
||||
$this->assertNull($sut->getFixedRate());
|
||||
$this->assertNull($sut->getHourlyRate());
|
||||
$this->assertTrue($sut->isGlobal());
|
||||
$this->assertNull($sut->getColor());
|
||||
$this->assertEquals(0.0, $sut->getBudget());
|
||||
$this->assertEquals(0, $sut->getTimeBudget());
|
||||
@@ -53,17 +53,15 @@ class ActivityTest extends TestCase
|
||||
$this->assertInstanceOf(Activity::class, $sut->setColor('#fffccc'));
|
||||
$this->assertEquals('#fffccc', $sut->getColor());
|
||||
|
||||
$this->assertInstanceOf(Activity::class, $sut->setFixedRate(13.47));
|
||||
$this->assertEquals(13.47, $sut->getFixedRate());
|
||||
|
||||
$this->assertInstanceOf(Activity::class, $sut->setHourlyRate(99));
|
||||
$this->assertEquals(99, $sut->getHourlyRate());
|
||||
|
||||
$this->assertInstanceOf(Activity::class, $sut->setBudget(12345.67));
|
||||
$this->assertEquals(12345.67, $sut->getBudget());
|
||||
|
||||
$this->assertInstanceOf(Activity::class, $sut->setTimeBudget(937321));
|
||||
$this->assertEquals(937321, $sut->getTimeBudget());
|
||||
|
||||
$this->assertTrue($sut->isGlobal());
|
||||
$this->assertInstanceOf(Activity::class, $sut->setProject(new Project()));
|
||||
$this->assertFalse($sut->isGlobal());
|
||||
}
|
||||
|
||||
public function testMetaFields()
|
||||
|
||||
55
tests/Entity/CustomerRateTest.php
Normal file
55
tests/Entity/CustomerRateTest.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?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\CustomerRate;
|
||||
use App\Entity\User;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @covers \App\Entity\CustomerRate
|
||||
* @covers \App\Entity\Rate
|
||||
*/
|
||||
class CustomerRateTest extends TestCase
|
||||
{
|
||||
public function testDefaultValues()
|
||||
{
|
||||
$sut = new CustomerRate();
|
||||
self::assertNull($sut->getId());
|
||||
self::assertEquals(0.00, $sut->getRate());
|
||||
self::assertNull($sut->getCustomer());
|
||||
self::assertNull($sut->getUser());
|
||||
self::assertEquals(1, $sut->getScore());
|
||||
self::assertFalse($sut->isFixed());
|
||||
}
|
||||
|
||||
public function testSetterAndGetter()
|
||||
{
|
||||
$sut = new CustomerRate();
|
||||
|
||||
self::assertInstanceOf(CustomerRate::class, $sut->setIsFixed(true));
|
||||
self::assertTrue($sut->isFixed());
|
||||
|
||||
self::assertInstanceOf(CustomerRate::class, $sut->setRate(12.34));
|
||||
self::assertEquals(12.34, $sut->getRate());
|
||||
|
||||
$user = new User();
|
||||
$user->setAlias('foo');
|
||||
$user->setUsername('bar');
|
||||
self::assertInstanceOf(CustomerRate::class, $sut->setUser($user));
|
||||
self::assertSame($user, $sut->getUser());
|
||||
|
||||
$entity = new Customer();
|
||||
$entity->setName('foo');
|
||||
self::assertInstanceOf(CustomerRate::class, $sut->setCustomer($entity));
|
||||
self::assertSame($entity, $sut->getCustomer());
|
||||
}
|
||||
}
|
||||
@@ -43,8 +43,6 @@ class CustomerTest extends TestCase
|
||||
self::assertNull($sut->getHomepage());
|
||||
self::assertNull($sut->getTimezone());
|
||||
|
||||
self::assertNull($sut->getFixedRate());
|
||||
self::assertNull($sut->getHourlyRate());
|
||||
self::assertNull($sut->getColor());
|
||||
self::assertEquals(0.0, $sut->getBudget());
|
||||
self::assertEquals(0, $sut->getTimeBudget());
|
||||
@@ -92,12 +90,6 @@ class CustomerTest extends TestCase
|
||||
self::assertInstanceOf(Customer::class, $sut->setHomepage('https://www.example.com'));
|
||||
self::assertEquals('https://www.example.com', $sut->getHomepage());
|
||||
|
||||
self::assertInstanceOf(Customer::class, $sut->setFixedRate(13.47));
|
||||
self::assertEquals(13.47, $sut->getFixedRate());
|
||||
|
||||
self::assertInstanceOf(Customer::class, $sut->setHourlyRate(99));
|
||||
self::assertEquals(99, $sut->getHourlyRate());
|
||||
|
||||
self::assertInstanceOf(Customer::class, $sut->setBudget(12345.67));
|
||||
self::assertEquals(12345.67, $sut->getBudget());
|
||||
|
||||
|
||||
55
tests/Entity/ProjectRateTest.php
Normal file
55
tests/Entity/ProjectRateTest.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?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\Project;
|
||||
use App\Entity\ProjectRate;
|
||||
use App\Entity\User;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @covers \App\Entity\ProjectRate
|
||||
* @covers \App\Entity\Rate
|
||||
*/
|
||||
class ProjectRateTest extends TestCase
|
||||
{
|
||||
public function testDefaultValues()
|
||||
{
|
||||
$sut = new ProjectRate();
|
||||
self::assertNull($sut->getId());
|
||||
self::assertEquals(0.00, $sut->getRate());
|
||||
self::assertNull($sut->getProject());
|
||||
self::assertNull($sut->getUser());
|
||||
self::assertEquals(3, $sut->getScore());
|
||||
self::assertFalse($sut->isFixed());
|
||||
}
|
||||
|
||||
public function testSetterAndGetter()
|
||||
{
|
||||
$sut = new ProjectRate();
|
||||
|
||||
self::assertInstanceOf(ProjectRate::class, $sut->setIsFixed(true));
|
||||
self::assertTrue($sut->isFixed());
|
||||
|
||||
self::assertInstanceOf(ProjectRate::class, $sut->setRate(12.34));
|
||||
self::assertEquals(12.34, $sut->getRate());
|
||||
|
||||
$user = new User();
|
||||
$user->setAlias('foo');
|
||||
$user->setUsername('bar');
|
||||
self::assertInstanceOf(ProjectRate::class, $sut->setUser($user));
|
||||
self::assertSame($user, $sut->getUser());
|
||||
|
||||
$entity = new Project();
|
||||
$entity->setName('foo');
|
||||
self::assertInstanceOf(ProjectRate::class, $sut->setProject($entity));
|
||||
self::assertSame($entity, $sut->getProject());
|
||||
}
|
||||
}
|
||||
@@ -34,8 +34,6 @@ class ProjectTest extends TestCase
|
||||
self::assertNull($sut->getComment());
|
||||
self::assertTrue($sut->getVisible());
|
||||
self::assertTrue($sut->isVisible());
|
||||
self::assertNull($sut->getFixedRate());
|
||||
self::assertNull($sut->getHourlyRate());
|
||||
self::assertNull($sut->getColor());
|
||||
self::assertEquals(0.0, $sut->getBudget());
|
||||
self::assertEquals(0, $sut->getTimeBudget());
|
||||
@@ -85,12 +83,6 @@ class ProjectTest extends TestCase
|
||||
self::assertInstanceOf(Project::class, $sut->setVisible(false));
|
||||
self::assertFalse($sut->getVisible());
|
||||
|
||||
self::assertInstanceOf(Project::class, $sut->setFixedRate(13.47));
|
||||
self::assertEquals(13.47, $sut->getFixedRate());
|
||||
|
||||
self::assertInstanceOf(Project::class, $sut->setHourlyRate(99));
|
||||
self::assertEquals(99, $sut->getHourlyRate());
|
||||
|
||||
self::assertInstanceOf(Project::class, $sut->setBudget(12345.67));
|
||||
self::assertEquals(12345.67, $sut->getBudget());
|
||||
|
||||
|
||||
@@ -40,12 +40,6 @@ class InvoiceModelActivityHydratorTest extends TestCase
|
||||
'activity.id',
|
||||
'activity.name',
|
||||
'activity.comment',
|
||||
'activity.fixed_rate',
|
||||
'activity.fixed_rate_nc',
|
||||
'activity.fixed_rate_plain',
|
||||
'activity.hourly_rate',
|
||||
'activity.hourly_rate_nc',
|
||||
'activity.hourly_rate_plain',
|
||||
'activity.meta.foo-activity',
|
||||
];
|
||||
|
||||
|
||||
@@ -47,12 +47,6 @@ class InvoiceModelCustomerHydratorTest extends TestCase
|
||||
'customer.number',
|
||||
'customer.homepage',
|
||||
'customer.comment',
|
||||
'customer.fixed_rate',
|
||||
'customer.fixed_rate_nc',
|
||||
'customer.fixed_rate_plain',
|
||||
'customer.hourly_rate',
|
||||
'customer.hourly_rate_nc',
|
||||
'customer.hourly_rate_plain',
|
||||
'customer.meta.foo-customer',
|
||||
];
|
||||
|
||||
|
||||
@@ -42,12 +42,6 @@ class InvoiceModelProjectHydratorTest extends TestCase
|
||||
'project.comment',
|
||||
'project.order_date',
|
||||
'project.order_number',
|
||||
'project.fixed_rate',
|
||||
'project.fixed_rate_nc',
|
||||
'project.fixed_rate_plain',
|
||||
'project.hourly_rate',
|
||||
'project.hourly_rate_nc',
|
||||
'project.hourly_rate_plain',
|
||||
'project.meta.foo-project',
|
||||
'project.start_date',
|
||||
'project.end_date',
|
||||
|
||||
@@ -119,22 +119,10 @@ class DebugRendererTest extends TestCase
|
||||
'customer.number',
|
||||
'customer.homepage',
|
||||
'customer.comment',
|
||||
'customer.fixed_rate',
|
||||
'customer.fixed_rate_nc',
|
||||
'customer.fixed_rate_plain',
|
||||
'customer.hourly_rate',
|
||||
'customer.hourly_rate_nc',
|
||||
'customer.hourly_rate_plain',
|
||||
'customer.meta.foo-customer',
|
||||
'activity.id',
|
||||
'activity.name',
|
||||
'activity.comment',
|
||||
'activity.fixed_rate',
|
||||
'activity.fixed_rate_nc',
|
||||
'activity.fixed_rate_plain',
|
||||
'activity.hourly_rate',
|
||||
'activity.hourly_rate_nc',
|
||||
'activity.hourly_rate_plain',
|
||||
'activity.meta.foo-activity',
|
||||
'user.alias',
|
||||
'user.email',
|
||||
@@ -152,12 +140,6 @@ class DebugRendererTest extends TestCase
|
||||
'project.comment',
|
||||
'project.order_date',
|
||||
'project.order_number',
|
||||
'project.fixed_rate',
|
||||
'project.fixed_rate_nc',
|
||||
'project.fixed_rate_plain',
|
||||
'project.hourly_rate',
|
||||
'project.hourly_rate_nc',
|
||||
'project.hourly_rate_plain',
|
||||
'project.meta.foo-project',
|
||||
'project.start_date',
|
||||
'project.end_date',
|
||||
|
||||
@@ -10,11 +10,15 @@
|
||||
namespace App\Tests\Timesheet\Calculator;
|
||||
|
||||
use App\Entity\Activity;
|
||||
use App\Entity\ActivityRate;
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\CustomerRate;
|
||||
use App\Entity\Project;
|
||||
use App\Entity\ProjectRate;
|
||||
use App\Entity\Timesheet;
|
||||
use App\Entity\User;
|
||||
use App\Entity\UserPreference;
|
||||
use App\Repository\TimesheetRepository;
|
||||
use App\Timesheet\Calculator\RateCalculator;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
@@ -23,6 +27,16 @@ use PHPUnit\Framework\TestCase;
|
||||
*/
|
||||
class RateCalculatorTest extends TestCase
|
||||
{
|
||||
protected function getRateRepositoryMock(array $rates = [])
|
||||
{
|
||||
$mock = $this->getMockBuilder(TimesheetRepository::class)->disableOriginalConstructor()->getMock();
|
||||
if (!empty($rates)) {
|
||||
$mock->expects($this->any())->method('findMatchingRates')->willReturn($rates);
|
||||
}
|
||||
|
||||
return $mock;
|
||||
}
|
||||
|
||||
public function testCalculateWithTimesheetHourlyRate()
|
||||
{
|
||||
$record = new Timesheet();
|
||||
@@ -31,7 +45,7 @@ class RateCalculatorTest extends TestCase
|
||||
$record->setHourlyRate(100);
|
||||
$record->setActivity(new Activity());
|
||||
|
||||
$sut = new RateCalculator([]);
|
||||
$sut = new RateCalculator([], $this->getRateRepositoryMock());
|
||||
$sut->calculate($record);
|
||||
$this->assertEquals(50, $record->getRate());
|
||||
}
|
||||
@@ -46,34 +60,34 @@ class RateCalculatorTest extends TestCase
|
||||
$record->setHourlyRate(99);
|
||||
$record->setActivity(new Activity());
|
||||
|
||||
$sut = new RateCalculator([]);
|
||||
$sut = new RateCalculator([], $this->getRateRepositoryMock());
|
||||
$sut->calculate($record);
|
||||
$this->assertEquals(10, $record->getRate());
|
||||
}
|
||||
|
||||
public function getRateTestData()
|
||||
{
|
||||
yield 'a0' => [0.0, 0, 0, null, null, null, null, null, null, null, null];
|
||||
yield 'a1' => [0.0, 1800, 0, null, null, null, null, null, null, null, null];
|
||||
yield 'a2' => [0.5, 1800, 1, null, null, null, null, null, null, null, null];
|
||||
yield 'a3' => [0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
yield 'b1' => [1.5, 1800, 1, 3, null, 5, null, 7, null, 9, null];
|
||||
yield 'b2' => [2.5, 1800, 1, null, null, 5, null, 7, null, 9, null];
|
||||
yield 'b3' => [3.5, 1800, 1, null, null, null, null, 7, null, 9, null];
|
||||
yield 'b4' => [4.5, 1800, 1, null, null, null, null, null, null, 9, null];
|
||||
yield 'b5' => [2.0, 1800, 1, null, 2, null, 3, null, 4, null, 5];
|
||||
yield 'b6' => [3.0, 1800, 1, null, null, null, 3, null, 4, null, 5];
|
||||
yield 'b7' => [4.0, 1800, 1, null, null, null, null, null, 4, null, 5];
|
||||
yield 'b8' => [3.0, 1800, 1, null, null, null, 3, null, null, null, 5];
|
||||
yield 'b9' => [2.0, 1800, 1, null, 2, null, null, null, null, null, 5];
|
||||
yield 'c0' => [5.0, 1800, 100, 10, null, null, null, null, null, null, null];
|
||||
yield 'd0' => [10, 1800, 100, null, 10, null, null, null, null, null, null];
|
||||
yield 'e0' => [10, 1800, 100, null, null, 20, null, null, null, null, null];
|
||||
yield 'f0' => [20, 1800, 100, null, null, null, 20, null, null, null, null];
|
||||
yield 'g0' => [15, 1800, 100, null, null, null, null, 30, null, null, null];
|
||||
yield 'h0' => [30, 1800, 100, null, null, null, null, null, 30, null, null];
|
||||
yield 'i0' => [20, 1800, 100, null, null, null, null, null, null, 40, null];
|
||||
yield 'j0' => [40, 1800, 100, null, null, null, null, null, null, null, 40];
|
||||
yield 'a0' => [0.0, 0, 0, null, null, null, null, null, null, null, null];
|
||||
yield 'a1' => [0.0, 1800, 0, null, null, null, null, null, null, null, null];
|
||||
yield 'a2' => [0.5, 1800, 1, null, null, null, null, null, null, null, null];
|
||||
yield 'a3' => [0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
yield 'b1' => [1.5, 1800, 1, 3, null, 5, null, 7, null, 9, null];
|
||||
yield 'b2' => [2.5, 1800, 1, null, null, 5, null, 7, null, 9, null];
|
||||
yield 'b3' => [3.5, 1800, 1, null, null, null, null, 7, null, 9, null];
|
||||
yield 'b4' => [4.5, 1800, 1, null, null, null, null, null, null, 9, null];
|
||||
yield 'b5' => [2.0, 1800, 1, null, 2, null, 3, null, 4, null, 5];
|
||||
yield 'b6' => [3.0, 1800, 1, null, null, null, 3, null, 4, null, 5];
|
||||
yield 'b7' => [4.0, 1800, 1, null, null, null, null, null, 4, null, 5];
|
||||
yield 'b8' => [3.0, 1800, 1, null, null, null, 3, null, null, null, 5];
|
||||
yield 'b9' => [2.0, 1800, 1, null, 2, null, null, null, null, null, 5];
|
||||
yield 'c0' => [5.0, 1800, 100, 10, null, null, null, null, null, null, null];
|
||||
yield 'd0' => [10, 1800, 100, null, 10, null, null, null, null, null, null];
|
||||
yield 'e0' => [10, 1800, 100, null, null, 20, null, null, null, null, null];
|
||||
yield 'f0' => [20, 1800, 100, null, null, null, 20, null, null, null, null];
|
||||
yield 'g0' => [15, 1800, 100, null, null, null, null, 30, null, null, null];
|
||||
yield 'h0' => [30, 1800, 100, null, null, null, null, null, 30, null, null];
|
||||
yield 'i0' => [20, 1800, 100, null, null, null, null, null, null, 40, null];
|
||||
yield 'j0' => [40, 1800, 100, null, null, null, null, null, null, null, 40];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -93,24 +107,12 @@ class RateCalculatorTest extends TestCase
|
||||
$customerFixed
|
||||
) {
|
||||
$customer = new Customer();
|
||||
$customer
|
||||
->setHourlyRate($customerHourly)
|
||||
->setFixedRate($customerFixed)
|
||||
;
|
||||
|
||||
$project = new Project();
|
||||
$project
|
||||
->setHourlyRate($projectHourly)
|
||||
->setFixedRate($projectFixed)
|
||||
->setCustomer($customer)
|
||||
;
|
||||
$project->setCustomer($customer);
|
||||
|
||||
$activity = new Activity();
|
||||
$activity
|
||||
->setHourlyRate($activityHourly)
|
||||
->setFixedRate($activityFixed)
|
||||
->setProject($project)
|
||||
;
|
||||
$activity->setProject($project);
|
||||
|
||||
$timesheet = new Timesheet();
|
||||
$timesheet
|
||||
@@ -123,7 +125,27 @@ class RateCalculatorTest extends TestCase
|
||||
->setUser($this->getTestUser($userRate))
|
||||
;
|
||||
|
||||
$sut = new RateCalculator([]);
|
||||
$rates = [];
|
||||
|
||||
if (null !== $customerFixed) {
|
||||
$rates[] = (new CustomerRate())->setRate($customerFixed)->setIsFixed(true);
|
||||
} elseif (null !== $customerHourly) {
|
||||
$rates[] = (new CustomerRate())->setRate($customerHourly);
|
||||
}
|
||||
|
||||
if (null !== $projectFixed) {
|
||||
$rates[] = (new ProjectRate())->setRate($projectFixed)->setIsFixed(true);
|
||||
} elseif (null !== $projectHourly) {
|
||||
$rates[] = (new ProjectRate())->setRate($projectHourly);
|
||||
}
|
||||
|
||||
if (null !== $activityFixed) {
|
||||
$rates[] = (new ActivityRate())->setRate($activityFixed)->setIsFixed(true);
|
||||
} elseif (null !== $activityHourly) {
|
||||
$rates[] = (new ActivityRate())->setRate($activityHourly);
|
||||
}
|
||||
|
||||
$sut = new RateCalculator([], $this->getRateRepositoryMock($rates));
|
||||
$sut->calculate($timesheet);
|
||||
$this->assertEquals($exptectedRate, $timesheet->getRate());
|
||||
}
|
||||
@@ -151,7 +173,7 @@ class RateCalculatorTest extends TestCase
|
||||
|
||||
$this->assertEquals(0, $record->getRate());
|
||||
|
||||
$sut = new RateCalculator([]);
|
||||
$sut = new RateCalculator([], $this->getRateRepositoryMock());
|
||||
$sut->calculate($record);
|
||||
$this->assertEquals(0, $record->getRate());
|
||||
}
|
||||
@@ -177,7 +199,7 @@ class RateCalculatorTest extends TestCase
|
||||
|
||||
$record->setEnd($end);
|
||||
|
||||
$sut = new RateCalculator($rules);
|
||||
$sut = new RateCalculator($rules, $this->getRateRepositoryMock());
|
||||
$sut->calculate($record);
|
||||
|
||||
$this->assertEquals($expectedRate, $record->getRate());
|
||||
|
||||
Reference in New Issue
Block a user