mirror of
https://github.com/kevinpapst/kimai2.git
synced 2025-03-16 14:03:30 +00:00
* added toolbar to user screen # 56 * added filter for user role in user admin toolbar # 56 * added unit tests for queries # 56
This commit is contained in:
parent
56fca32845
commit
03896e3a1a
26 changed files with 684 additions and 96 deletions
app
composer.jsonsrc
tests
AppBundle/Repository/Query
TimesheetBundle/Repository/Query
|
@ -1,48 +1,48 @@
|
|||
{% extends 'base.html.twig' %}
|
||||
{% import "macros/datatables.html.twig" as tables %}
|
||||
{% import "macros/widgets.html.twig" as widgets %}
|
||||
{% import "AvanzuAdminThemeBundle:layout:macros.html.twig" as macro %}
|
||||
|
||||
{% block page_title %}{{ 'admin_user.title'|trans }}{% endblock %}
|
||||
{% block page_subtitle %}{{ 'admin_user.subtitle'|trans }} {{ 'subtitle.amount'|trans({'%count%': entries.count}) }}{% endblock %}
|
||||
{% block javascript_imports %}<script src="{{ asset('js/toolbar.js') }}"></script>{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
{% if entries.count > 0 %}
|
||||
{{ tables.data_table_header({
|
||||
'label.id': 'hidden-xs',
|
||||
'label.alias': '',
|
||||
'label.username': 'hidden-xs',
|
||||
'label.email': 'hidden-xs hidden-sm',
|
||||
'label.title': 'hidden-xs',
|
||||
'label.active': '',
|
||||
'label.roles': '',
|
||||
'label.actions': '',
|
||||
}, null, {'plus-square': path('admin_user_create')}) }}
|
||||
|
||||
{% for entry in entries %}
|
||||
<tr>
|
||||
<td class="hidden-xs">{{ entry.id }}</td>
|
||||
<td>{{ widgets.username(entry) }}</td>
|
||||
<td class="hidden-xs">{{ entry.username }}</td>
|
||||
<td class="hidden-xs hidden-sm">{{ entry.email }}</td>
|
||||
<td class="hidden-xs">{{ entry.title }}</td>
|
||||
<td>{{ widgets.label_visible(entry.active) }}</td>
|
||||
<td>
|
||||
{% for role in entry.roles %}
|
||||
{{ widgets.label_role(role) }}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>
|
||||
{{ widgets.button_group({
|
||||
'edit': path('user_profile', {'username' : entry.username}),
|
||||
'trash': path('user_profile_delete', {'username' : entry.username})
|
||||
}) }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
{{ tables.data_table_footer(entries, 'admin_user_paginated') }}
|
||||
{% else %}
|
||||
{% if entries.count == 0 %}
|
||||
{{ widgets.callout('warning', 'error.no_entries_found') }}
|
||||
{% endif %}
|
||||
|
||||
{{ tables.data_table_header({
|
||||
'label.id': 'hidden-xs',
|
||||
'label.alias': '',
|
||||
'label.username': 'hidden-xs',
|
||||
'label.email': 'hidden-xs hidden-sm',
|
||||
'label.title': 'hidden-xs',
|
||||
'label.active': '',
|
||||
'label.roles': '',
|
||||
'label.actions': '',
|
||||
}, toolbarForm, {'plus-square': path('admin_user_create')}) }}
|
||||
|
||||
{% for entry in entries %}
|
||||
<tr>
|
||||
<td class="hidden-xs">{{ entry.id }}</td>
|
||||
<td>{{ widgets.username(entry) }}</td>
|
||||
<td class="hidden-xs">{{ entry.username }}</td>
|
||||
<td class="hidden-xs hidden-sm">{{ entry.email }}</td>
|
||||
<td class="hidden-xs">{{ entry.title }}</td>
|
||||
<td>{{ widgets.label_visible(entry.active) }}</td>
|
||||
<td>
|
||||
{% for role in entry.roles %}
|
||||
{{ widgets.label_role(role) }}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>
|
||||
{{ widgets.button_group({
|
||||
'edit': path('user_profile', {'username' : entry.username}),
|
||||
'trash': path('user_profile_delete', {'username' : entry.username})
|
||||
}) }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
{{ tables.data_table_footer(entries, 'admin_user_paginated') }}
|
||||
{% endblock %}
|
||||
|
|
|
@ -70,8 +70,8 @@ services:
|
|||
# ================================================================================
|
||||
|
||||
# form to edit user roles
|
||||
app.admin.user_profile_roles:
|
||||
class: AppBundle\Form\UserRolesType
|
||||
app.admin.user_role:
|
||||
class: AppBundle\Form\Type\UserRoleType
|
||||
arguments: ["%security.role_hierarchy.roles%"]
|
||||
tags:
|
||||
- { name: form.type }
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
"description": "Kimai Time Tracking reloaded",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"": "src/"
|
||||
"": "src/",
|
||||
"KimaiTest\\": "tests/"
|
||||
},
|
||||
"classmap": [
|
||||
"app/AppKernel.php",
|
||||
|
|
|
@ -13,6 +13,7 @@ namespace AppBundle\Controller\Admin;
|
|||
|
||||
use AppBundle\Controller\AbstractController;
|
||||
use AppBundle\Entity\User;
|
||||
use AppBundle\Form\Toolbar\UserToolbarForm;
|
||||
use AppBundle\Form\UserCreateType;
|
||||
use AppBundle\Repository\Query\UserQuery;
|
||||
use Pagerfanta\Pagerfanta;
|
||||
|
@ -32,23 +33,49 @@ use Symfony\Component\HttpFoundation\Request;
|
|||
*/
|
||||
class UserController extends AbstractController
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return UserQuery
|
||||
*/
|
||||
protected function getQueryForRequest(Request $request)
|
||||
{
|
||||
$visibility = $request->get('visibility', UserQuery::SHOW_VISIBLE);
|
||||
if (strlen($visibility) == 0 || (int)$visibility != $visibility) {
|
||||
$visibility = UserQuery::SHOW_BOTH;
|
||||
}
|
||||
$pageSize = (int) $request->get('pageSize');
|
||||
$userRole = $request->get('role');
|
||||
|
||||
$query = new UserQuery();
|
||||
$query
|
||||
->setPageSize($pageSize)
|
||||
->setVisibility($visibility)
|
||||
->setRole($userRole)
|
||||
;
|
||||
|
||||
return $query ;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/", defaults={"page": 1}, name="admin_user")
|
||||
* @Route("/page/{page}", requirements={"page": "[1-9]\d*"}, name="admin_user_paginated")
|
||||
* @Method("GET")
|
||||
* @Cache(smaxage="10")
|
||||
* @Security("is_granted('view_all', user)")
|
||||
*/
|
||||
public function indexAction($page)
|
||||
public function indexAction($page, Request $request)
|
||||
{
|
||||
$query = new UserQuery();
|
||||
$query->setVisibility(UserQuery::SHOW_BOTH);
|
||||
$query = $this->getQueryForRequest($request);
|
||||
$query->setPage($page);
|
||||
|
||||
/* @var $entries Pagerfanta */
|
||||
$entries = $this->getDoctrine()->getRepository(User::class)->findByQuery($query);
|
||||
|
||||
return $this->render('admin/user.html.twig', ['entries' => $entries]);
|
||||
return $this->render('admin/user.html.twig', [
|
||||
'entries' => $entries,
|
||||
'query' => $query,
|
||||
'toolbarForm' => $this->getToolbarForm($query)->createView(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -87,6 +114,24 @@ class UserController extends AbstractController
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param UserQuery $query
|
||||
* @return \Symfony\Component\Form\FormInterface
|
||||
*/
|
||||
protected function getToolbarForm(UserQuery $query)
|
||||
{
|
||||
return $this->createForm(
|
||||
UserToolbarForm::class,
|
||||
$query,
|
||||
[
|
||||
'action' => $this->generateUrl('admin_user_paginated', [
|
||||
'page' => $query->getPage(),
|
||||
]),
|
||||
'method' => 'GET',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param User $user
|
||||
* @return \Symfony\Component\Form\FormInterface
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace TimesheetBundle\Form\Toolbar;
|
||||
namespace AppBundle\Form\Toolbar;
|
||||
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace TimesheetBundle\Form\Toolbar;
|
||||
namespace AppBundle\Form\Toolbar;
|
||||
|
||||
use AppBundle\Form\Type\PageSizeType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
51
src/AppBundle/Form/Toolbar/UserToolbarForm.php
Normal file
51
src/AppBundle/Form/Toolbar/UserToolbarForm.php
Normal file
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace AppBundle\Form\Toolbar;
|
||||
|
||||
use AppBundle\Form\Type\UserRoleType;
|
||||
use AppBundle\Repository\Query\UserQuery;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering the user.
|
||||
*
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class UserToolbarForm extends VisibilityToolbarForm
|
||||
{
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
parent::buildForm($builder, $options);
|
||||
|
||||
$builder
|
||||
->add('role', UserRoleType::class, [
|
||||
'required' => false,
|
||||
])
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'data_class' => UserQuery::class,
|
||||
'csrf_protection' => false,
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -9,7 +9,7 @@
|
|||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace TimesheetBundle\Form\Toolbar;
|
||||
namespace AppBundle\Form\Toolbar;
|
||||
|
||||
use AppBundle\Form\Type\VisibilityType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
67
src/AppBundle/Form/Type/UserRoleType.php
Normal file
67
src/AppBundle/Form/Type/UserRoleType.php
Normal file
|
@ -0,0 +1,67 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace AppBundle\Form\Type;
|
||||
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select a user role.
|
||||
*
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class UserRoleType extends AbstractType
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
protected $roles = [];
|
||||
|
||||
/**
|
||||
* UserRolesType constructor.
|
||||
* @param string[] $roles
|
||||
*/
|
||||
public function __construct(array $roles)
|
||||
{
|
||||
$this->roles = $roles;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$roles = [];
|
||||
|
||||
foreach ($this->roles as $key => $value) {
|
||||
$roles[$key] = $key;
|
||||
foreach ($value as $value2) {
|
||||
$roles[$value2] = $value2;
|
||||
}
|
||||
}
|
||||
|
||||
$resolver->setDefaults([
|
||||
'label' => 'label.roles',
|
||||
'choices' => $roles,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
return ChoiceType::class;
|
||||
}
|
||||
}
|
|
@ -12,8 +12,8 @@
|
|||
namespace AppBundle\Form;
|
||||
|
||||
use AppBundle\Entity\User;
|
||||
use AppBundle\Form\Type\UserRoleType;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
|
@ -24,40 +24,16 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
|||
*/
|
||||
class UserRolesType extends AbstractType
|
||||
{
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
protected $roles = [];
|
||||
|
||||
/**
|
||||
* UserRolesType constructor.
|
||||
* @param string[] $roles
|
||||
*/
|
||||
public function __construct(array $roles)
|
||||
{
|
||||
$this->roles = $roles;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$roles = [];
|
||||
|
||||
foreach ($this->roles as $key => $value) {
|
||||
$roles[$key] = $key;
|
||||
foreach ($value as $value2) {
|
||||
$roles[$value2] = $value2;
|
||||
}
|
||||
}
|
||||
|
||||
$builder
|
||||
// string[]
|
||||
->add('roles', ChoiceType::class, [
|
||||
->add('roles', UserRoleType::class, [
|
||||
'label' => 'label.roles',
|
||||
'multiple' => true,
|
||||
'choices' => $roles,
|
||||
])
|
||||
;
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ class BaseQuery
|
|||
*/
|
||||
public function setPage($page)
|
||||
{
|
||||
$this->page = $page;
|
||||
$this->page = (int)$page;
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,4 +19,29 @@ namespace AppBundle\Repository\Query;
|
|||
class UserQuery extends BaseQuery implements VisibilityInterface
|
||||
{
|
||||
use VisibilityTrait;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $role;
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getRole()
|
||||
{
|
||||
return $this->role;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $role
|
||||
* @return UserQuery
|
||||
*/
|
||||
public function setRole($role)
|
||||
{
|
||||
if (strpos($role, 'ROLE_') !== false || $role === null) {
|
||||
$this->role = $role;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,4 +21,26 @@ interface VisibilityInterface
|
|||
const SHOW_VISIBLE = 1;
|
||||
const SHOW_HIDDEN = 0;
|
||||
const SHOW_BOTH = 2;
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function getVisibility();
|
||||
|
||||
/**
|
||||
* @param int $visibility
|
||||
* @return $this
|
||||
*/
|
||||
public function setVisibility($visibility);
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isExclusiveVisibility();
|
||||
|
||||
/**
|
||||
* @param bool $exclusiveVisibility
|
||||
* @return $this
|
||||
*/
|
||||
public function setExclusiveVisibility($exclusiveVisibility);
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ trait VisibilityTrait
|
|||
*/
|
||||
public function setVisibility($visibility)
|
||||
{
|
||||
if (in_array($visibility, [self::SHOW_BOTH, self::SHOW_VISIBLE, self::SHOW_HIDDEN])) {
|
||||
if (in_array($visibility, [self::SHOW_BOTH, self::SHOW_VISIBLE, self::SHOW_HIDDEN], true)) {
|
||||
$this->visibility = $visibility;
|
||||
}
|
||||
return $this;
|
||||
|
|
|
@ -57,10 +57,14 @@ class UserRepository extends AbstractRepository
|
|||
->from('AppBundle:User', 'u')
|
||||
->orderBy('u.' . $query->getOrderBy(), $query->getOrder());
|
||||
|
||||
if ($query->getVisibility() === UserQuery::SHOW_VISIBLE) {
|
||||
$qb->andWhere('u.visible = 1');
|
||||
} elseif ($query->getVisibility() === UserQuery::SHOW_HIDDEN) {
|
||||
$qb->andWhere('u.visible = 0');
|
||||
if ($query->getVisibility() == UserQuery::SHOW_VISIBLE) {
|
||||
$qb->andWhere('u.active = 1');
|
||||
} elseif ($query->getVisibility() == UserQuery::SHOW_HIDDEN) {
|
||||
$qb->andWhere('u.active = 0');
|
||||
}
|
||||
|
||||
if ($query->getRole() !== null) {
|
||||
$qb->andWhere('u.roles LIKE :role')->setParameter('role', '%' . $query->getRole() . '%');
|
||||
}
|
||||
|
||||
return $this->getPager($qb->getQuery(), $query->getPage(), $query->getPageSize());
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
namespace TimesheetBundle\Form\Toolbar;
|
||||
|
||||
use AppBundle\Form\Toolbar\VisibilityToolbarForm;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use TimesheetBundle\Repository\Query\CustomerQuery;
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
namespace TimesheetBundle\Form\Toolbar;
|
||||
|
||||
use AppBundle\Form\Toolbar\VisibilityToolbarForm;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use TimesheetBundle\Form\Type\CustomerType;
|
||||
|
|
|
@ -153,7 +153,7 @@ class TimesheetQuery extends BaseQuery
|
|||
*/
|
||||
public function setState($state)
|
||||
{
|
||||
if (in_array($state, [self::STATE_ALL, self::STATE_RUNNING, self::STATE_STOPPED])) {
|
||||
if (in_array($state, [self::STATE_ALL, self::STATE_RUNNING, self::STATE_STOPPED], true)) {
|
||||
$this->state = $state;
|
||||
}
|
||||
return $this;
|
||||
|
|
99
tests/AppBundle/Repository/Query/BaseQueryTest.php
Normal file
99
tests/AppBundle/Repository/Query/BaseQueryTest.php
Normal file
|
@ -0,0 +1,99 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace KimaiTest\AppBundle\Repository\Query;
|
||||
|
||||
use AppBundle\Entity\User;
|
||||
use AppBundle\Repository\Query\BaseQuery;
|
||||
use \PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @covers \AppBundle\Repository\Query\BaseQuery
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class BaseQueryTest extends TestCase
|
||||
{
|
||||
|
||||
public function testQuery()
|
||||
{
|
||||
$this->assertBaseQuery(new BaseQuery());
|
||||
}
|
||||
|
||||
protected function assertBaseQuery(BaseQuery $sut)
|
||||
{
|
||||
$this->assertResultType($sut);
|
||||
$this->assertHiddenEntity($sut);
|
||||
$this->assertPage($sut);
|
||||
$this->assertPageSize($sut);
|
||||
$this->assertOrderBy($sut);
|
||||
$this->assertOrder($sut);
|
||||
}
|
||||
|
||||
protected function assertResultType(BaseQuery $sut)
|
||||
{
|
||||
$this->assertEquals(BaseQuery::RESULT_TYPE_PAGER, $sut->getResultType());
|
||||
|
||||
$sut->setResultType('foo-bar');
|
||||
$this->assertEquals(BaseQuery::RESULT_TYPE_PAGER, $sut->getResultType());
|
||||
|
||||
$sut->setResultType(BaseQuery::RESULT_TYPE_QUERYBUILDER);
|
||||
$this->assertEquals(BaseQuery::RESULT_TYPE_QUERYBUILDER, $sut->getResultType());
|
||||
}
|
||||
|
||||
protected function assertHiddenEntity(BaseQuery $sut)
|
||||
{
|
||||
$this->assertNull($sut->getHiddenEntity());
|
||||
|
||||
$actual = new User();
|
||||
$actual->setUsername('foo-bar');
|
||||
|
||||
$sut->setHiddenEntity($actual);
|
||||
$this->assertEquals($actual, $sut->getHiddenEntity());
|
||||
}
|
||||
|
||||
protected function assertPage(BaseQuery $sut)
|
||||
{
|
||||
$this->assertEquals(BaseQuery::DEFAULT_PAGE, $sut->getPage());
|
||||
|
||||
$sut->setPage(42);
|
||||
$this->assertEquals(42, $sut->getPage());
|
||||
}
|
||||
|
||||
protected function assertPageSize(BaseQuery $sut)
|
||||
{
|
||||
$this->assertEquals(BaseQuery::DEFAULT_PAGESIZE, $sut->getPageSize());
|
||||
|
||||
$sut->setPageSize(100);
|
||||
$this->assertEquals(100, $sut->getPageSize());
|
||||
}
|
||||
|
||||
protected function assertOrderBy(BaseQuery $sut, $column = 'id')
|
||||
{
|
||||
$this->assertEquals($column, $sut->getOrderBy());
|
||||
|
||||
$sut->setOrderBy('foo');
|
||||
$this->assertEquals('foo', $sut->getOrderBy());
|
||||
}
|
||||
|
||||
protected function assertOrder(BaseQuery $sut, $order = BaseQuery::ORDER_ASC)
|
||||
{
|
||||
$this->assertEquals($order, $sut->getOrder());
|
||||
|
||||
$sut->setOrder('foo');
|
||||
$this->assertEquals($order, $sut->getOrder());
|
||||
|
||||
$sut->setOrder(BaseQuery::ORDER_ASC);
|
||||
$this->assertEquals(BaseQuery::ORDER_ASC, $sut->getOrder());
|
||||
|
||||
$sut->setOrder(BaseQuery::ORDER_DESC);
|
||||
$this->assertEquals(BaseQuery::ORDER_DESC, $sut->getOrder());
|
||||
}
|
||||
}
|
43
tests/AppBundle/Repository/Query/UserQueryTest.php
Normal file
43
tests/AppBundle/Repository/Query/UserQueryTest.php
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace KimaiTest\AppBundle\Repository\Query;
|
||||
|
||||
use AppBundle\Repository\Query\UserQuery;
|
||||
use AppBundle\Repository\Query\VisibilityInterface;
|
||||
use AppBundle\Repository\Query\VisibilityTrait;
|
||||
|
||||
/**
|
||||
* @covers \AppBundle\Repository\Query\UserQuery
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class UserQueryTest extends BaseQueryTest
|
||||
{
|
||||
public function testQuery()
|
||||
{
|
||||
$sut = new UserQuery();
|
||||
$this->assertBaseQuery($sut);
|
||||
$this->assertInstanceOf(VisibilityInterface::class, $sut);
|
||||
$this->assertArrayHasKey(VisibilityTrait::class, class_uses($sut));
|
||||
$this->assertRole($sut);
|
||||
}
|
||||
|
||||
protected function assertRole(UserQuery $sut)
|
||||
{
|
||||
$this->assertNull($sut->getRole());
|
||||
|
||||
$sut->setRole('foo-bar');
|
||||
$this->assertNull($sut->getRole());
|
||||
|
||||
$sut->setRole('ROLE_USER');
|
||||
$this->assertEquals('ROLE_USER', $sut->getRole());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace KimaiTest\AppBundle\Repository\Query;
|
||||
|
||||
use AppBundle\Repository\Query\VisibilityInterface;
|
||||
use AppBundle\Repository\Query\VisibilityTrait;
|
||||
|
||||
/**
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class VisibilityTraitImplementation implements VisibilityInterface
|
||||
{
|
||||
use VisibilityTrait;
|
||||
}
|
46
tests/AppBundle/Repository/Query/VisibilityTraitTest.php
Normal file
46
tests/AppBundle/Repository/Query/VisibilityTraitTest.php
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace KimaiTest\AppBundle\Repository\Query;
|
||||
|
||||
use AppBundle\Repository\Query\VisibilityInterface;
|
||||
use AppBundle\Repository\Query\VisibilityTrait;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @covers \AppBundle\Repository\Query\VisibilityTrait
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class VisibilityTraitTest extends TestCase
|
||||
{
|
||||
public function testVisibilityTrait()
|
||||
{
|
||||
$sut = new VisibilityTraitImplementation();
|
||||
|
||||
$this->assertFalse($sut->isExclusiveVisibility());
|
||||
$this->assertEquals(VisibilityTraitImplementation::SHOW_VISIBLE, $sut->getVisibility());
|
||||
|
||||
$sut->setExclusiveVisibility(true);
|
||||
$this->assertTrue($sut->isExclusiveVisibility());
|
||||
|
||||
$sut->setVisibility('foo-bar');
|
||||
$this->assertEquals(VisibilityTraitImplementation::SHOW_VISIBLE, $sut->getVisibility());
|
||||
|
||||
$sut->setVisibility(VisibilityTraitImplementation::SHOW_BOTH);
|
||||
$this->assertEquals(VisibilityTraitImplementation::SHOW_BOTH, $sut->getVisibility());
|
||||
|
||||
$sut->setVisibility(VisibilityTraitImplementation::SHOW_HIDDEN);
|
||||
$this->assertEquals(VisibilityTraitImplementation::SHOW_HIDDEN, $sut->getVisibility());
|
||||
|
||||
$sut->setVisibility(VisibilityTraitImplementation::SHOW_VISIBLE);
|
||||
$this->assertEquals(VisibilityTraitImplementation::SHOW_VISIBLE, $sut->getVisibility());
|
||||
}
|
||||
}
|
50
tests/TimesheetBundle/Repository/Query/ActivityQueryTest.php
Normal file
50
tests/TimesheetBundle/Repository/Query/ActivityQueryTest.php
Normal file
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace KimaiTest\TimesheetBundle\Repository\Query;
|
||||
|
||||
use AppBundle\Repository\Query\VisibilityInterface;
|
||||
use AppBundle\Repository\Query\VisibilityTrait;
|
||||
use KimaiTest\AppBundle\Repository\Query\BaseQueryTest;
|
||||
use TimesheetBundle\Entity\Customer;
|
||||
use TimesheetBundle\Entity\Project;
|
||||
use TimesheetBundle\Repository\Query\ActivityQuery;
|
||||
|
||||
/**
|
||||
* @covers \TimesheetBundle\Repository\Query\ActivityQuery
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class ActivityQueryTest extends BaseQueryTest
|
||||
{
|
||||
public function testQuery()
|
||||
{
|
||||
$sut = new ActivityQuery();
|
||||
|
||||
$this->assertBaseQuery($sut);
|
||||
$this->assertInstanceOf(VisibilityInterface::class, $sut);
|
||||
$this->assertArrayHasKey(VisibilityTrait::class, class_uses($sut));
|
||||
|
||||
$this->assertNull($sut->getCustomer());
|
||||
$this->assertNull($sut->getProject());
|
||||
|
||||
$expected = new Customer();
|
||||
$expected->setName('foo-bar');
|
||||
$sut->setCustomer($expected);
|
||||
|
||||
$this->assertEquals($expected, $sut->getCustomer());
|
||||
|
||||
$expected = new Project();
|
||||
$expected->setName('foo-bar');
|
||||
$sut->setProject($expected);
|
||||
|
||||
$this->assertEquals($expected, $sut->getProject());
|
||||
}
|
||||
}
|
33
tests/TimesheetBundle/Repository/Query/CustomerQueryTest.php
Normal file
33
tests/TimesheetBundle/Repository/Query/CustomerQueryTest.php
Normal file
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace KimaiTest\TimesheetBundle\Repository\Query;
|
||||
|
||||
use AppBundle\Repository\Query\VisibilityInterface;
|
||||
use AppBundle\Repository\Query\VisibilityTrait;
|
||||
use KimaiTest\AppBundle\Repository\Query\BaseQueryTest;
|
||||
use TimesheetBundle\Repository\Query\CustomerQuery;
|
||||
|
||||
/**
|
||||
* @covers \TimesheetBundle\Repository\Query\CustomerQuery
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class CustomerQueryTest extends BaseQueryTest
|
||||
{
|
||||
public function testQuery()
|
||||
{
|
||||
$sut = new CustomerQuery();
|
||||
|
||||
$this->assertBaseQuery($sut);
|
||||
$this->assertInstanceOf(VisibilityInterface::class, $sut);
|
||||
$this->assertArrayHasKey(VisibilityTrait::class, class_uses($sut));
|
||||
}
|
||||
}
|
42
tests/TimesheetBundle/Repository/Query/ProjectQueryTest.php
Normal file
42
tests/TimesheetBundle/Repository/Query/ProjectQueryTest.php
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Kimai package.
|
||||
*
|
||||
* (c) Kevin Papst <kevin@kevinpapst.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace KimaiTest\TimesheetBundle\Repository\Query;
|
||||
|
||||
use AppBundle\Repository\Query\VisibilityInterface;
|
||||
use AppBundle\Repository\Query\VisibilityTrait;
|
||||
use KimaiTest\AppBundle\Repository\Query\BaseQueryTest;
|
||||
use TimesheetBundle\Entity\Customer;
|
||||
use TimesheetBundle\Repository\Query\ProjectQuery;
|
||||
|
||||
/**
|
||||
* @covers \TimesheetBundle\Repository\Query\ProjectQuery
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class ProjectQueryTest extends BaseQueryTest
|
||||
{
|
||||
public function testQuery()
|
||||
{
|
||||
$sut = new ProjectQuery();
|
||||
|
||||
$this->assertBaseQuery($sut);
|
||||
$this->assertInstanceOf(VisibilityInterface::class, $sut);
|
||||
$this->assertArrayHasKey(VisibilityTrait::class, class_uses($sut));
|
||||
|
||||
$this->assertNull($sut->getCustomer());
|
||||
|
||||
$expected = new Customer();
|
||||
$expected->setName('foo-bar');
|
||||
$sut->setCustomer($expected);
|
||||
|
||||
$this->assertEquals($expected, $sut->getCustomer());
|
||||
}
|
||||
}
|
|
@ -11,32 +11,91 @@
|
|||
|
||||
namespace KimaiTest\TimesheetBundle\Repository\Query;
|
||||
|
||||
use AppBundle\Repository\Query\BaseQuery;
|
||||
use \PHPUnit\Framework\TestCase;
|
||||
use AppBundle\Entity\User;
|
||||
use KimaiTest\AppBundle\Repository\Query\BaseQueryTest;
|
||||
use TimesheetBundle\Entity\Activity;
|
||||
use TimesheetBundle\Entity\Customer;
|
||||
use TimesheetBundle\Entity\Project;
|
||||
use TimesheetBundle\Repository\Query\TimesheetQuery;
|
||||
|
||||
/**
|
||||
* @covers \TimesheetBundle\Repository\Query\TimesheetQuery
|
||||
* @author Kevin Papst <kevin@kevinpapst.de>
|
||||
*/
|
||||
class TimesheetQueryTest extends TestCase
|
||||
class TimesheetQueryTest extends BaseQueryTest
|
||||
{
|
||||
|
||||
public function testSetOrder()
|
||||
public function testQuery()
|
||||
{
|
||||
$class = new \ReflectionClass(new BaseQuery());
|
||||
$this->assertTrue($class->hasProperty('order'));
|
||||
$this->assertTrue($class->hasProperty('orderBy'));
|
||||
|
||||
$sut = new TimesheetQuery();
|
||||
|
||||
$this->assertEquals(TimesheetQuery::ORDER_DESC, $sut->getOrder());
|
||||
$this->assertEquals('begin', $sut->getOrderBy());
|
||||
$this->assertResultType($sut);
|
||||
$this->assertHiddenEntity($sut);
|
||||
$this->assertPage($sut);
|
||||
$this->assertPageSize($sut);
|
||||
$this->assertOrderBy($sut, 'begin');
|
||||
$this->assertOrder($sut, TimesheetQuery::ORDER_DESC);
|
||||
|
||||
$sut->setOrder(TimesheetQuery::ORDER_ASC);
|
||||
$sut->setOrderBy('id');
|
||||
$this->assertUser($sut);
|
||||
$this->assertCustomer($sut);
|
||||
$this->assertProject($sut);
|
||||
$this->assertActivity($sut);
|
||||
$this->assertState($sut);
|
||||
}
|
||||
|
||||
$this->assertEquals(TimesheetQuery::ORDER_ASC, $sut->getOrder());
|
||||
$this->assertEquals('id', $sut->getOrderBy());
|
||||
protected function assertUser(TimesheetQuery $sut)
|
||||
{
|
||||
$this->assertNull($sut->getUser());
|
||||
|
||||
$expected = new User();
|
||||
$expected->setUsername('foo-bar');
|
||||
$sut->setUser($expected);
|
||||
$this->assertEquals($expected, $sut->getUser());
|
||||
}
|
||||
|
||||
protected function assertCustomer(TimesheetQuery $sut)
|
||||
{
|
||||
$this->assertNull($sut->getCustomer());
|
||||
|
||||
$expected = new Customer();
|
||||
$expected->setName('foo-bar');
|
||||
$sut->setCustomer($expected);
|
||||
$this->assertEquals($expected, $sut->getCustomer());
|
||||
}
|
||||
|
||||
protected function assertProject(TimesheetQuery $sut)
|
||||
{
|
||||
$this->assertNull($sut->getProject());
|
||||
|
||||
$expected = new Project();
|
||||
$expected->setName('foo-bar');
|
||||
$sut->setProject($expected);
|
||||
$this->assertEquals($expected, $sut->getProject());
|
||||
}
|
||||
|
||||
protected function assertActivity(TimesheetQuery $sut)
|
||||
{
|
||||
$this->assertNull($sut->getActivity());
|
||||
|
||||
$expected = new Activity();
|
||||
$expected->setName('foo-bar');
|
||||
$sut->setActivity($expected);
|
||||
$this->assertEquals($expected, $sut->getActivity());
|
||||
}
|
||||
|
||||
protected function assertState(TimesheetQuery $sut)
|
||||
{
|
||||
$this->assertEquals(TimesheetQuery::STATE_ALL, $sut->getState());
|
||||
|
||||
$sut->setState('foo-bar');
|
||||
$this->assertEquals(TimesheetQuery::STATE_ALL, $sut->getState());
|
||||
|
||||
$sut->setState(TimesheetQuery::STATE_STOPPED);
|
||||
$this->assertEquals(TimesheetQuery::STATE_STOPPED, $sut->getState());
|
||||
|
||||
$sut->setState(TimesheetQuery::STATE_RUNNING);
|
||||
$this->assertEquals(TimesheetQuery::STATE_RUNNING, $sut->getState());
|
||||
|
||||
$sut->setState(TimesheetQuery::STATE_ALL);
|
||||
$this->assertEquals(TimesheetQuery::STATE_ALL, $sut->getState());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue