several enhancements (#1808)
* show all fields in timesheet api docs * fix action dropdown links #1806 * apply same validation rules for passwords and for api-tokens #1753 * added "duplicate team" action #1136
This commit is contained in:
@@ -56,13 +56,13 @@ class ConfigurationControllerTest extends APIControllerBaseTest
|
||||
|
||||
$this->assertIsArray($result);
|
||||
$this->assertNotEmpty($result);
|
||||
$this->assertEquals(5, \count($result));
|
||||
$this->assertEquals(6, \count($result));
|
||||
$this->assertTimesheetStructure($result);
|
||||
}
|
||||
|
||||
protected function assertTimesheetStructure(array $result)
|
||||
{
|
||||
$expectedKeys = ['activeEntriesHardLimit', 'activeEntriesSoftLimit', 'defaultBeginTime', 'isAllowFutureTimes', 'trackingMode'];
|
||||
$expectedKeys = ['activeEntriesHardLimit', 'activeEntriesSoftLimit', 'defaultBeginTime', 'isAllowFutureTimes', 'isAllowOverlapping', 'trackingMode'];
|
||||
$actual = array_keys($result);
|
||||
sort($actual);
|
||||
sort($expectedKeys);
|
||||
|
||||
@@ -21,6 +21,7 @@ class TimesheetConfigTest extends TestCase
|
||||
{
|
||||
$sut = new TimesheetConfig();
|
||||
$this->assertTrue($sut->isAllowFutureTimes());
|
||||
$this->assertTrue($sut->isAllowOverlapping());
|
||||
$this->assertEquals('now', $sut->getDefaultBeginTime());
|
||||
$this->assertEquals('default', $sut->getTrackingMode());
|
||||
$this->assertEquals(1, $sut->getActiveEntriesSoftLimit());
|
||||
@@ -32,12 +33,14 @@ class TimesheetConfigTest extends TestCase
|
||||
$sut = new TimesheetConfig();
|
||||
|
||||
$this->assertInstanceOf(TimesheetConfig::class, $sut->setIsAllowFutureTimes(false));
|
||||
$this->assertInstanceOf(TimesheetConfig::class, $sut->setIsAllowOverlapping(false));
|
||||
$this->assertInstanceOf(TimesheetConfig::class, $sut->setDefaultBeginTime('08:00'));
|
||||
$this->assertInstanceOf(TimesheetConfig::class, $sut->setTrackingMode('punch'));
|
||||
$this->assertInstanceOf(TimesheetConfig::class, $sut->setActiveEntriesSoftLimit(2));
|
||||
$this->assertInstanceOf(TimesheetConfig::class, $sut->setActiveEntriesHardLimit(3));
|
||||
|
||||
$this->assertFalse($sut->isAllowFutureTimes());
|
||||
$this->assertFalse($sut->isAllowOverlapping());
|
||||
$this->assertEquals('08:00', $sut->getDefaultBeginTime());
|
||||
$this->assertEquals('punch', $sut->getTrackingMode());
|
||||
$this->assertEquals(2, $sut->getActiveEntriesSoftLimit());
|
||||
|
||||
@@ -132,7 +132,7 @@ class TagControllerTest extends APIControllerBaseTest
|
||||
protected function assertStructure(array $result, $full = true)
|
||||
{
|
||||
$expectedKeys = [
|
||||
'id', 'name', 'color', 'timesheets'
|
||||
'id', 'name', 'color'
|
||||
];
|
||||
|
||||
if ($full) {
|
||||
|
||||
@@ -243,6 +243,24 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
$this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), 'test1234', $user->getSalt()));
|
||||
}
|
||||
|
||||
public function testPasswordActionFailsIfPasswordLengthToShort()
|
||||
{
|
||||
$this->assertFormHasValidationError(
|
||||
User::ROLE_USER,
|
||||
'/profile/' . UserFixtures::USERNAME_USER . '/password',
|
||||
'form[name=user_password]',
|
||||
[
|
||||
'user_password' => [
|
||||
'plainPassword' => [
|
||||
'first' => 'abcdef1',
|
||||
'second' => 'abcdef1',
|
||||
]
|
||||
]
|
||||
],
|
||||
['#user_password_plainPassword_first']
|
||||
);
|
||||
}
|
||||
|
||||
public function testApiTokenAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
@@ -255,15 +273,15 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
$passwordEncoder = static::$kernel->getContainer()->get('test.PasswordEncoder');
|
||||
|
||||
$this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), UserFixtures::DEFAULT_API_TOKEN, $user->getSalt()));
|
||||
$this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), 'test123', $user->getSalt()));
|
||||
$this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), 'test1234', $user->getSalt()));
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername());
|
||||
|
||||
$form = $client->getCrawler()->filter('form[name=user_api_token]')->form();
|
||||
$client->submit($form, [
|
||||
'user_api_token' => [
|
||||
'plainApiToken' => [
|
||||
'first' => 'test123',
|
||||
'second' => 'test123',
|
||||
'first' => 'test1234',
|
||||
'second' => 'test1234',
|
||||
]
|
||||
]
|
||||
]);
|
||||
@@ -278,7 +296,25 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
|
||||
$this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), UserFixtures::DEFAULT_API_TOKEN, $user->getSalt()));
|
||||
$this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), 'test123', $user->getSalt()));
|
||||
$this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), 'test1234', $user->getSalt()));
|
||||
}
|
||||
|
||||
public function testApiTokenActionFailsIfPasswordLengthToShort()
|
||||
{
|
||||
$this->assertFormHasValidationError(
|
||||
User::ROLE_USER,
|
||||
'/profile/' . UserFixtures::USERNAME_USER . '/api-token',
|
||||
'form[name=user_api_token]',
|
||||
[
|
||||
'user_api_token' => [
|
||||
'plainApiToken' => [
|
||||
'first' => 'abcdef1',
|
||||
'second' => 'abcdef1',
|
||||
]
|
||||
]
|
||||
],
|
||||
['#user_api_token_plainApiToken_first']
|
||||
);
|
||||
}
|
||||
|
||||
public function testRolesActionIsSecured()
|
||||
|
||||
@@ -205,4 +205,15 @@ class TeamControllerTest extends ControllerBaseTest
|
||||
$team = $em->getRepository(Team::class)->find(1);
|
||||
self::assertEquals(1, \count($team->getProjects()));
|
||||
}
|
||||
|
||||
public function testDuplicateAction()
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||
$this->request($client, '/admin/teams/1/duplicate');
|
||||
$this->assertIsRedirect($client, $this->createUrl('/admin/teams/2/edit'));
|
||||
$client->followRedirect();
|
||||
$node = $client->getCrawler()->filter('#team_edit_form_name');
|
||||
self::assertEquals(1, $node->count());
|
||||
self::assertEquals('Test team [COPY]', $node->attr('value'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,18 +25,27 @@ class VisibilityQueryTest extends TestCase
|
||||
$sut = new VisibilityQuery();
|
||||
|
||||
$this->assertEquals(VisibilityQuery::SHOW_VISIBLE, $sut->getVisibility());
|
||||
self::assertTrue($sut->isShowVisible());
|
||||
self::assertFalse($sut->isShowHidden());
|
||||
self::assertFalse($sut->isShowBoth());
|
||||
|
||||
$sut->setVisibility('foo-bar');
|
||||
$this->assertEquals(VisibilityQuery::SHOW_VISIBLE, $sut->getVisibility());
|
||||
|
||||
$sut->setVisibility('2');
|
||||
$this->assertEquals(VisibilityQuery::SHOW_HIDDEN, $sut->getVisibility());
|
||||
self::assertFalse($sut->isShowVisible());
|
||||
self::assertTrue($sut->isShowHidden());
|
||||
self::assertFalse($sut->isShowBoth());
|
||||
|
||||
$sut->setVisibility('0'); // keep the value that was previously set
|
||||
$this->assertEquals(VisibilityQuery::SHOW_HIDDEN, $sut->getVisibility());
|
||||
|
||||
$sut->setVisibility(VisibilityQuery::SHOW_BOTH);
|
||||
$this->assertEquals(VisibilityQuery::SHOW_BOTH, $sut->getVisibility());
|
||||
self::assertFalse($sut->isShowVisible());
|
||||
self::assertFalse($sut->isShowHidden());
|
||||
self::assertTrue($sut->isShowBoth());
|
||||
|
||||
$sut->setVisibility(VisibilityQuery::SHOW_HIDDEN);
|
||||
$this->assertEquals(VisibilityQuery::SHOW_HIDDEN, $sut->getVisibility());
|
||||
@@ -50,18 +59,27 @@ class VisibilityQueryTest extends TestCase
|
||||
$sut = new VisibilityTraitImpl();
|
||||
|
||||
$this->assertEquals(VisibilityInterface::SHOW_VISIBLE, $sut->getVisibility());
|
||||
self::assertTrue($sut->isShowVisible());
|
||||
self::assertFalse($sut->isShowHidden());
|
||||
self::assertFalse($sut->isShowBoth());
|
||||
|
||||
$sut->setVisibility('foo-bar');
|
||||
$this->assertEquals(VisibilityInterface::SHOW_VISIBLE, $sut->getVisibility());
|
||||
|
||||
$sut->setVisibility('2');
|
||||
$this->assertEquals(VisibilityInterface::SHOW_HIDDEN, $sut->getVisibility());
|
||||
self::assertFalse($sut->isShowVisible());
|
||||
self::assertTrue($sut->isShowHidden());
|
||||
self::assertFalse($sut->isShowBoth());
|
||||
|
||||
$sut->setVisibility('0'); // keep the value that was previously set
|
||||
$this->assertEquals(VisibilityInterface::SHOW_HIDDEN, $sut->getVisibility());
|
||||
|
||||
$sut->setVisibility(VisibilityInterface::SHOW_BOTH);
|
||||
$this->assertEquals(VisibilityInterface::SHOW_BOTH, $sut->getVisibility());
|
||||
self::assertFalse($sut->isShowVisible());
|
||||
self::assertFalse($sut->isShowHidden());
|
||||
self::assertTrue($sut->isShowBoth());
|
||||
|
||||
$sut->setVisibility(VisibilityInterface::SHOW_HIDDEN);
|
||||
$this->assertEquals(VisibilityInterface::SHOW_HIDDEN, $sut->getVisibility());
|
||||
|
||||
Reference in New Issue
Block a user