added toolbar to user screen #56 (#66)

* 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:
Kevin Papst
2018-01-09 17:15:07 +01:00
committed by GitHub
parent 56fca32845
commit 03896e3a1a
26 changed files with 684 additions and 96 deletions

View File

@@ -1,13 +1,16 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% import "macros/datatables.html.twig" as tables %} {% import "macros/datatables.html.twig" as tables %}
{% import "macros/widgets.html.twig" as widgets %} {% 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_title %}{{ 'admin_user.title'|trans }}{% endblock %}
{% block page_subtitle %}{{ 'admin_user.subtitle'|trans }} {{ 'subtitle.amount'|trans({'%count%': entries.count}) }}{% 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 %} {% block main %}
{% if entries.count > 0 %} {% if entries.count == 0 %}
{{ widgets.callout('warning', 'error.no_entries_found') }}
{% endif %}
{{ tables.data_table_header({ {{ tables.data_table_header({
'label.id': 'hidden-xs', 'label.id': 'hidden-xs',
'label.alias': '', 'label.alias': '',
@@ -17,7 +20,7 @@
'label.active': '', 'label.active': '',
'label.roles': '', 'label.roles': '',
'label.actions': '', 'label.actions': '',
}, null, {'plus-square': path('admin_user_create')}) }} }, toolbarForm, {'plus-square': path('admin_user_create')}) }}
{% for entry in entries %} {% for entry in entries %}
<tr> <tr>
@@ -42,7 +45,4 @@
{% endfor %} {% endfor %}
{{ tables.data_table_footer(entries, 'admin_user_paginated') }} {{ tables.data_table_footer(entries, 'admin_user_paginated') }}
{% else %}
{{ widgets.callout('warning', 'error.no_entries_found') }}
{% endif %}
{% endblock %} {% endblock %}

View File

@@ -70,8 +70,8 @@ services:
# ================================================================================ # ================================================================================
# form to edit user roles # form to edit user roles
app.admin.user_profile_roles: app.admin.user_role:
class: AppBundle\Form\UserRolesType class: AppBundle\Form\Type\UserRoleType
arguments: ["%security.role_hierarchy.roles%"] arguments: ["%security.role_hierarchy.roles%"]
tags: tags:
- { name: form.type } - { name: form.type }

View File

@@ -5,7 +5,8 @@
"description": "Kimai Time Tracking reloaded", "description": "Kimai Time Tracking reloaded",
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"": "src/" "": "src/",
"KimaiTest\\": "tests/"
}, },
"classmap": [ "classmap": [
"app/AppKernel.php", "app/AppKernel.php",

View File

@@ -13,6 +13,7 @@ namespace AppBundle\Controller\Admin;
use AppBundle\Controller\AbstractController; use AppBundle\Controller\AbstractController;
use AppBundle\Entity\User; use AppBundle\Entity\User;
use AppBundle\Form\Toolbar\UserToolbarForm;
use AppBundle\Form\UserCreateType; use AppBundle\Form\UserCreateType;
use AppBundle\Repository\Query\UserQuery; use AppBundle\Repository\Query\UserQuery;
use Pagerfanta\Pagerfanta; use Pagerfanta\Pagerfanta;
@@ -32,23 +33,49 @@ use Symfony\Component\HttpFoundation\Request;
*/ */
class UserController extends AbstractController 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("/", defaults={"page": 1}, name="admin_user")
* @Route("/page/{page}", requirements={"page": "[1-9]\d*"}, name="admin_user_paginated") * @Route("/page/{page}", requirements={"page": "[1-9]\d*"}, name="admin_user_paginated")
* @Method("GET") * @Method("GET")
* @Cache(smaxage="10")
* @Security("is_granted('view_all', user)") * @Security("is_granted('view_all', user)")
*/ */
public function indexAction($page) public function indexAction($page, Request $request)
{ {
$query = new UserQuery(); $query = $this->getQueryForRequest($request);
$query->setVisibility(UserQuery::SHOW_BOTH);
$query->setPage($page); $query->setPage($page);
/* @var $entries Pagerfanta */ /* @var $entries Pagerfanta */
$entries = $this->getDoctrine()->getRepository(User::class)->findByQuery($query); $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 * @param User $user
* @return \Symfony\Component\Form\FormInterface * @return \Symfony\Component\Form\FormInterface

View File

@@ -9,7 +9,7 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace TimesheetBundle\Form\Toolbar; namespace AppBundle\Form\Toolbar;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;

View File

@@ -9,7 +9,7 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace TimesheetBundle\Form\Toolbar; namespace AppBundle\Form\Toolbar;
use AppBundle\Form\Type\PageSizeType; use AppBundle\Form\Type\PageSizeType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;

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

View File

@@ -9,7 +9,7 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace TimesheetBundle\Form\Toolbar; namespace AppBundle\Form\Toolbar;
use AppBundle\Form\Type\VisibilityType; use AppBundle\Form\Type\VisibilityType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;

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

View File

@@ -12,8 +12,8 @@
namespace AppBundle\Form; namespace AppBundle\Form;
use AppBundle\Entity\User; use AppBundle\Entity\User;
use AppBundle\Form\Type\UserRoleType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -24,40 +24,16 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
*/ */
class UserRolesType extends AbstractType class UserRolesType extends AbstractType
{ {
/**
* @var string[]
*/
protected $roles = [];
/**
* UserRolesType constructor.
* @param string[] $roles
*/
public function __construct(array $roles)
{
$this->roles = $roles;
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function buildForm(FormBuilderInterface $builder, array $options) 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 $builder
// string[] // string[]
->add('roles', ChoiceType::class, [ ->add('roles', UserRoleType::class, [
'label' => 'label.roles', 'label' => 'label.roles',
'multiple' => true, 'multiple' => true,
'choices' => $roles,
]) ])
; ;
} }

View File

@@ -67,7 +67,7 @@ class BaseQuery
*/ */
public function setPage($page) public function setPage($page)
{ {
$this->page = $page; $this->page = (int)$page;
return $this; return $this;
} }

View File

@@ -19,4 +19,29 @@ namespace AppBundle\Repository\Query;
class UserQuery extends BaseQuery implements VisibilityInterface class UserQuery extends BaseQuery implements VisibilityInterface
{ {
use VisibilityTrait; 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;
}
} }

View File

@@ -21,4 +21,26 @@ interface VisibilityInterface
const SHOW_VISIBLE = 1; const SHOW_VISIBLE = 1;
const SHOW_HIDDEN = 0; const SHOW_HIDDEN = 0;
const SHOW_BOTH = 2; 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);
} }

View File

@@ -41,7 +41,7 @@ trait VisibilityTrait
*/ */
public function setVisibility($visibility) 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; $this->visibility = $visibility;
} }
return $this; return $this;

