harentius/blog-bundle

View on GitHub
test/SonataAdminClassTestCase.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

declare(strict_types=1);

namespace Harentius\BlogBundle\Test;

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\Persistence\ManagerRegistry;
use PHPUnit\Framework\TestCase;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Builder\FormContractorInterface;
use Sonata\AdminBundle\Route\RouteGeneratorInterface;
use Sonata\AdminBundle\Translator\NoopLabelTranslatorStrategy;
use Sonata\DoctrineORMAdminBundle\Builder\ListBuilder;
use Sonata\DoctrineORMAdminBundle\Guesser\TypeGuesser;
use Sonata\DoctrineORMAdminBundle\Model\ModelManager;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Mapping\ClassMetadata as ValidatorClassMetadata;
use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;

class SonataAdminClassTestCase extends TestCase
{
    public function assertHasListFields(AbstractAdmin $abstractAdmin, array $fields): void
    {
        $list = $abstractAdmin->getList();
        $elements = $list->getElements();
        $this->assertArraysSame(array_keys($elements), $fields);
    }

    public function assertHasFormFields(AbstractAdmin $abstractAdmin, array $fields): void
    {
        $list = $abstractAdmin->getFormFieldDescriptions();
        $this->assertArraysSame(array_keys($list), $fields);
    }

    protected function createAdmin(string $class): AbstractAdmin
    {
        if (!is_subclass_of($class, AbstractAdmin::class)) {
            throw new \InvalidArgumentException("Class '{$class}' is not subclass of 'AbstractAdmin'");
        }

        /** @var AbstractAdmin $admin */
        $admin = new $class('', '', '');
        $listBuilder = new ListBuilder(new TypeGuesser());

        $admin->setListBuilder($listBuilder);
        $admin->setRouteGenerator($this->createMock(RouteGeneratorInterface::class));
        $managerRegistry = $this->createMock(ManagerRegistry::class);
        $entityManager = $this->createMock(EntityManagerInterface::class);
        $metadataFactory = $this->createMock(MetadataFactoryInterface::class);
        $metadataFactory
            ->method('getMetadataFor')
            ->willReturn($this->createMock(ClassMetadata::class))
        ;
        $entityManager
            ->method('getMetadataFactory')
            ->willReturn($metadataFactory)
        ;
        $managerRegistry
            ->method('getManagerForClass')
            ->willReturn($entityManager)
        ;
        $modelManager = new ModelManager($managerRegistry);
        $admin->setModelManager($modelManager);
        $admin->setLabelTranslatorStrategy(new NoopLabelTranslatorStrategy());
        $formContractor = $this->createMock(FormContractorInterface::class);
        $formContractor->method('getFormBuilder')->willReturn($this->createMock(FormBuilderInterface::class));
        $admin->setFormContractor($formContractor);
        $validator = $this->createMock(ValidatorInterface::class);
        $validator->method('getMetadataFor')->willReturn($this->createMock(ValidatorClassMetadata::class));
        $admin->setValidator($validator);

        return $admin;
    }

    private function assertArraysSame(array $array, array $arraySubset): void
    {
        $this->assertTrue(empty(array_diff($arraySubset, $array)) && empty(array_diff($array, $arraySubset)));
    }
}