fix phpunit annotations (#794)

This commit is contained in:
Kevin Papst
2019-05-19 17:05:07 +02:00
committed by GitHub
parent d2ad87d09c
commit 46ff78a4c4
34 changed files with 230 additions and 109 deletions

View File

@@ -10,6 +10,9 @@
namespace App\Form; namespace App\Form;
use App\Configuration\TimesheetConfiguration; use App\Configuration\TimesheetConfiguration;
use App\Entity\Activity;
use App\Entity\Customer;
use App\Entity\Project;
use App\Entity\Timesheet; use App\Entity\Timesheet;
use App\Form\Type\ActivityType; use App\Form\Type\ActivityType;
use App\Form\Type\CustomerType; use App\Form\Type\CustomerType;
@@ -80,6 +83,7 @@ class TimesheetEditForm extends AbstractType
$end = null; $end = null;
$begin = null; $begin = null;
$customerCount = $this->customers->countCustomer(true); $customerCount = $this->customers->countCustomer(true);
$projectCount = $this->projects->countProject(true);
$isNew = true; $isNew = true;
if (isset($options['data'])) { if (isset($options['data'])) {
@@ -123,51 +127,13 @@ class TimesheetEditForm extends AbstractType
} }
if ($isNew || null === $end || !$this->configuration->isDurationOnly()) { if ($isNew || null === $end || !$this->configuration->isDurationOnly()) {
$builder->add('begin', DateTimePickerType::class, array_merge($dateTimeOptions, [ $this->addBegin($builder, $dateTimeOptions);
'label' => 'label.begin'
]));
} }
if ($this->configuration->isDurationOnly()) { if ($this->configuration->isDurationOnly()) {
$builder->add('duration', DurationType::class, [ $this->addDuration($builder);
'required' => false,
'docu_chapter' => 'timesheet.html#duration-format',
'attr' => [
'placeholder' => '00:00',
]
]);
$builder->addEventListener(
FormEvents::POST_SET_DATA,
function (FormEvent $event) {
/** @var Timesheet $data */
$data = $event->getData();
if (null === $data || null === $data->getEnd()) {
$event->getForm()->get('duration')->setData(null);
}
}
);
// make sure that duration is mapped back to end field
$builder->addEventListener(
FormEvents::SUBMIT,
function (FormEvent $event) {
/** @var Timesheet $data */
$data = $event->getData();
$duration = $data->getDuration();
$end = null;
if (null !== $duration) {
$end = clone $data->getBegin();
$end->modify('+ ' . $duration . 'seconds');
}
$data->setEnd($end);
}
);
} else { } else {
$builder->add('end', DateTimePickerType::class, array_merge($dateTimeOptions, [ $this->addEnd($builder, $dateTimeOptions);
'label' => 'label.end',
'required' => false,
]));
} }
$projectOptions = []; $projectOptions = [];
@@ -175,35 +141,60 @@ class TimesheetEditForm extends AbstractType
if ($customerCount < 2) { if ($customerCount < 2) {
$projectOptions['group_by'] = null; $projectOptions['group_by'] = null;
} elseif ($options['customer']) { } elseif ($options['customer']) {
$builder $this->addCustomer($builder, $customer);
->add('customer', CustomerType::class, [
'query_builder' => function (CustomerRepository $repo) use ($customer) {
return $repo->builderForEntityType($customer);
},
'data' => $customer ? $customer : '',
'required' => false,
'placeholder' => null === $customer ? '' : null,
'mapped' => false,
'project_enabled' => true,
]);
} }
if ($this->projects->countProject(true) <= 1) { if ($projectCount <= 1) {
$projectOptions['group_by'] = null; $projectOptions['group_by'] = null;
} }
$this->addProject($builder, $projectOptions, $project, $customer);
$this->addActivity($builder, $activity, $project);
$this->addDescription($builder);
$this->addTags($builder);
if ($options['include_rate']) {
$this->addRates($builder, $currency);
}
if ($options['include_user']) {
$this->addUser($builder);
}
if ($options['include_exported']) {
$this->addExported($builder);
}
}
protected function addCustomer(FormBuilderInterface $builder, ?Customer $customer = null)
{
$builder
->add('customer', CustomerType::class, [
'query_builder' => function (CustomerRepository $repo) use ($customer) {
return $repo->builderForEntityType($customer);
},
'data' => $customer ? $customer : '',
'required' => false,
'placeholder' => null === $customer ? '' : null,
'mapped' => false,
'project_enabled' => true,
]);
}
protected function addProject(FormBuilderInterface $builder, array $projectOptions, ?Project $project = null, ?Customer $customer = null)
{
$builder $builder
->add( ->add(
'project', 'project',
ProjectType::class, ProjectType::class,
array_merge($projectOptions, [ array_merge($projectOptions, [
'placeholder' => '', 'placeholder' => '',
'activity_enabled' => true, 'activity_enabled' => true,
'query_builder' => function (ProjectRepository $repo) use ($project, $customer) { 'query_builder' => function (ProjectRepository $repo) use ($project, $customer) {
return $repo->builderForEntityType($project, $customer); return $repo->builderForEntityType($project, $customer);
}, },
]) ])
); );
// replaces the project select after submission, to make sure only projects for the selected customer are displayed // replaces the project select after submission, to make sure only projects for the selected customer are displayed
$builder->addEventListener( $builder->addEventListener(
@@ -224,7 +215,10 @@ class TimesheetEditForm extends AbstractType
]); ]);
} }
); );
}
protected function addActivity(FormBuilderInterface $builder, ?Activity $activity = null, ?Project $project = null)
{
$builder $builder
->add('activity', ActivityType::class, [ ->add('activity', ActivityType::class, [
'placeholder' => '', 'placeholder' => '',
@@ -251,13 +245,72 @@ class TimesheetEditForm extends AbstractType
]); ]);
} }
); );
}
protected function addBegin(FormBuilderInterface $builder, array $dateTimeOptions)
{
$builder->add('begin', DateTimePickerType::class, array_merge($dateTimeOptions, [
'label' => 'label.begin'
]));
}
protected function addEnd(FormBuilderInterface $builder, array $dateTimeOptions)
{
$builder->add('end', DateTimePickerType::class, array_merge($dateTimeOptions, [
'label' => 'label.end',
'required' => false,
]));
}
protected function addDuration(FormBuilderInterface $builder)
{
$builder->add('duration', DurationType::class, [
'required' => false,
'docu_chapter' => 'timesheet.html#duration-format',
'attr' => [
'placeholder' => '00:00',
]
]);
$builder->addEventListener(
FormEvents::POST_SET_DATA,
function (FormEvent $event) {
/** @var Timesheet $data */
$data = $event->getData();
if (null === $data || null === $data->getEnd()) {
$event->getForm()->get('duration')->setData(null);
}
}
);
// make sure that duration is mapped back to end field
$builder->addEventListener(
FormEvents::SUBMIT,
function (FormEvent $event) {
/** @var Timesheet $data */
$data = $event->getData();
$duration = $data->getDuration();
$end = null;
if (null !== $duration) {
$end = clone $data->getBegin();
$end->modify('+ ' . $duration . 'seconds');
}
$data->setEnd($end);
}
);
}
protected function addDescription(FormBuilderInterface $builder)
{
$builder $builder
->add('description', TextareaType::class, [ ->add('description', TextareaType::class, [
'label' => 'label.description', 'label' => 'label.description',
'required' => false, 'required' => false,
]); ]);
}
protected function addTags(FormBuilderInterface $builder)
{
$builder $builder
->add('tags', TagsInputType::class, [ ->add('tags', TagsInputType::class, [
// documentation is for NelmioApiDocBundle // documentation is for NelmioApiDocBundle
@@ -267,26 +320,29 @@ class TimesheetEditForm extends AbstractType
], ],
'required' => false, 'required' => false,
]); ]);
}
if ($options['include_rate']) { protected function addRates(FormBuilderInterface $builder, $currency)
$builder {
->add('fixedRate', FixedRateType::class, [ $builder
'currency' => $currency, ->add('fixedRate', FixedRateType::class, [
]) 'currency' => $currency,
->add('hourlyRate', HourlyRateType::class, [ ])
'currency' => $currency, ->add('hourlyRate', HourlyRateType::class, [
]); 'currency' => $currency,
}
if ($options['include_user']) {
$builder->add('user', UserType::class);
}
if ($options['include_exported']) {
$builder->add('exported', YesNoType::class, [
'label' => 'label.exported'
]); ]);
} }
protected function addUser(FormBuilderInterface $builder)
{
$builder->add('user', UserType::class);
}
protected function addExported(FormBuilderInterface $builder)
{
$builder->add('exported', YesNoType::class, [
'label' => 'label.exported'
]);
} }
/** /**

View File

@@ -17,7 +17,6 @@ use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
/** /**
* @coversDefaultClass \App\API\ActivityController
* @group integration * @group integration
*/ */
class ActivityControllerTest extends APIControllerBaseTest class ActivityControllerTest extends APIControllerBaseTest