View File

@@ -57,10 +57,14 @@ class UserRepository extends AbstractRepository
->from('AppBundle:User', 'u') ->from('AppBundle:User', 'u')
->orderBy('u.' . $query->getOrderBy(), $query->getOrder()); ->orderBy('u.' . $query->getOrderBy(), $query->getOrder());
if ($query->getVisibility() === UserQuery::SHOW_VISIBLE) { if ($query->getVisibility() == UserQuery::SHOW_VISIBLE) {
$qb->andWhere('u.visible = 1'); $qb->andWhere('u.active = 1');
} elseif ($query->getVisibility() === UserQuery::SHOW_HIDDEN) { } elseif ($query->getVisibility() == UserQuery::SHOW_HIDDEN) {
$qb->andWhere('u.visible = 0'); $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()); return $this->getPager($qb->getQuery(), $query->getPage(), $query->getPageSize());

View File

@@ -11,6 +11,7 @@
namespace TimesheetBundle\Form\Toolbar; namespace TimesheetBundle\Form\Toolbar;
use AppBundle\Form\Toolbar\VisibilityToolbarForm;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use TimesheetBundle\Repository\Query\CustomerQuery; use TimesheetBundle\Repository\Query\CustomerQuery;

View File

@@ -11,6 +11,7 @@
namespace TimesheetBundle\Form\Toolbar; namespace TimesheetBundle\Form\Toolbar;
use AppBundle\Form\Toolbar\VisibilityToolbarForm;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use TimesheetBundle\Form\Type\CustomerType; use TimesheetBundle\Form\Type\CustomerType;

View File

@@ -153,7 +153,7 @@ class TimesheetQuery extends BaseQuery
*/ */
public function setState($state) 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; $this->state = $state;
} }
return $this; return $this;

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

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

View File

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

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

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

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

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

View File

@@ -11,32 +11,91 @@
namespace KimaiTest\TimesheetBundle\Repository\Query; namespace KimaiTest\TimesheetBundle\Repository\Query;
use AppBundle\Repository\Query\BaseQuery; use AppBundle\Entity\User;
use \PHPUnit\Framework\TestCase; use KimaiTest\AppBundle\Repository\Query\BaseQueryTest;
use TimesheetBundle\Entity\Activity;
use TimesheetBundle\Entity\Customer;
use TimesheetBundle\Entity\Project;
use TimesheetBundle\Repository\Query\TimesheetQuery; use TimesheetBundle\Repository\Query\TimesheetQuery;
/** /**
* @covers \TimesheetBundle\Repository\Query\TimesheetQuery * @covers \TimesheetBundle\Repository\Query\TimesheetQuery
* @author Kevin Papst <kevin@kevinpapst.de> * @author Kevin Papst <kevin@kevinpapst.de>
*/ */
class TimesheetQueryTest extends TestCase class TimesheetQueryTest extends BaseQueryTest
{ {
public function testQuery()
public function testSetOrder()
{ {
$class = new \ReflectionClass(new BaseQuery());
$this->assertTrue($class->hasProperty('order'));
$this->assertTrue($class->hasProperty('orderBy'));
$sut = new TimesheetQuery(); $sut = new TimesheetQuery();
$this->assertEquals(TimesheetQuery::ORDER_DESC, $sut->getOrder()); $this->assertResultType($sut);
$this->assertEquals('begin', $sut->getOrderBy()); $this->assertHiddenEntity($sut);
$this->assertPage($sut);
$this->assertPageSize($sut);
$this->assertOrderBy($sut, 'begin');
$this->assertOrder($sut, TimesheetQuery::ORDER_DESC);
$sut->setOrder(TimesheetQuery::ORDER_ASC); $this->assertUser($sut);
$sut->setOrderBy('id'); $this->assertCustomer($sut);
$this->assertProject($sut);
$this->assertActivity($sut);
$this->assertState($sut);
}
$this->assertEquals(TimesheetQuery::ORDER_ASC, $sut->getOrder()); protected function assertUser(TimesheetQuery $sut)
$this->assertEquals('id', $sut->getOrderBy()); {
$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());
} }
} }