billable timesheets, inactive projects report, bookmark export search (#2503)

This commit is contained in:
Kevin Papst
2021-04-18 21:51:27 +02:00
committed by GitHub
parent 8664d94ea6
commit 0330f45c6a
97 changed files with 1516 additions and 664 deletions

View File

@@ -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:

View File

@@ -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');

View File

@@ -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());
}

View File

@@ -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');

View File

@@ -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 = [

View File

@@ -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');

View 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());
}
}

View File

@@ -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());
}

View File

@@ -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()

View File

@@ -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]);
}
}

View File

@@ -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]);
}
}

View File

@@ -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());
}
}

View File

@@ -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());
}
}

View File

@@ -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));
}
}

View File

@@ -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());
}
}

View 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());
}
}

View File

@@ -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());
}
}

View File

@@ -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);
}
}

View File

@@ -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());

View File

@@ -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));
}
}

View File

@@ -40,6 +40,7 @@ class RuntimeExtensionsTest extends TestCase
$expected = [
'trigger',
'actions',
'progressbar_color',
'javascript_translations',
'active_timesheets',
'encore_entry_css_source',

View File

@@ -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,
]
]
]
];
});