billable timesheets, inactive projects report, bookmark export search (#2503)
This commit is contained in:
@@ -483,6 +483,7 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
|
||||
'metaFields' => ['result' => 'array', 'type' => 'TimesheetMeta'],
|
||||
'internalRate' => 'float',
|
||||
'exported' => 'bool',
|
||||
'billable' => 'bool',
|
||||
'fixedRate' => '@float',
|
||||
'hourlyRate' => '@float',
|
||||
// TODO new fields: billable, category
|
||||
@@ -503,6 +504,7 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
|
||||
'metaFields' => ['result' => 'array', 'type' => 'TimesheetMeta'],
|
||||
'internalRate' => 'float',
|
||||
'exported' => 'bool',
|
||||
'billable' => 'bool',
|
||||
'fixedRate' => '@float',
|
||||
'hourlyRate' => '@float',
|
||||
// TODO new fields: billable, category
|
||||
@@ -522,6 +524,8 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
|
||||
'user' => 'int',
|
||||
'metaFields' => ['result' => 'array', 'type' => 'TimesheetMeta'],
|
||||
'internalRate' => 'float',
|
||||
'exported' => 'bool',
|
||||
'billable' => 'bool',
|
||||
];
|
||||
|
||||
case 'TimesheetCollectionFull':
|
||||
@@ -538,6 +542,8 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
|
||||
'user' => 'int',
|
||||
'metaFields' => ['result' => 'array', 'type' => 'TimesheetMeta'],
|
||||
'internalRate' => 'float',
|
||||
'exported' => 'bool',
|
||||
'billable' => 'bool',
|
||||
];
|
||||
|
||||
default:
|
||||
|
||||
@@ -139,6 +139,8 @@ class ActivityControllerTest extends ControllerBaseTest
|
||||
|
||||
$node = $client->getCrawler()->filter('div.box#activity_details_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#time_budget_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');
|
||||
|
||||
@@ -199,12 +199,12 @@ abstract class ControllerBaseTest extends WebTestCase
|
||||
|
||||
/**
|
||||
* @param HttpKernelBrowser $client
|
||||
* @param string $id
|
||||
* @param string $class
|
||||
* @param int $count
|
||||
*/
|
||||
protected function assertDataTableRowCount(HttpKernelBrowser $client, string $id, int $count)
|
||||
protected function assertDataTableRowCount(HttpKernelBrowser $client, string $class, int $count)
|
||||
{
|
||||
$node = $client->getCrawler()->filter('section.content div.' . $id . ' table.dataTable tbody tr:not(.summary)');
|
||||
$node = $client->getCrawler()->filter('section.content div.' . $class . ' table.dataTable tbody tr:not(.summary)');
|
||||
self::assertEquals($count, $node->count());
|
||||
}
|
||||
|
||||
|
||||
@@ -114,6 +114,8 @@ class CustomerControllerTest extends ControllerBaseTest
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#project_list_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#time_budget_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#team_listing_box');
|
||||
|
||||
@@ -34,7 +34,7 @@ class ExportControllerTest extends ControllerBaseTest
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD);
|
||||
|
||||
$this->request($client, '/export/?preview=');
|
||||
$this->request($client, '/export/?performSearch=performSearch');
|
||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||
|
||||
$this->assertHasNoEntriesWithFilter($client);
|
||||
@@ -83,13 +83,13 @@ class ExportControllerTest extends ControllerBaseTest
|
||||
$this->importFixture($fixture);
|
||||
$em->flush();
|
||||
|
||||
$this->request($client, '/export/?preview=');
|
||||
$this->request($client, '/export/?performSearch=performSearch');
|
||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||
|
||||
// make sure all existing records are displayed
|
||||
$this->assertHasDataTable($client);
|
||||
// +1 row for summary
|
||||
$this->assertDataTableRowCount($client, 'datatable_export', 23);
|
||||
$this->assertDataTableRowCount($client, 'datatable_export', 22);
|
||||
|
||||
// assert export type buttons are available
|
||||
$expected = [
|
||||
@@ -113,7 +113,6 @@ class ExportControllerTest extends ControllerBaseTest
|
||||
public function testIndexActionWithEntriesForTeamleadDoesNotShowUserWithoutTeam()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD);
|
||||
$em = $this->getEntityManager();
|
||||
|
||||
$begin = new \DateTime('first day of this month');
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
@@ -127,10 +126,10 @@ class ExportControllerTest extends ControllerBaseTest
|
||||
;
|
||||
$this->importFixture($fixture);
|
||||
|
||||
$this->request($client, '/export/?preview=');
|
||||
$this->request($client, '/export/?performSearch=performSearch');
|
||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||
|
||||
// make sure all existing records are displayed
|
||||
// make sure existing records are not displayed
|
||||
$this->assertHasNoEntriesWithFilter($client);
|
||||
|
||||
$teamlead = $this->getUserByRole(User::ROLE_TEAMLEAD);
|
||||
@@ -143,13 +142,13 @@ class ExportControllerTest extends ControllerBaseTest
|
||||
;
|
||||
$this->importFixture($fixture);
|
||||
|
||||
$this->request($client, '/export/?preview=');
|
||||
$this->request($client, '/export/?performSearch=performSearch');
|
||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||
|
||||
// make sure all existing records are displayed
|
||||
$this->assertHasDataTable($client);
|
||||
// +1 row for summary
|
||||
$this->assertDataTableRowCount($client, 'datatable_export', 3);
|
||||
$this->assertDataTableRowCount($client, 'datatable_export', 2);
|
||||
|
||||
// assert export type buttons are available
|
||||
$expected = [
|
||||
|
||||
@@ -148,6 +148,8 @@ class ProjectControllerTest extends ControllerBaseTest
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#activity_list_box');
|
||||
self::assertEquals(1, $node->count());
|
||||
$node = $client->getCrawler()->filter('div.box#time_budget_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#team_listing_box');
|
||||
|
||||
60
tests/Controller/Reporting/InactiveProjectControllerTest.php
Normal file
60
tests/Controller/Reporting/InactiveProjectControllerTest.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?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\Controller\Reporting;
|
||||
|
||||
use App\Entity\User;
|
||||
use App\Tests\Controller\ControllerBaseTest;
|
||||
use App\Tests\DataFixtures\ActivityFixtures;
|
||||
use App\Tests\DataFixtures\CustomerFixtures;
|
||||
use App\Tests\DataFixtures\ProjectFixtures;
|
||||
use App\Tests\DataFixtures\TimesheetFixtures;
|
||||
|
||||
/**
|
||||
* @group integration
|
||||
*/
|
||||
class InactiveProjectControllerTest extends ControllerBaseTest
|
||||
{
|
||||
public function testReportIsSecure()
|
||||
{
|
||||
$this->assertUrlIsSecured('/reporting/project_inactive');
|
||||
}
|
||||
|
||||
public function testReport()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
|
||||
$customers = new CustomerFixtures();
|
||||
$customers->setIsVisible(true);
|
||||
$customers->setAmount(1);
|
||||
$customers = $this->importFixture($customers);
|
||||
|
||||
$projects = new ProjectFixtures();
|
||||
$projects->setCustomers($customers);
|
||||
$projects->setAmount(2);
|
||||
$projects->setIsVisible(true);
|
||||
$this->importFixture($projects);
|
||||
|
||||
$activities = new ActivityFixtures();
|
||||
$activities->setAmount(5);
|
||||
$activities->setIsGlobal(true);
|
||||
$activities = $this->importFixture($activities);
|
||||
|
||||
$timesheets = new TimesheetFixtures();
|
||||
$timesheets->setAmount(50);
|
||||
$timesheets->setActivities($activities);
|
||||
$timesheets->setUser($this->getUserByRole(User::ROLE_TEAMLEAD));
|
||||
$this->importFixture($timesheets);
|
||||
|
||||
$this->assertAccessIsGranted($client, '/reporting/project_inactive');
|
||||
self::assertStringContainsString('<div class="box-body inactive_project_reporting-box', $client->getResponse()->getContent());
|
||||
$rows = $client->getCrawler()->filterXPath("//table[contains(@class, 'dataTable')]/tbody/tr[not(@class='summary')]");
|
||||
self::assertGreaterThan(0, $rows->count());
|
||||
}
|
||||
}
|
||||
@@ -21,12 +21,12 @@ use App\Tests\DataFixtures\TimesheetFixtures;
|
||||
*/
|
||||
class ProjectViewControllerTest extends ControllerBaseTest
|
||||
{
|
||||
public function testProjectViewIsSecure()
|
||||
public function testReportIsSecure()
|
||||
{
|
||||
$this->assertUrlIsSecured('/reporting/project_view');
|
||||
}
|
||||
|
||||
public function testProjectViewReport()
|
||||
public function testReport()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
|
||||
@@ -39,7 +39,7 @@ class ProjectViewControllerTest extends ControllerBaseTest
|
||||
$projects->setCustomers($customers);
|
||||
$projects->setAmount(2);
|
||||
$projects->setIsVisible(true);
|
||||
$projects = $this->importFixture($projects);
|
||||
$this->importFixture($projects);
|
||||
|
||||
$activities = new ActivityFixtures();
|
||||
$activities->setAmount(5);
|
||||
@@ -53,7 +53,7 @@ class ProjectViewControllerTest extends ControllerBaseTest
|
||||
$this->importFixture($timesheets);
|
||||
|
||||
$this->assertAccessIsGranted($client, '/reporting/project_view');
|
||||
self::assertStringContainsString('<div class="box-body project-view-reporting-box', $client->getResponse()->getContent());
|
||||
self::assertStringContainsString('<div class="box-body project_view_reporting-box', $client->getResponse()->getContent());
|
||||
$rows = $client->getCrawler()->filterXPath("//table[contains(@class, 'dataTable')]/tbody/tr[not(@class='summary')]");
|
||||
self::assertGreaterThan(0, $rows->count());
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ class UserTest extends TestCase
|
||||
self::assertFalse($user->hasTeamAssignment());
|
||||
self::assertFalse($user->canSeeAllData());
|
||||
self::assertFalse($user->isSmallLayout());
|
||||
self::assertFalse($user->isExportDecimal());
|
||||
|
||||
$user->setAvatar('https://www.gravatar.com/avatar/00000000000000000000000000000000?d=retro&f=y');
|
||||
self::assertEquals('https://www.gravatar.com/avatar/00000000000000000000000000000000?d=retro&f=y', $user->getAvatar());
|
||||
@@ -114,6 +115,9 @@ class UserTest extends TestCase
|
||||
self::assertTrue($user->isSmallLayout());
|
||||
$user->setPreferenceValue('theme.layout', '12345');
|
||||
self::assertFalse($user->isSmallLayout());
|
||||
|
||||
$user->setPreferenceValue('timesheet.export_decimal', true);
|
||||
self::assertTrue($user->isExportDecimal());
|
||||
}
|
||||
|
||||
public function testDisplayName()
|
||||
|
||||
@@ -91,25 +91,26 @@ class CsvRendererTest extends AbstractRendererTest
|
||||
10 => 'activity description',
|
||||
11 => '',
|
||||
12 => '',
|
||||
13 => 'foo,bar',
|
||||
14 => '',
|
||||
15 => ' EUR 84.00 ',
|
||||
16 => 'meta-bar',
|
||||
17 => 'meta-bar2',
|
||||
18 => 'customer-bar',
|
||||
19 => '',
|
||||
20 => 'project-foo2',
|
||||
21 => 'activity-bar',
|
||||
22 => 'timesheet',
|
||||
23 => 'work',
|
||||
24 => 'A-0123456789',
|
||||
25 => 'DE-9876543210',
|
||||
26 => 'ORDER-123',
|
||||
13 => '',
|
||||
14 => 'foo,bar',
|
||||
15 => '',
|
||||
16 => ' EUR 84.00 ',
|
||||
17 => 'meta-bar',
|
||||
18 => 'meta-bar2',
|
||||
19 => 'customer-bar',
|
||||
20 => '',
|
||||
21 => 'project-foo2',
|
||||
22 => 'activity-bar',
|
||||
23 => 'timesheet',
|
||||
24 => 'work',
|
||||
25 => 'A-0123456789',
|
||||
26 => 'DE-9876543210',
|
||||
27 => 'ORDER-123',
|
||||
];
|
||||
|
||||
self::assertEquals(7, \count($all));
|
||||
self::assertEquals($expected, $all[5]);
|
||||
self::assertEquals(\count($expected), \count($all[0]));
|
||||
self::assertEquals('foo', $all[4][13]);
|
||||
self::assertEquals('foo', $all[4][14]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,25 +88,26 @@ class CsvRendererTest extends AbstractRendererTest
|
||||
10 => 'activity description',
|
||||
11 => '',
|
||||
12 => '',
|
||||
13 => 'foo,bar',
|
||||
14 => '',
|
||||
15 => ' EUR 84.00 ',
|
||||
16 => 'meta-bar',
|
||||
17 => 'meta-bar2',
|
||||
18 => 'customer-bar',
|
||||
19 => '',
|
||||
20 => 'project-foo2',
|
||||
21 => 'activity-bar',
|
||||
22 => 'timesheet',
|
||||
23 => 'work',
|
||||
24 => 'A-0123456789',
|
||||
25 => 'DE-9876543210',
|
||||
26 => 'ORDER-123',
|
||||
13 => '',
|
||||
14 => 'foo,bar',
|
||||
15 => '',
|
||||
16 => ' EUR 84.00 ',
|
||||
17 => 'meta-bar',
|
||||
18 => 'meta-bar2',
|
||||
19 => 'customer-bar',
|
||||
20 => '',
|
||||
21 => 'project-foo2',
|
||||
22 => 'activity-bar',
|
||||
23 => 'timesheet',
|
||||
24 => 'work',
|
||||
25 => 'A-0123456789',
|
||||
26 => 'DE-9876543210',
|
||||
27 => 'ORDER-123',
|
||||
];
|
||||
|
||||
self::assertEquals(7, \count($all));
|
||||
self::assertEquals($expected, $all[5]);
|
||||
self::assertEquals(\count($expected), \count($all[0]));
|
||||
self::assertEquals('foo', $all[4][13]);
|
||||
self::assertEquals('foo', $all[4][14]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,10 +23,11 @@ class DayTest extends TestCase
|
||||
$date = new DateTime('-8 hours');
|
||||
$sut = new Day($date, 12340, 197.25956);
|
||||
|
||||
$this->assertSame($date, $sut->getDay());
|
||||
$this->assertEquals([], $sut->getDetails());
|
||||
$this->assertEquals(12340, $sut->getTotalDuration());
|
||||
$this->assertEquals(197.25956, $sut->getTotalRate());
|
||||
self::assertSame($date, $sut->getDay());
|
||||
self::assertEquals([], $sut->getDetails());
|
||||
self::assertSame(12340, $sut->getTotalDuration());
|
||||
self::assertSame(197.25956, $sut->getTotalRate());
|
||||
self::assertSame(0, $sut->getTotalDurationBillable());
|
||||
}
|
||||
|
||||
public function testAllowedMonths()
|
||||
@@ -36,9 +37,11 @@ class DayTest extends TestCase
|
||||
|
||||
$sut->setTotalDuration(999);
|
||||
$sut->setTotalRate(0.123456789);
|
||||
$sut->setTotalDurationBillable(12345);
|
||||
|
||||
$this->assertEquals(999, $sut->getTotalDuration());
|
||||
$this->assertEquals(0.123456789, $sut->getTotalRate());
|
||||
self::assertSame(999, $sut->getTotalDuration());
|
||||
self::assertSame(0.123456789, $sut->getTotalRate());
|
||||
self::assertSame(12345, $sut->getTotalDurationBillable());
|
||||
}
|
||||
|
||||
public function testSetDetails()
|
||||
@@ -47,6 +50,6 @@ class DayTest extends TestCase
|
||||
|
||||
$sut->setDetails(['foo' => ['bar' => '1212e'], 'hello' => 'world']);
|
||||
|
||||
$this->assertEquals(['foo' => ['bar' => '1212e'], 'hello' => 'world'], $sut->getDetails());
|
||||
self::assertEquals(['foo' => ['bar' => '1212e'], 'hello' => 'world'], $sut->getDetails());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,9 +22,11 @@ class MonthTest extends TestCase
|
||||
public function testDefaultValues()
|
||||
{
|
||||
$sut = new Month('01');
|
||||
$this->assertEquals('01', $sut->getMonth());
|
||||
$this->assertEquals(0, $sut->getTotalDuration());
|
||||
$this->assertEquals(0, $sut->getTotalRate());
|
||||
self::assertSame('01', $sut->getMonth());
|
||||
self::assertSame(0, $sut->getTotalDuration());
|
||||
self::assertSame(0.0, $sut->getTotalRate());
|
||||
self::assertSame(0, $sut->getBillableDuration());
|
||||
self::assertSame(0.0, $sut->getBillableRate());
|
||||
}
|
||||
|
||||
public function testAllowedMonths()
|
||||
@@ -35,7 +37,7 @@ class MonthTest extends TestCase
|
||||
for ($i = 10; $i < 13; $i++) {
|
||||
new Month((string) $i);
|
||||
}
|
||||
$this->assertTrue(true);
|
||||
self::assertTrue(true);
|
||||
}
|
||||
|
||||
public function testInvalidMonths()
|
||||
@@ -47,8 +49,8 @@ class MonthTest extends TestCase
|
||||
} catch (Exception $e) {
|
||||
$ex = $e;
|
||||
}
|
||||
$this->assertInstanceOf(InvalidArgumentException::class, $ex);
|
||||
$this->assertEquals(
|
||||
self::assertInstanceOf(InvalidArgumentException::class, $ex);
|
||||
self::assertEquals(
|
||||
'Invalid month given. Expected 1-12, received "' . ((int) $month) . '".',
|
||||
$ex->getMessage()
|
||||
);
|
||||
@@ -60,8 +62,12 @@ class MonthTest extends TestCase
|
||||
$sut = new Month('01');
|
||||
$sut->setTotalDuration(999);
|
||||
$sut->setTotalRate(0.123456789);
|
||||
$sut->setBillableDuration(123456);
|
||||
$sut->setBillableRate(123.456789);
|
||||
|
||||
$this->assertEquals(999, $sut->getTotalDuration());
|
||||
$this->assertEquals(0.123456789, $sut->getTotalRate());
|
||||
self::assertSame(999, $sut->getTotalDuration());
|
||||
self::assertSame(0.123456789, $sut->getTotalRate());
|
||||
self::assertSame(123456, $sut->getBillableDuration());
|
||||
self::assertSame(123.456789, $sut->getBillableRate());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,10 +21,10 @@ class YearTest extends TestCase
|
||||
public function testDefaultValues()
|
||||
{
|
||||
$sut = new Year('1999');
|
||||
$this->assertNull($sut->getMonth(1));
|
||||
$this->assertEmpty($sut->getMonths());
|
||||
$this->assertIsArray($sut->getMonths());
|
||||
$this->assertEquals('1999', $sut->getYear());
|
||||
self::assertNull($sut->getMonth(1));
|
||||
self::assertEmpty($sut->getMonths());
|
||||
self::assertIsArray($sut->getMonths());
|
||||
self::assertEquals('1999', $sut->getYear());
|
||||
}
|
||||
|
||||
public function testSetter()
|
||||
@@ -34,15 +34,15 @@ class YearTest extends TestCase
|
||||
$sut->setMonth(new Month('01'));
|
||||
$sut->setMonth(new Month('02'));
|
||||
$sut->setMonth(new Month('03'));
|
||||
$this->assertEquals(3, \count($sut->getMonths()));
|
||||
self::assertEquals(3, \count($sut->getMonths()));
|
||||
|
||||
$sut->setMonth(new Month('01'));
|
||||
|
||||
$this->assertEquals(3, \count($sut->getMonths()));
|
||||
self::assertEquals(3, \count($sut->getMonths()));
|
||||
|
||||
$this->assertInstanceOf(Month::class, $sut->getMonth(1));
|
||||
$this->assertInstanceOf(Month::class, $sut->getMonth(2));
|
||||
$this->assertInstanceOf(Month::class, $sut->getMonth(3));
|
||||
$this->assertNull($sut->getMonth(4));
|
||||
self::assertInstanceOf(Month::class, $sut->getMonth(1));
|
||||
self::assertInstanceOf(Month::class, $sut->getMonth(2));
|
||||
self::assertInstanceOf(Month::class, $sut->getMonth(3));
|
||||
self::assertNull($sut->getMonth(4));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,13 @@ class TimesheetCountedStatisticTest extends TestCase
|
||||
public function testDefaultValues()
|
||||
{
|
||||
$sut = new TimesheetCountedStatistic();
|
||||
self::assertEquals(0.0, $sut->getRecordRate());
|
||||
self::assertEquals(0, $sut->getRecordDuration());
|
||||
self::assertEquals(0, $sut->getRecordAmount());
|
||||
self::assertEquals(0.0, $sut->getRecordInternalRate());
|
||||
self::assertSame(0.0, $sut->getRecordRate());
|
||||
self::assertSame(0, $sut->getRecordDuration());
|
||||
self::assertSame(0, $sut->getRecordAmount());
|
||||
self::assertSame(0.0, $sut->getRecordInternalRate());
|
||||
self::assertSame(0, $sut->getDurationBillable());
|
||||
self::assertSame(0.0, $sut->getRateBillable());
|
||||
self::assertSame(0, $sut->getRecordAmountBillable());
|
||||
}
|
||||
|
||||
public function testSetter()
|
||||
@@ -34,9 +37,17 @@ class TimesheetCountedStatisticTest extends TestCase
|
||||
self::assertInstanceOf(TimesheetCountedStatistic::class, $sut->setRecordAmount(5));
|
||||
self::assertInstanceOf(TimesheetCountedStatistic::class, $sut->setRecordInternalRate(99.09));
|
||||
|
||||
self::assertEquals(23.97, $sut->getRecordRate());
|
||||
self::assertEquals(21, $sut->getRecordDuration());
|
||||
self::assertEquals(5, $sut->getRecordAmount());
|
||||
self::assertEquals(99.09, $sut->getRecordInternalRate());
|
||||
self::assertSame(23.97, $sut->getRecordRate());
|
||||
self::assertSame(21, $sut->getRecordDuration());
|
||||
self::assertSame(5, $sut->getRecordAmount());
|
||||
self::assertSame(99.09, $sut->getRecordInternalRate());
|
||||
|
||||
$sut->setRateBillable(123.456);
|
||||
$sut->setDurationBillable(1234);
|
||||
$sut->setRecordAmountBillable(4321);
|
||||
|
||||
self::assertSame(123.456, $sut->getRateBillable());
|
||||
self::assertSame(1234, $sut->getDurationBillable());
|
||||
self::assertSame(4321, $sut->getRecordAmountBillable());
|
||||
}
|
||||
}
|
||||
|
||||
42
tests/Reporting/ProjectInactive/ProjectInactiveQueryTest.php
Normal file
42
tests/Reporting/ProjectInactive/ProjectInactiveQueryTest.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\Reporting\ProjectInactive;
|
||||
|
||||
use App\Entity\User;
|
||||
use App\Reporting\ProjectInactive\ProjectInactiveQuery;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @covers \App\Reporting\ProjectInactive\ProjectInactiveQuery
|
||||
*/
|
||||
class ProjectInactiveQueryTest extends TestCase
|
||||
{
|
||||
public function testDefaults()
|
||||
{
|
||||
$user = new User();
|
||||
$date = new \DateTime();
|
||||
$sut = new ProjectInactiveQuery($date, $user);
|
||||
|
||||
self::assertEquals($date, $sut->getLastChange());
|
||||
self::assertSame($user, $sut->getUser());
|
||||
}
|
||||
|
||||
public function testSetterGetter()
|
||||
{
|
||||
$user = new User();
|
||||
$date = new \DateTime();
|
||||
$sut = new ProjectInactiveQuery($date, $user);
|
||||
|
||||
$date1 = new \DateTime('2020-01-02 19:23:34');
|
||||
$sut->setLastChange($date1);
|
||||
|
||||
self::assertEquals($date1, $sut->getLastChange());
|
||||
}
|
||||
}
|
||||
@@ -24,19 +24,28 @@ class ProjectViewModelTest extends TestCase
|
||||
$sut = new ProjectViewModel($project);
|
||||
|
||||
self::assertSame($project, $sut->getProject());
|
||||
self::assertEquals(0, $sut->getDurationDay());
|
||||
self::assertEquals(0, $sut->getDurationMonth());
|
||||
self::assertEquals(0, $sut->getDurationTotal());
|
||||
self::assertEquals(0, $sut->getDurationWeek());
|
||||
self::assertEquals(0, $sut->getNotExportedDuration());
|
||||
self::assertEquals(0, $sut->getNotExportedRate());
|
||||
self::assertEquals(0, $sut->getRateTotal());
|
||||
self::assertSame(0, $sut->getDurationDay());
|
||||
self::assertSame(0, $sut->getDurationMonth());
|
||||
self::assertSame(0, $sut->getDurationTotal());
|
||||
self::assertSame(0, $sut->getDurationWeek());
|
||||
self::assertSame(0, $sut->getNotExportedDuration());
|
||||
self::assertSame(0.0, $sut->getNotExportedRate());
|
||||
self::assertSame(0.0, $sut->getRateTotal());
|
||||
self::assertNull($sut->getLastRecord());
|
||||
self::assertSame(0, $sut->getTimesheetCounter());
|
||||
self::assertNull($sut->getLastRecord());
|
||||
self::assertSame(0.0, $sut->getBillableRate());
|
||||
self::assertSame(0, $sut->getBillableDuration());
|
||||
self::assertSame(0, $sut->getNotBilledDuration());
|
||||
self::assertSame(0.0, $sut->getNotBilledRate());
|
||||
}
|
||||
|
||||
public function testSetterGetter()
|
||||
{
|
||||
$sut = new ProjectViewModel(new Project());
|
||||
|
||||
$date = new \DateTime();
|
||||
|
||||
$sut->setDurationDay(123456789);
|
||||
$sut->setDurationMonth(23456789);
|
||||
$sut->setDurationTotal(3456789);
|
||||
@@ -44,13 +53,30 @@ class ProjectViewModelTest extends TestCase
|
||||
$sut->setNotExportedDuration(56789);
|
||||
$sut->setNotExportedRate(6789);
|
||||
$sut->setRateTotal(789);
|
||||
$sut->setLastRecord($date);
|
||||
|
||||
self::assertEquals(123456789, $sut->getDurationDay());
|
||||
self::assertEquals(23456789, $sut->getDurationMonth());
|
||||
self::assertEquals(3456789, $sut->getDurationTotal());
|
||||
self::assertEquals(456789, $sut->getDurationWeek());
|
||||
self::assertEquals(56789, $sut->getNotExportedDuration());
|
||||
self::assertEquals(6789, $sut->getNotExportedRate());
|
||||
self::assertEquals(789, $sut->getRateTotal());
|
||||
self::assertSame(123456789, $sut->getDurationDay());
|
||||
self::assertSame(23456789, $sut->getDurationMonth());
|
||||
self::assertSame(3456789, $sut->getDurationTotal());
|
||||
self::assertSame(456789, $sut->getDurationWeek());
|
||||
self::assertSame(56789, $sut->getNotExportedDuration());
|
||||
self::assertSame(6789.0, $sut->getNotExportedRate());
|
||||
self::assertSame(789.0, $sut->getRateTotal());
|
||||
self::assertSame($date, $sut->getLastRecord());
|
||||
|
||||
$date = new \DateTime();
|
||||
$sut->setTimesheetCounter(123);
|
||||
$sut->setLastRecord($date);
|
||||
$sut->setBillableRate(123.456);
|
||||
$sut->setBillableDuration(321);
|
||||
$sut->setNotBilledDuration(9876);
|
||||
$sut->setNotBilledRate(4705.23);
|
||||
|
||||
self::assertSame(123, $sut->getTimesheetCounter());
|
||||
self::assertSame($date, $sut->getLastRecord());
|
||||
self::assertSame(123.456, $sut->getBillableRate());
|
||||
self::assertSame(321, $sut->getBillableDuration());
|
||||
self::assertSame(9876, $sut->getNotBilledDuration());
|
||||
self::assertSame(4705.23, $sut->getNotBilledRate());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,6 @@ class ReportingServiceTest extends TestCase
|
||||
$sut = $this->getSut(true);
|
||||
$reports = $sut->getAvailableReports(new User());
|
||||
self::assertIsArray($reports);
|
||||
self::assertCount(5, $reports);
|
||||
self::assertCount(6, $reports);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
namespace App\Tests\Repository\Query;
|
||||
|
||||
use App\Entity\Activity;
|
||||
use App\Entity\Bookmark;
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\Project;
|
||||
use App\Entity\Team;
|
||||
@@ -71,6 +72,7 @@ class BaseQueryTest extends TestCase
|
||||
$this->assertOrderBy($sut, $orderBy);
|
||||
$this->assertOrder($sut, $order);
|
||||
$this->assertTeams($sut);
|
||||
$this->assertBookmark($sut);
|
||||
}
|
||||
|
||||
private function getFormBuilder(string $name)
|
||||
@@ -119,6 +121,16 @@ class BaseQueryTest extends TestCase
|
||||
self::assertSame($team, $sut->getTeams()[0]);
|
||||
}
|
||||
|
||||
protected function assertBookmark(BaseQuery $sut)
|
||||
{
|
||||
$bookmark = new Bookmark();
|
||||
self::assertNull($sut->getBookmark());
|
||||
self::assertFalse($sut->hasBookmark());
|
||||
$sut->setBookmark($bookmark);
|
||||
self::assertSame($bookmark, $sut->getBookmark());
|
||||
self::assertTrue($sut->hasBookmark());
|
||||
}
|
||||
|
||||
protected function assertPage(BaseQuery $sut)
|
||||
{
|
||||
self::assertEquals(1, $sut->getPage());
|
||||
|
||||
@@ -76,4 +76,47 @@ class ThemeEventExtensionTest extends TestCase
|
||||
$values = $sut->getJavascriptTranslations();
|
||||
self::assertCount(24, $values);
|
||||
}
|
||||
|
||||
public function getProgressbarColors()
|
||||
{
|
||||
yield ['progress-bar-danger', 100, false];
|
||||
yield ['progress-bar-danger', 91, false];
|
||||
yield ['progress-bar-warning', 90, false];
|
||||
yield ['progress-bar-warning', 80, false];
|
||||
yield ['progress-bar-warning', 71, false];
|
||||
yield ['progress-bar-success', 70, false];
|
||||
yield ['progress-bar-success', 60, false];
|
||||
yield ['progress-bar-success', 51, false];
|
||||
yield ['progress-bar-primary', 50, false];
|
||||
yield ['progress-bar-primary', 40, false];
|
||||
yield ['progress-bar-primary', 31, false];
|
||||
yield ['progress-bar-info', 30, false];
|
||||
yield ['progress-bar-info', 20, false];
|
||||
yield ['progress-bar-info', 10, false];
|
||||
yield ['progress-bar-info', 0, false];
|
||||
yield ['progress-bar-primary', 100, true];
|
||||
yield ['progress-bar-primary', 91, true];
|
||||
yield ['progress-bar-success', 90, true];
|
||||
yield ['progress-bar-success', 80, true];
|
||||
yield ['progress-bar-success', 71, true];
|
||||
yield ['progress-bar-warning', 70, true];
|
||||
yield ['progress-bar-warning', 60, true];
|
||||
yield ['progress-bar-warning', 51, true];
|
||||
yield ['progress-bar-danger', 50, true];
|
||||
yield ['progress-bar-danger', 40, true];
|
||||
yield ['progress-bar-danger', 31, true];
|
||||
yield ['progress-bar-info', 30, true];
|
||||
yield ['progress-bar-info', 20, true];
|
||||
yield ['progress-bar-info', 10, true];
|
||||
yield ['progress-bar-info', 0, true];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getProgressbarColors
|
||||
*/
|
||||
public function testProgressbarClass(string $expected, int $percent, ?bool $reverseColors = false)
|
||||
{
|
||||
$sut = $this->getSut(false);
|
||||
self::assertEquals($expected, $sut->getProgressbarClass($percent, $reverseColors));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ class RuntimeExtensionsTest extends TestCase
|
||||
$expected = [
|
||||
'trigger',
|
||||
'actions',
|
||||
'progressbar_color',
|
||||
'javascript_translations',
|
||||
'active_timesheets',
|
||||
'encore_entry_css_source',
|
||||
|
||||
@@ -109,9 +109,21 @@ class DailyWorkingTimeChartTest extends TestCase
|
||||
$repository = $this->getMockBuilder(TimesheetRepository::class)->disableOriginalConstructor()->onlyMethods(['getDailyData'])->getMock();
|
||||
$repository->expects($this->once())->method('getDailyData')->willReturnCallback(function ($begin, $end, $user) use ($activity, $project) {
|
||||
return [
|
||||
['year' => $begin->format('Y'), 'month' => $begin->format('n'), 'day' => $begin->format('j'), 'rate' => 13.75, 'duration' => 1234, 'details' => [
|
||||
['activity' => $activity, 'project' => $project]
|
||||
]]
|
||||
[
|
||||
'year' => $begin->format('Y'),
|
||||
'month' => $begin->format('n'),
|
||||
'day' => $begin->format('j'),
|
||||
'rate' => 13.75,
|
||||
'duration' => 1234,
|
||||
'billable' => 1234,
|
||||
'details' => [
|
||||
[
|
||||
'activity' => $activity,
|
||||
'project' => $project,
|
||||
'billable' => 1234,
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user