View File

@@ -12,7 +12,6 @@ namespace App\Tests\API;
use App\Entity\User; use App\Entity\User;
/** /**
* @coversDefaultClass \App\API\ConfigurationController
* @group integration * @group integration
*/ */
class ConfigurationControllerTest extends APIControllerBaseTest class ConfigurationControllerTest extends APIControllerBaseTest

View File

@@ -13,7 +13,6 @@ use App\Entity\User;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
/** /**
* @coversDefaultClass \App\API\CustomerController
* @group integration * @group integration
*/ */
class CustomerControllerTest extends APIControllerBaseTest class CustomerControllerTest extends APIControllerBaseTest

View File

@@ -13,7 +13,7 @@ use App\API\Model\I18n;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @coversDefaultClass \App\API\Model\I18n * @covers \App\API\Model\I18n
*/ */
class I18nTest extends TestCase class I18nTest extends TestCase
{ {

View File

@@ -17,7 +17,6 @@ use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
/** /**
* @coversDefaultClass \App\API\ProjectController
* @group integration * @group integration
*/ */
class ProjectControllerTest extends APIControllerBaseTest class ProjectControllerTest extends APIControllerBaseTest

View File

@@ -13,7 +13,6 @@ use App\Constants;
use App\Entity\User; use App\Entity\User;
/** /**
* @coversDefaultClass \App\API\StatusController
* @group integration * @group integration
*/ */
class StatusControllerTest extends APIControllerBaseTest class StatusControllerTest extends APIControllerBaseTest

View File

@@ -14,7 +14,6 @@ use App\Tests\DataFixtures\TagFixtures;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
/** /**
* @coversDefaultClass \App\API\TagController
* @group integration * @group integration
*/ */
class TagControllerTest extends APIControllerBaseTest class TagControllerTest extends APIControllerBaseTest

View File

@@ -18,7 +18,6 @@ use App\Tests\DataFixtures\TimesheetFixtures;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
/** /**
* @coversDefaultClass \App\API\TimesheetController
* @group integration * @group integration
*/ */
class TimesheetControllerTest extends APIControllerBaseTest class TimesheetControllerTest extends APIControllerBaseTest

View File

@@ -12,7 +12,6 @@ namespace App\Tests\API;
use App\Entity\User; use App\Entity\User;
/** /**
* @coversDefaultClass \App\API\UserController
* @group integration * @group integration
*/ */
class UserControllerTest extends APIControllerBaseTest class UserControllerTest extends APIControllerBaseTest

View File

@@ -14,7 +14,7 @@ use App\Calendar\Source;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @coversDefaultClass \App\Calendar\Google * @covers \App\Calendar\Google
*/ */
class GoogleTest extends TestCase class GoogleTest extends TestCase
{ {

View File

@@ -13,7 +13,7 @@ use App\Calendar\Source;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
/** /**
* @coversDefaultClass \App\Calendar\Source * @covers \App\Calendar\Source
*/ */
class SourceTest extends TestCase class SourceTest extends TestCase
{ {

View File

@@ -16,7 +16,7 @@ use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester; use Symfony\Component\Console\Tester\CommandTester;
/** /**
* @coversDefaultClass \App\Command\CreateUserCommand * @covers \App\Command\CreateUserCommand
* @group integration * @group integration
*/ */
class CreateUserCommandTest extends KernelTestCase class CreateUserCommandTest extends KernelTestCase

View File

@@ -12,7 +12,6 @@ namespace App\Tests\Controller;
use App\Entity\User; use App\Entity\User;
/** /**
* @coversDefaultClass \App\Controller\AboutController
* @group integration * @group integration
*/ */
class AboutControllerTest extends ControllerBaseTest class AboutControllerTest extends ControllerBaseTest

View File

@@ -16,7 +16,6 @@ use App\Tests\DataFixtures\ProjectFixtures;
use App\Tests\DataFixtures\TimesheetFixtures; use App\Tests\DataFixtures\TimesheetFixtures;
/** /**
* @coversDefaultClass \App\Controller\ActivityController
* @group integration * @group integration
*/ */
class ActivityControllerTest extends ControllerBaseTest class ActivityControllerTest extends ControllerBaseTest

View File

@@ -13,7 +13,6 @@ use App\Configuration\CalendarConfiguration;
use App\Tests\Configuration\TestConfigLoader; use App\Tests\Configuration\TestConfigLoader;
/** /**
* @coversDefaultClass \App\Controller\CalendarController
* @group integration * @group integration
*/ */
class CalendarControllerTest extends ControllerBaseTest class CalendarControllerTest extends ControllerBaseTest

View File

@@ -15,7 +15,6 @@ use App\Tests\DataFixtures\CustomerFixtures;
use App\Tests\DataFixtures\TimesheetFixtures; use App\Tests\DataFixtures\TimesheetFixtures;
/** /**
* @coversDefaultClass \App\Controller\CustomerController
* @group integration * @group integration
*/ */
class CustomerControllerTest extends ControllerBaseTest class CustomerControllerTest extends ControllerBaseTest

View File

@@ -12,7 +12,6 @@ namespace App\Tests\Controller;
use App\Entity\User; use App\Entity\User;
/** /**
* @coversDefaultClass \App\Controller\DashboardController
* @group integration * @group integration
*/ */
class DashboardControllerTest extends ControllerBaseTest class DashboardControllerTest extends ControllerBaseTest

View File

@@ -13,7 +13,6 @@ use App\Entity\User;
use App\Tests\DataFixtures\TimesheetFixtures; use App\Tests\DataFixtures\TimesheetFixtures;
/** /**
* @coversDefaultClass \App\Controller\ExportController
* @group integration * @group integration
*/ */
class ExportControllerTest extends ControllerBaseTest class ExportControllerTest extends ControllerBaseTest

View File

@@ -15,7 +15,6 @@ use App\Form\Type\InitialViewType;
use App\Form\Type\LanguageType; use App\Form\Type\LanguageType;
/** /**
* @coversDefaultClass \App\Controller\HomepageController
* @group integration * @group integration
*/ */
class HomepageControllerTest extends ControllerBaseTest class HomepageControllerTest extends ControllerBaseTest

View File

@@ -16,7 +16,6 @@ use App\Tests\DataFixtures\InvoiceFixtures;
use App\Tests\DataFixtures\TimesheetFixtures; use App\Tests\DataFixtures\TimesheetFixtures;
/** /**
* @coversDefaultClass \App\Controller\InvoiceController
* @group integration * @group integration
*/ */
class InvoiceControllerTest extends ControllerBaseTest class InvoiceControllerTest extends ControllerBaseTest

View File

@@ -14,7 +14,6 @@ use App\Plugin\PluginManager;
use App\Tests\Plugin\Fixtures\TestPlugin; use App\Tests\Plugin\Fixtures\TestPlugin;
/** /**
* @coversDefaultClass \App\Controller\PluginController
* @group integration * @group integration
*/ */
class PluginControllerTest extends ControllerBaseTest class PluginControllerTest extends ControllerBaseTest

View File

@@ -17,7 +17,6 @@ use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
/** /**
* @coversDefaultClass \App\Controller\ProfileController
* @group integration * @group integration
*/ */
class ProfileControllerTest extends ControllerBaseTest class ProfileControllerTest extends ControllerBaseTest

View File

@@ -16,7 +16,6 @@ use App\Tests\DataFixtures\ProjectFixtures;
use App\Tests\DataFixtures\TimesheetFixtures; use App\Tests\DataFixtures\TimesheetFixtures;
/** /**
* @coversDefaultClass \App\Controller\ProjectController
* @group integration * @group integration
*/ */
class ProjectControllerTest extends ControllerBaseTest class ProjectControllerTest extends ControllerBaseTest

View File

@@ -11,7 +11,7 @@ namespace App\Tests\Controller;
/** /**
* This test makes sure the login and registration work as expected. * This test makes sure the login and registration work as expected.
* They live in the FOSUserBundle and are tested already, but we use a different layout. * The logic is located in the FOSUserBundle and already tested, but we use a different layout.
* *
* @group integration * @group integration
*/ */

View File

@@ -13,7 +13,6 @@ use App\Configuration\SystemConfiguration;
use App\Entity\User; use App\Entity\User;
/** /**
* @coversDefaultClass \App\Controller\SystemConfigurationController
* @group integration * @group integration
*/ */
class SystemConfigurationControllerTest extends ControllerBaseTest class SystemConfigurationControllerTest extends ControllerBaseTest

View File

@@ -13,7 +13,6 @@ use App\Entity\User;
use App\Tests\DataFixtures\TagFixtures; use App\Tests\DataFixtures\TagFixtures;
/** /**
* @coversDefaultClass \App\Controller\TagController
* @group integration * @group integration
*/ */
class TagControllerTest extends ControllerBaseTest class TagControllerTest extends ControllerBaseTest

View File

@@ -15,7 +15,6 @@ use App\Form\Type\DateRangeType;
use App\Tests\DataFixtures\TimesheetFixtures; use App\Tests\DataFixtures\TimesheetFixtures;
/** /**
* @coversDefaultClass \App\Controller\TimesheetController
* @group integration * @group integration
*/ */
class TimesheetControllerTest extends ControllerBaseTest class TimesheetControllerTest extends ControllerBaseTest

View File

@@ -15,7 +15,6 @@ use App\Form\Type\DateRangeType;
use App\Tests\DataFixtures\TimesheetFixtures; use App\Tests\DataFixtures\TimesheetFixtures;
/** /**
* @coversDefaultClass \App\Controller\TimesheetTeamController
* @group integration * @group integration
*/ */
class TimesheetTeamControllerTest extends ControllerBaseTest class TimesheetTeamControllerTest extends ControllerBaseTest

View File

@@ -14,7 +14,6 @@ use App\Entity\User;
use App\Tests\DataFixtures\TimesheetFixtures; use App\Tests\DataFixtures\TimesheetFixtures;
/** /**
* @coversDefaultClass \App\Controller\UserController
* @group integration * @group integration
*/ */
class UserControllerTest extends ControllerBaseTest class UserControllerTest extends ControllerBaseTest

View File

@@ -11,12 +11,35 @@ namespace App\Tests\Entity;
use App\Entity\User; use App\Entity\User;
use App\Entity\UserPreference; use App\Entity\UserPreference;
use Doctrine\Common\Collections\ArrayCollection;
/** /**
* @covers \App\Entity\User * @covers \App\Entity\User
*/ */
class UserTest extends AbstractEntityTest class UserTest extends AbstractEntityTest
{ {
public function testDefaultValues()
{
$user = new User();
$this->assertInstanceOf(ArrayCollection::class, $user->getPreferences());
$this->assertNull($user->getTitle());
$this->assertNull($user->getAvatar());
$this->assertNull($user->getAlias());
$this->assertNull($user->getId());
$this->assertNull($user->getApiToken());
$this->assertNull($user->getPlainApiToken());
$this->assertEquals(User::DEFAULT_LANGUAGE, $user->getLocale());
$user->setAvatar('https://www.gravatar.com/avatar/00000000000000000000000000000000?d=retro&f=y');
$this->assertEquals('https://www.gravatar.com/avatar/00000000000000000000000000000000?d=retro&f=y', $user->getAvatar());
$user->setApiToken('nbvfdswe34567ujko098765rerfghbgvfcdsert');
$this->assertEquals('nbvfdswe34567ujko098765rerfghbgvfcdsert', $user->getApiToken());
$user->setPlainApiToken('https://www.gravatar.com/avatar/nbvfdswe34567ujko098765rerfghbgvfcdsert');
$this->assertEquals('https://www.gravatar.com/avatar/nbvfdswe34567ujko098765rerfghbgvfcdsert', $user->getPlainApiToken());
$user->setTitle('Mr. Code Blaster');
$this->assertEquals('Mr. Code Blaster', $user->getTitle());
}
public function getInvalidTestData() public function getInvalidTestData()
{ {
return [ return [

View File

@@ -0,0 +1,56 @@
<?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\EventSubscriber;
use App\Entity\User;
use App\Event\DashboardEvent;
use App\Event\ThemeEvent;
use App\Model\DashboardSection;
use PHPUnit\Framework\TestCase;
/**
* @covers \App\Event\ThemeEvent
*/
class ThemeEventTest extends TestCase
{
public function testDefaultValues()
{
$user = new User();
$user->setAlias('foo');
$sut = new ThemeEvent($user);
$this->assertEquals($user, $sut->getUser());
$this->assertNull($sut->getPayload());
$this->assertEquals('', $sut->getContent());
}
public function testGetterAndSetter()
{
$user = new User();
$user->setAlias('foo');
$payload = [null, '', 'test', new \stdClass()];
$sut = new ThemeEvent($user);
$sut->setPayload($payload);
$this->assertEquals($payload, $sut->getPayload());
$sut = new ThemeEvent($user, $payload);
$this->assertEquals($payload, $sut->getPayload());
$sut = new ThemeEvent($user);
$sut->addContent('foo');
$this->assertEquals('foo', $sut->getContent());
$sut->addContent('<script>');
$this->assertEquals('foo<script>', $sut->getContent());
}
}

View File

@@ -41,4 +41,14 @@ class ServiceExportTest extends TestCase
$this->assertEquals(1, count($sut->getRenderer())); $this->assertEquals(1, count($sut->getRenderer()));
} }
public function testAddViaConstruct()
{
$renderer = [new HtmlRenderer(
$this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock()
)];
$sut = new ServiceExport($renderer);
$this->assertEquals(1, count($sut->getRenderer()));
}
} }

View File

@@ -52,8 +52,8 @@ class TagArrayToStringTransformerTest extends AbstractRendererTest
$this->assertEquals([], $sut->reverseTransform('')); $this->assertEquals([], $sut->reverseTransform(''));
$this->assertEquals([], $sut->reverseTransform(null)); $this->assertEquals([], $sut->reverseTransform(null));
$actual = $sut->reverseTransform('foo, bar'); $actual = $sut->reverseTransform('foo, bar, hello');
$this->assertEquals($results, $actual); $this->assertEquals(array_merge($results, [(new Tag())->setName('hello')]), $actual);
} }
} }