Nous allons commencer notre découverte des tests avec les tests des entités. Grâce au typage dans les dernières versions de PHP il n'est plus forcément nécessaire d'écrire des tests pour nos accesseur et no getters. En revanche il peut être intéressant de tester que les annotations liées aux validations fonctionnent correctement. C'est la même méthode de test que l'on utilisera dans le cadre des objets DataModel.

Pour tester ces annotations on va utiliser une approche fonctionnelle car nous allons avoir besoin de l'ensemble des composants pour faire fonctionner certaines de nos règles de validation comme par exemple les conditions liées à l'unicité d'une entrée dans la base de données.

<?php
namespace App\Tests\Entity;

use App\Entity\InvitationCode;
use Liip\TestFixturesBundle\Test\FixturesTrait;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Validator\ConstraintViolation;

class InvitationCodeTest extends KernelTestCase
{

    use FixturesTrait;

    public function getEntity(): InvitationCode
    {
        return (new InvitationCode())
            ->setCode('123453')
            ->setDescription('Description de test')
            ->setExpireAt(new \DateTime());
    }

    public function assertHasErrors(InvitationCode $code, int $number = 0)
    {
        self::bootKernel();
        $errors = self::$container->get('validator')->validate($code);
        $messages = [];
        /** @var ConstraintViolation $error */
        foreach($errors as $error) {
            $messages[] = $error->getPropertyPath() . ' => ' . $error->getMessage();
        }
        $this->assertCount($number, $errors, implode(', ', $messages));
    }

    public function testValidEntity()
    {
        $this->assertHasErrors($this->getEntity(), 0);
    }

    public function testInvalidCodeEntity()
    {
        $this->assertHasErrors($this->getEntity()->setCode('1a345'), 1);
        $this->assertHasErrors($this->getEntity()->setCode('1345'), 1);
    }

    public function testInvalidBlankCodeEntity()
    {
        $this->assertHasErrors($this->getEntity()->setCode(''), 1);
    }

    public function testInvalidBlankDescriptionEntity()
    {
        $this->assertHasErrors($this->getEntity()->setDescription(''), 1);
    }

    public function testInvalidUsedCode ()
    {
        $this->loadFixtureFiles([dirname(__DIR__) . '/fixtures/invitation_codes.yaml']);
        $this->assertHasErrors($this->getEntity()->setCode('54321'), 1);
    }
}