Skip to content

Commit

Permalink
Merge 0694f12 into b382c81
Browse files Browse the repository at this point in the history
  • Loading branch information
franmomu committed Jul 27, 2020
2 parents b382c81 + 0694f12 commit 88d46dd
Show file tree
Hide file tree
Showing 14 changed files with 778 additions and 29 deletions.
5 changes: 5 additions & 0 deletions UPGRADE-3.x.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ UPGRADE 3.x
UPGRADE FROM 3.x to 3.x
=======================

### Sonata\DoctrineMongoDBAdminBundle\DatagridBuilder

Changed constructor's first parameter typehint from `Symfony\Component\Form\FormFactory` to
`Symfony\Component\Form\FormFactoryInterface`.

### Sonata\DoctrineMongoDBAdminBundle\Model\ModelManager

Deprecated `camelize()` method.
Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"sonata-project/admin-bundle-persistency-layer": "1.0.0"
},
"require-dev": {
"matthiasnoback/symfony-dependency-injection-test": "^4.1",
"symfony/phpunit-bridge": "^5.0"
},
"suggest": {
Expand Down
13 changes: 11 additions & 2 deletions src/Builder/DatagridBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,23 @@
use Sonata\AdminBundle\Guesser\TypeGuesserInterface;
use Sonata\DoctrineMongoDBAdminBundle\Datagrid\Pager;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormFactory;
use Symfony\Component\Form\FormFactoryInterface;

class DatagridBuilder implements DatagridBuilderInterface
{
/**
* @var FilterFactoryInterface
*/
protected $filterFactory;

/**
* @var FormFactoryInterface
*/
protected $formFactory;

/**
* @var TypeGuesserInterface
*/
protected $guesser;

/**
Expand All @@ -43,7 +52,7 @@ class DatagridBuilder implements DatagridBuilderInterface
/**
* @param bool $csrfTokenEnabled
*/
public function __construct(FormFactory $formFactory, FilterFactoryInterface $filterFactory, TypeGuesserInterface $guesser, $csrfTokenEnabled = true)
public function __construct(FormFactoryInterface $formFactory, FilterFactoryInterface $filterFactory, TypeGuesserInterface $guesser, $csrfTokenEnabled = true)
{
$this->formFactory = $formFactory;
$this->filterFactory = $filterFactory;
Expand Down
45 changes: 24 additions & 21 deletions src/DependencyInjection/Compiler/AddGuesserCompilerPass.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,33 +22,36 @@
*/
class AddGuesserCompilerPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
// ListBuilder
$definition = $container->getDefinition('sonata.admin.guesser.doctrine_mongodb_list_chain');
$services = [];
foreach ($container->findTaggedServiceIds('sonata.admin.guesser.doctrine_mongodb_list') as $id => $attributes) {
$services[] = new Reference($id);
}

$definition->replaceArgument(0, $services);
$this->addGuessersToBuilder(
$container,
'sonata.admin.guesser.doctrine_mongodb_list_chain',
'sonata.admin.guesser.doctrine_mongodb_list'
);

$this->addGuessersToBuilder(
$container,
'sonata.admin.guesser.doctrine_mongodb_datagrid_chain',
'sonata.admin.guesser.doctrine_mongodb_datagrid'
);

$this->addGuessersToBuilder(
$container,
'sonata.admin.guesser.doctrine_mongodb_show_chain',
'sonata.admin.guesser.doctrine_mongodb_show'
);
}

// DatagridBuilder
$definition = $container->getDefinition('sonata.admin.guesser.doctrine_mongodb_datagrid_chain');
$services = [];
foreach ($container->findTaggedServiceIds('sonata.admin.guesser.doctrine_mongodb_datagrid') as $id => $attributes) {
$services[] = new Reference($id);
private function addGuessersToBuilder(ContainerBuilder $container, string $builderDefinitionId, string $guessersTag): void
{
if (!$container->hasDefinition($builderDefinitionId)) {
return;
}

$definition->replaceArgument(0, $services);

// ShowBuilder
$definition = $container->getDefinition('sonata.admin.guesser.doctrine_mongodb_show_chain');
$definition = $container->getDefinition($builderDefinitionId);
$services = [];
foreach ($container->findTaggedServiceIds('sonata.admin.guesser.doctrine_mongodb_show') as $id => $attributes) {
foreach ($container->findTaggedServiceIds($guessersTag) as $id => $attributes) {
$services[] = new Reference($id);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@
*/
class SonataDoctrineMongoDBAdminExtension extends AbstractSonataAdminExtension
{
/**
* @param array $configs An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
public function load(array $configs, ContainerBuilder $container)
{
$configs = $this->fixTemplatesConfiguration($configs, $container);
Expand All @@ -42,8 +38,6 @@ public function load(array $configs, ContainerBuilder $container)
$processor = new Processor();
$config = $processor->processConfiguration($configuration, $configs);

$pool = $container->getDefinition('sonata.admin.manager.doctrine_mongodb');

$container->setParameter('sonata_doctrine_mongodb_admin.templates', $config['templates']);

// define the templates
Expand Down
176 changes: 176 additions & 0 deletions tests/Builder/DatagridBuilderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
<?php

declare(strict_types=1);

/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Sonata\DoctrineMongoDBAdminBundle\Tests\Builder;

use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Sonata\AdminBundle\Admin\AdminInterface;
use Sonata\AdminBundle\Admin\FieldDescriptionCollection;
use Sonata\AdminBundle\Datagrid\Datagrid;
use Sonata\AdminBundle\Datagrid\DatagridInterface;
use Sonata\AdminBundle\Datagrid\Pager;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use Sonata\AdminBundle\Filter\FilterFactoryInterface;
use Sonata\AdminBundle\Guesser\TypeGuesserInterface;
use Sonata\AdminBundle\Translator\FormLabelTranslatorStrategy;
use Sonata\DoctrineMongoDBAdminBundle\Admin\FieldDescription;
use Sonata\DoctrineMongoDBAdminBundle\Builder\DatagridBuilder;
use Sonata\DoctrineMongoDBAdminBundle\Filter\ModelFilter;
use Sonata\DoctrineMongoDBAdminBundle\Model\ModelManager;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Form\Guess\TypeGuess;

/**
* @author Sullivan Senechal <soullivaneuh@gmail.com>
* @author Marko Kunic <kunicmarko20@gmail.com>
*/
final class DatagridBuilderTest extends TestCase
{
/**
* @var DatagridBuilder
*/
private $datagridBuilder;

/**
* @var MockObject&TypeGuesserInterface
*/
private $typeGuesser;

/**
* @var MockObject&FormFactoryInterface
*/
private $formFactory;

/**
* @var MockObject&FilterFactoryInterface
*/
private $filterFactory;

/**
* @var MockObject&AdminInterface
*/
private $admin;

/**
* @var MockObject&ModelManager
*/
private $modelManager;

protected function setUp(): void
{
$this->formFactory = $this->createStub(FormFactoryInterface::class);
$this->filterFactory = $this->createStub(FilterFactoryInterface::class);
$this->typeGuesser = $this->createStub(TypeGuesserInterface::class);

$this->datagridBuilder = new DatagridBuilder(
$this->formFactory,
$this->filterFactory,
$this->typeGuesser
);

$this->admin = $this->createMock(AdminInterface::class);
$this->modelManager = $this->createMock(ModelManager::class);

$this->admin
->method('getClass')
->willReturn('FakeClass');
$this->admin
->method('getModelManager')
->willReturn($this->modelManager);
}

public function testGetBaseDatagrid(): void
{
$proxyQuery = $this->createStub(ProxyQueryInterface::class);
$fieldDescription = $this->createStub(FieldDescriptionCollection::class);
$formBuilder = $this->createStub(FormBuilderInterface::class);

$this->admin->method('createQuery')->willReturn($proxyQuery);
$this->admin->method('getList')->willReturn($fieldDescription);

$this->modelManager->method('getIdentifierFieldNames')->willReturn(['id']);

$this->formFactory->method('createNamedBuilder')->willReturn($formBuilder);

$this->assertInstanceOf(
Datagrid::class,
$datagrid = $this->datagridBuilder->getBaseDatagrid($this->admin)
);
$this->assertInstanceOf(Pager::class, $datagrid->getPager());
}

public function testFixFieldDescription(): void
{
$classMetadata = $this->createMock(ClassMetadata::class);

$fieldDescription = new FieldDescription();
$fieldDescription->setName('test');
$fieldDescription->setMappingType(ClassMetadata::ONE);

$this->admin
->expects($this->once())
->method('attachAdminClass');

$this->modelManager->method('hasMetadata')->willReturn(true);

$this->modelManager
->expects($this->once())
->method('getParentMetadataForProperty')
->willReturn([$classMetadata, 'someField', $parentAssociationMapping = []]);

$this->datagridBuilder->fixFieldDescription($this->admin, $fieldDescription);
}

public function testAddFilterNoType(): void
{
$this->admin
->expects($this->once())
->method('addFilterFieldDescription');

$datagrid = $this->createMock(DatagridInterface::class);
$guessType = new TypeGuess(ModelFilter::class, [
'name' => 'value',
], Guess::VERY_HIGH_CONFIDENCE);

$fieldDescription = new FieldDescription();
$fieldDescription->setName('test');

$this->typeGuesser->method('guessType')->willReturn($guessType);

$this->modelManager
->expects($this->once())
->method('hasMetadata')->willReturn(false);

$this->admin->method('getCode')->willReturn('someFakeCode');

$this->filterFactory->method('create')->willReturn(new ModelFilter());

$this->admin->method('getLabelTranslatorStrategy')->willReturn(new FormLabelTranslatorStrategy());

$datagrid
->expects($this->once())
->method('addFilter')
->with($this->isInstanceOf(ModelFilter::class));

$this->datagridBuilder->addFilter(
$datagrid,
null,
$fieldDescription,
$this->admin
);
}
}
45 changes: 45 additions & 0 deletions tests/Builder/ListBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

namespace Sonata\DoctrineMongoDBAdminBundle\Tests\Builder;

use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
use PHPUnit\Framework\TestCase;
use Prophecy\Argument;
use Sonata\AdminBundle\Admin\AbstractAdmin;
Expand Down Expand Up @@ -101,4 +102,48 @@ public function testCorrectFixedActionsFieldType(): void
'Standard list _action field has "actions" type'
);
}

/**
* @dataProvider fixFieldDescriptionData
*/
public function testFixFieldDescription(string $type, string $template): void
{
$classMetadata = $this->prophesize(ClassMetadata::class);
$this->modelManager->hasMetadata(Argument::any())->willReturn(true);
$fieldDescription = new FieldDescription();
$fieldDescription->setName('test');
$fieldDescription->setOption('sortable', true);
$fieldDescription->setType('fakeType');
$fieldDescription->setMappingType($type);

$this->admin->attachAdminClass(Argument::any())->shouldBeCalledTimes(1);

$classMetadata->fieldMappings = [2 => [1 => 'test', 'type' => 'string']];
$this->modelManager->getParentMetadataForProperty(Argument::cetera())
->willReturn([$classMetadata, 2, $parentAssociationMapping = []]);

$this->listBuilder->fixFieldDescription($this->admin->reveal(), $fieldDescription);

$this->assertSame($template, $fieldDescription->getTemplate());
}

public function fixFieldDescriptionData(): array
{
return [
'one-to-one' => [
ClassMetadata::ONE,
'@SonataAdmin/CRUD/Association/list_many_to_one.html.twig',
],
'many-to-one' => [
ClassMetadata::MANY,
'@SonataAdmin/CRUD/Association/list_many_to_many.html.twig',
],
];
}

public function testFixFieldDescriptionException(): void
{
$this->expectException(\RuntimeException::class);
$this->listBuilder->fixFieldDescription($this->admin->reveal(), new FieldDescription());
}
}

0 comments on commit 88d46dd

Please sign in to comment.