diff --git a/.travis.yml b/.travis.yml index ce6a4ad..b62f1ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,27 +1,25 @@ language: php +dist: trusty + cache: directories: - $HOME/.composer/cache/files -php: - - 7.0 - - 7.1 - - 7.2 - - 7.3 - env: global: - MONGO_EXTENSION="mongodb.so" - COMPOSER_FLAGS="" matrix: - include: - - php: 5.6 - env: MONGO_EXTENSION="mongo.so" SYMFONY_VERSION="symfony/lts:^2" - - php: 7.1 - env: SYMFONY_VERSION="symfony/lts:^3" fast_finish: true + include: + - php: 7.3 + env: SYMFONY_VERSION=4.3.* + - php: 7.3 + env: SYMFONY_VERSION=4.4.* + - php: 7.3 + env: SYMFONY_VERSION=5.0.* services: - mongodb @@ -30,13 +28,11 @@ before_install: - echo "extension = $MONGO_EXTENSION" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - echo 'date.timezone = "Europe/Paris"' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - echo 'memory_limit = -1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - -before_script: - composer config platform.ext-mongo 1.6.16 - - if [ "$SYMFONY_VERSION" != "" ]; then travis_wait composer require --no-update $SYMFONY_VERSION; fi; - - travis_wait composer update --prefer-dist --no-interaction $COMPOSER_FLAGS - - if ! [[ $TRAVIS_PHP_VERSION =~ ^5 ]]; then composer require alcaeus/mongo-php-adapter; fi; + - if [ "$DEPENDENCIES" = "dev" ]; then perl -pi -e 's/^}$/,"minimum-stability":"dev"}/' composer.json; fi; + - if [ "$SYMFONY_VERSION" != "" ]; then composer require "symfony/symfony:${SYMFONY_VERSION}" --no-update; fi; + - if ! [[ $TRAVIS_PHP_VERSION =~ ^5 ]]; then composer require alcaeus/mongo-php-adapter --no-update; fi; + +install: composer update --no-interaction -script: - - composer validate --no-check-lock --strict - - bin/phpunit --coverage-text +script: composer test diff --git a/Event/ApplyFilterConditionEvent.php b/Event/ApplyFilterConditionEvent.php index 05d24c0..877a6c2 100644 --- a/Event/ApplyFilterConditionEvent.php +++ b/Event/ApplyFilterConditionEvent.php @@ -3,7 +3,7 @@ namespace Lexik\Bundle\FormFilterBundle\Event; use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionBuilderInterface; -use Symfony\Component\EventDispatcher\Event; +use Symfony\Contracts\EventDispatcher\Event; /** * Event class to compute the WHERE clause from the conditions. diff --git a/Event/GetFilterConditionEvent.php b/Event/GetFilterConditionEvent.php index 16e06b0..08699d0 100644 --- a/Event/GetFilterConditionEvent.php +++ b/Event/GetFilterConditionEvent.php @@ -2,7 +2,7 @@ namespace Lexik\Bundle\FormFilterBundle\Event; -use Symfony\Component\EventDispatcher\Event; +use Symfony\Contracts\EventDispatcher\Event; use Lexik\Bundle\FormFilterBundle\Filter\Condition\Condition; use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionInterface; use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface; diff --git a/Event/Listener/DoctrineMongoDBApplyFilterListener.php b/Event/Listener/DoctrineMongoDBApplyFilterListener.php index 6e81655..be2338d 100644 --- a/Event/Listener/DoctrineMongoDBApplyFilterListener.php +++ b/Event/Listener/DoctrineMongoDBApplyFilterListener.php @@ -2,8 +2,8 @@ namespace Lexik\Bundle\FormFilterBundle\Event\Listener; -use Doctrine\MongoDB\Query\Builder; -use Doctrine\MongoDB\Query\Expr; +use Doctrine\ODM\MongoDB\Query\Builder; +use Doctrine\ODM\MongoDB\Query\Expr; use Lexik\Bundle\FormFilterBundle\Event\ApplyFilterConditionEvent; use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionInterface; use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionNodeInterface; diff --git a/Event/PrepareEvent.php b/Event/PrepareEvent.php index e78cbf1..6f9b78f 100644 --- a/Event/PrepareEvent.php +++ b/Event/PrepareEvent.php @@ -2,7 +2,7 @@ namespace Lexik\Bundle\FormFilterBundle\Event; -use Symfony\Component\EventDispatcher\Event; +use Symfony\Contracts\EventDispatcher\Event; use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface; /** diff --git a/Filter/FilterBuilderUpdater.php b/Filter/FilterBuilderUpdater.php index 66c927e..96a6468 100644 --- a/Filter/FilterBuilderUpdater.php +++ b/Filter/FilterBuilderUpdater.php @@ -5,7 +5,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Form; use Symfony\Component\Form\FormInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionBuilder; use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionBuilderInterface; use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionInterface; @@ -85,7 +85,8 @@ public function addFilterConditions(FormInterface $form, $queryBuilder, $alias = { // create the right QueryInterface object $event = new PrepareEvent($queryBuilder); - $this->dispatcher->dispatch(FilterEvents::PREPARE, $event); + + $this->dispatcher->dispatch($event, FilterEvents::PREPARE); if (!$event->getFilterQuery() instanceof QueryInterface) { throw new \RuntimeException("Couldn't find any filter query object."); @@ -103,7 +104,8 @@ public function addFilterConditions(FormInterface $form, $queryBuilder, $alias = // walk condition nodes to add condition on the query builder instance $name = sprintf('lexik_filter.apply_filters.%s', $event->getFilterQuery()->getEventPartName()); - $this->dispatcher->dispatch($name, new ApplyFilterConditionEvent($queryBuilder, $this->conditionBuilder)); + + $this->dispatcher->dispatch(new ApplyFilterConditionEvent($queryBuilder, $this->conditionBuilder), $name); $this->conditionBuilder = null; @@ -207,7 +209,8 @@ protected function getFilterCondition(FormInterface $form, AbstractType $formTyp } $event = new GetFilterConditionEvent($filterQuery, $field, $values); - $this->dispatcher->dispatch($eventName, $event); + + $this->dispatcher->dispatch($event, $eventName); $condition = $event->getCondition(); } diff --git a/Filter/Form/FilterTypeExtension.php b/Filter/Form/FilterTypeExtension.php index 3a49439..b65df3e 100644 --- a/Filter/Form/FilterTypeExtension.php +++ b/Filter/Form/FilterTypeExtension.php @@ -51,7 +51,7 @@ public function getExtendedType() /** * @return iterable */ - public static function getExtendedTypes() + public static function getExtendedTypes(): iterable { return [FormType::class]; } diff --git a/Tests/Filter/Doctrine/MongodbQueryBuilderUpdaterTest.php b/Tests/Filter/Doctrine/MongodbQueryBuilderUpdaterTest.php index f64c83d..03601a5 100644 --- a/Tests/Filter/Doctrine/MongodbQueryBuilderUpdaterTest.php +++ b/Tests/Filter/Doctrine/MongodbQueryBuilderUpdaterTest.php @@ -2,8 +2,7 @@ namespace Lexik\Bundle\FormFilterBundle\Tests\Filter\Doctrine; -use Doctrine\Bundle\MongoDBBundle\DataCollector\PrettyDataCollector; -use Doctrine\MongoDB\Query\Query; +use Doctrine\ODM\MongoDB\Query\Builder; use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionBuilderInterface; use Lexik\Bundle\FormFilterBundle\Tests\Fixtures\Filter\FormType; use Lexik\Bundle\FormFilterBundle\Tests\Fixtures\Filter\ItemCallbackFilterType; @@ -13,8 +12,6 @@ use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\BooleanFilterType; use Lexik\Bundle\FormFilterBundle\Tests\TestCase; use Lexik\Bundle\FormFilterBundle\Tests\Fixtures\Filter\ItemFilterType; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; /** * Mongodb query builder tests. @@ -26,32 +23,25 @@ class MongodbQueryBuilderUpdaterTest extends TestCase */ protected $dm; - /** - * @var PrettyDataCollector - */ - protected $collector; - public function setUp() { parent::setUp(); - // log queries to compare them as bson - $this->collector = new PrettyDataCollector(); - $this->dm = $this->getMongodbDocumentManager(array($this->collector, 'logQuery')); + $this->dm = $this->getMongodbDocumentManager(); } public function testBuildQuery() { - $year = \date('Y'); + $year = '2019'; $bson = array( - '#db.items.find\(({ })?\);#', - 'db.items.find({ "$and": [ { "name": "blabla" } ] });', - 'db.items.find({ "$and": [ { "name": "blabla" }, { "position": { "$gt": 2 } } ] });', - 'db.items.find({ "$and": [ { "name": "blabla" }, { "position": { "$gt": 2 } }, { "enabled": true } ] });', - 'db.items.find({ "$and": [ { "name": "blabla" }, { "position": { "$gt": 2 } }, { "enabled": true } ] });', - '#db.items.find\(\{ "\$and": \[ \{ "name": new RegExp\("\.\*blabla\$", "i"\) \}, \{ "position": \{ "\$lte": 2 \} \}, \{ "createdAt": new ISODate\("' . $year . '-09-27T00:00:00\+[0-9:]+"\) \} \] \}\);#', - '#db.items.find\(\{ "\$and": \[ \{ "name": new RegExp\("\.\*blabla\$", "i"\) \}, \{ "position": \{ "\$lte": 2 \} \}, \{ "createdAt": new ISODate\("' . $year . '-09-27T13:21:00\+[0-9:]+"\) \} \] \}\);#', + '{}', + '{"$and":[{"name":"blabla"}]}', + '{"$and":[{"name":"blabla"},{"position":{"$gt":2}}]}', + '{"$and":[{"name":"blabla"},{"position":{"$gt":2}},{"enabled":true}]}', + '{"$and":[{"name":"blabla"},{"position":{"$gt":2}},{"enabled":true}]}', + '{"$and":[{"name":{"regex":".*blabla$","flags":"i"}},{"position":{"$lte":2}},{"createdAt":{"$date":{"$numberLong":"1569535200000"}}}]}', + '{"$and":[{"name":{"regex":".*blabla$","flags":"i"}},{"position":{"$lte":2}},{"createdAt":{"$date":{"$numberLong":"1569583260000"}}}]}' ); $form = $this->formFactory->create(ItemFilterType::class); @@ -61,14 +51,14 @@ public function testBuildQuery() $mongoQB = $this->createDoctrineQueryBuilder(); $filterQueryBuilder->addFilterConditions($form, $mongoQB); - $this->assertRegExp($bson[0], $this->toBson($mongoQB->getQuery())); + $this->assertRegExp($bson[0], $this->toBson($mongoQB->getQueryArray())); // bind a request to the form - 1 params $mongoQB = $this->createDoctrineQueryBuilder(); $form->submit(array('name' => 'blabla', 'position' => '')); $filterQueryBuilder->addFilterConditions($form, $mongoQB); - $this->assertEquals($bson[1], $this->toBson($mongoQB->getQuery())); + $this->assertEquals($bson[1], $this->toBson($mongoQB->getQueryArray())); // bind a request to the form - 2 params $form = $this->formFactory->create(ItemFilterType::class); @@ -77,7 +67,7 @@ public function testBuildQuery() $form->submit(array('name' => 'blabla', 'position' => 2)); $filterQueryBuilder->addFilterConditions($form, $mongoQB); - $this->assertEquals($bson[2], $this->toBson($mongoQB->getQuery())); + $this->assertEquals($bson[2], $this->toBson($mongoQB->getQueryArray())); // bind a request to the form - 3 params $form = $this->formFactory->create(ItemFilterType::class); @@ -86,7 +76,7 @@ public function testBuildQuery() $form->submit(array('name' => 'blabla', 'position' => 2, 'enabled' => BooleanFilterType::VALUE_YES)); $filterQueryBuilder->addFilterConditions($form, $mongoQB); - $this->assertEquals($bson[3], $this->toBson($mongoQB->getQuery())); + $this->assertEquals($bson[3], $this->toBson($mongoQB->getQueryArray())); // bind a request to the form - 3 params (use checkbox for enabled field) $form = $this->formFactory->create(ItemFilterType::class, null, array( @@ -97,7 +87,7 @@ public function testBuildQuery() $form->submit(array('name' => 'blabla', 'position' => 2, 'enabled' => 'yes')); $filterQueryBuilder->addFilterConditions($form, $mongoQB); - $this->assertEquals($bson[4], $this->toBson($mongoQB->getQuery())); + $this->assertEquals($bson[4], $this->toBson($mongoQB->getQueryArray())); // bind a request to the form - date + pattern selector $form = $this->formFactory->create(ItemFilterType::class, null, array( @@ -112,7 +102,7 @@ public function testBuildQuery() )); $filterQueryBuilder->addFilterConditions($form, $mongoQB); - $this->assertRegExp($bson[5], $this->toBson($mongoQB->getQuery())); + $this->assertEquals($bson[5], $this->toBson($mongoQB->getQueryArray())); // bind a request to the form - datetime + pattern selector $form = $this->formFactory->create(ItemFilterType::class, null, array( @@ -131,7 +121,7 @@ public function testBuildQuery() )); $filterQueryBuilder->addFilterConditions($form, $mongoQB); - $this->assertRegExp($bson[6], $this->toBson($mongoQB->getQuery())); + $this->assertEquals($bson[6], $this->toBson($mongoQB->getQueryArray())); } public function testDisabledFieldQuery() @@ -147,8 +137,8 @@ public function testDisabledFieldQuery() $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "position": { "$gt": 2 } } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"position":{"$gt":2}}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -162,8 +152,8 @@ public function testApplyFilterOption() $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "name": { "$ne": "blabla" } }, { "position": { "$ne": 2 } } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"name":{"$ne":"blabla"}},{"position":{"$ne":2}}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -178,8 +168,8 @@ public function testNumberRange() $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "position": { "$gt": 1, "$lt": 3 } } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"position":{"$gt":1,"$lt":3}}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -197,8 +187,8 @@ public function testNumberRangeWithSelector() $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "position_selector": { "$gt": 4, "$lte": 8 } } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"position_selector":{"$gt":4,"$lte":8}}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -213,8 +203,8 @@ public function testNumberRangeDefaultValues() $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "default_position": { "$gte": 1, "$lte": 3 } } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"default_position":{"$gte":1,"$lte":3}}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -229,13 +219,17 @@ public function testDateRange() ), )); + + $leftTimestamp = (new \DateTime('2012-05-12'))->getTimestamp() * 1000; + $rightTimestamp = (new \DateTime('2012-05-22'))->getTimestamp() * 1000; + $mongoQB = $this->createDoctrineQueryBuilder(); $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); - $this->assertRegExp( - '#db.items.find\(\{ "\$and": \[ \{ "createdAt": \{ "\$gte": new ISODate\("2012-05-12T00:00:00\+[0-9:]+"\), "\$lt": new ISODate\("2012-05-22T00:00:00\+[0-9:]+"\) \} \} \] \}\);#', - $this->toBson($mongoQB->getQuery()) + $this->assertEquals( + '{"$and":[{"createdAt":{"$gte":{"$date":{"$numberLong":"'.$leftTimestamp.'"}},"$lt":{"$date":{"$numberLong":"'.$rightTimestamp.'"}}}}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -256,13 +250,16 @@ public function testDateTimeRange() ), )); + $leftTimestamp = (new \DateTime('2012-05-12 14:55:00'))->getTimestamp() * 1000; + $rightTimestamp = (new \DateTime('2012-06-10 22:12:00'))->getTimestamp() * 1000; + $mongoQB = $this->createDoctrineQueryBuilder(); $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); - $this->assertRegExp( - '#db\.items\.find\(\{ "\$and": \[ \{ "updatedAt": \{ "\$gte": new ISODate\("2012-05-12T14:55:00\+[0-9:]+"\), "\$lt": new ISODate\("2012-06-10T22:12:00\+[0-9:]+"\) \} \} \] }\);#', - $this->toBson($mongoQB->getQuery()) + $this->assertEquals( + '{"$and":[{"updatedAt":{"$gte":{"$date":{"$numberLong":"'.$leftTimestamp.'"}},"$lt":{"$date":{"$numberLong":"'.$rightTimestamp.'"}}}}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -279,8 +276,8 @@ public function testFilterStandardType() $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "name": new RegExp(".*hey dude.*", "i") }, { "position": 99 } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"name":{"regex":".*hey dude.*","flags":"i"}},{"position":99}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -298,8 +295,8 @@ public function testEmbedFormFilter() $filterQueryBuilder->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "name": "dude" }, { "$and": [ { "options.label": "color" }, { "options.rank": 3 } ] } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"name":"dude"},{"$and":[{"options.label":"color"},{"options.rank":3}]}]}', + $this->toBson($mongoQB->getQueryArray()) ); // doctrine query builder without any joins and values for embedded field only @@ -314,8 +311,8 @@ public function testEmbedFormFilter() $filterQueryBuilder->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "$and": [ { "options.label": "color" }, { "options.rank": 3 } ] } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"$and":[{"options.label":"color"},{"options.rank":3}]}]}', + $this->toBson($mongoQB->getQueryArray()) ); // pre-fill parts @@ -331,8 +328,8 @@ public function testEmbedFormFilter() $filterQueryBuilder->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "name": "dude" }, { "$and": [ { "options.label": "size" }, { "options.rank": 5 } ] } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"name":"dude"},{"$and":[{"options.label":"size"},{"options.rank":5}]}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -362,8 +359,8 @@ public function testCustomConditionBuilder() $filterQueryBuilder->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$or": [ { "options.label": "color" }, { "$and": [ { "options.rank": 6 }, { "name": "dude" } ] } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$or":[{"options.label":"color"},{"$and":[{"options.rank":6},{"name":"dude"}]}]}', + $this->toBson($mongoQB->getQueryArray()) ); // doctrine query builder without any joins + custom condition builder @@ -391,8 +388,8 @@ public function testCustomConditionBuilder() $filterQueryBuilder->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "$or": [ { "name": "dude" }, { "options.label": "color" } ] }, { "$or": [ { "options.rank": 6 }, { "position": 1 } ] } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"$or":[{"name":"dude"},{"options.label":"color"}]},{"$or":[{"options.rank":6},{"position":1}]}]}', + $this->toBson($mongoQB->getQueryArray()) ); } @@ -409,27 +406,20 @@ public function testWithDataClass() $this->initQueryBuilderUpdater()->addFilterConditions($form, $mongoQB); $this->assertEquals( - 'db.items.find({ "$and": [ { "name": "dude" }, { "$and": [ { "options.label": "color" }, { "options.rank": 6 } ] } ] });', - $this->toBson($mongoQB->getQuery()) + '{"$and":[{"name":"dude"},{"$and":[{"options.label":"color"},{"options.rank":6}]}]}', + $this->toBson($mongoQB->getQueryArray()) ); } - protected function createDoctrineQueryBuilder() + protected function createDoctrineQueryBuilder(): Builder { return $this->dm ->getRepository('Lexik\Bundle\FormFilterBundle\Tests\Fixtures\Document\Item') ->createQueryBuilder(); } - protected function toBson(Query $query) + protected function toBson(array $query) { - $query->execute(); - - $this->collector->collect(new Request(), new Response()); - $q = $this->collector->getQueries(); - - array_shift($q); - - return isset($q[count($q)-1]) ? $q[count($q)-1] : null; + return json_encode($query); } } diff --git a/Tests/Fixtures/Document/Item.php b/Tests/Fixtures/Document/Item.php index 40f1b55..6d6fe90 100644 --- a/Tests/Fixtures/Document/Item.php +++ b/Tests/Fixtures/Document/Item.php @@ -42,7 +42,7 @@ class Item protected $updatedAt; /** - * @Mongo\EmbedMany(targetDocument="Options", strategy="set") + * @Mongo\EmbedMany(targetDocument="Lexik\Bundle\FormFilterBundle\Tests\Fixtures\Document\Options", strategy="set") */ protected $options; diff --git a/Tests/Fixtures/Filter/FormType.php b/Tests/Fixtures/Filter/FormType.php index 7a65986..3c72f50 100644 --- a/Tests/Fixtures/Filter/FormType.php +++ b/Tests/Fixtures/Filter/FormType.php @@ -2,6 +2,7 @@ namespace Lexik\Bundle\FormFilterBundle\Tests\Fixtures\Filter; +use Doctrine\ODM\MongoDB\Query\Expr; use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; @@ -21,7 +22,7 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->add('position', IntegerType::class, array( 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) { if (!empty($values['value'])) { - if ($filterQuery->getExpr() instanceof \Doctrine\MongoDB\Query\Expr) { + if ($filterQuery->getExpr() instanceof Expr) { $expr = $filterQuery->getExpr()->field($field)->equals($values['value']); } else { $expr = $filterQuery->getExpr()->eq($field, $values['value']); diff --git a/Tests/Fixtures/Filter/ItemCallbackFilterType.php b/Tests/Fixtures/Filter/ItemCallbackFilterType.php index 62df83e..cd27f3b 100644 --- a/Tests/Fixtures/Filter/ItemCallbackFilterType.php +++ b/Tests/Fixtures/Filter/ItemCallbackFilterType.php @@ -2,6 +2,7 @@ namespace Lexik\Bundle\FormFilterBundle\Tests\Fixtures\Filter; +use Doctrine\ODM\MongoDB\Query\Expr; use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\NumberFilterType; use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\TextFilterType; use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface; @@ -23,7 +24,7 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->add('position', NumberFilterType::class, array( 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) { if (!empty($values['value'])) { - if ($filterQuery->getExpr() instanceof \Doctrine\MongoDB\Query\Expr) { + if ($filterQuery->getExpr() instanceof Expr) { $expr = $filterQuery->getExpr()->field($field)->notEqual($values['value']); } else { $expr = $filterQuery->getExpr()->neq($field, $values['value']); @@ -45,7 +46,7 @@ public function getBlockPrefix() public function fieldNameCallback(QueryInterface $filterQuery, $field, $values) { if (!empty($values['value'])) { - if ($filterQuery->getExpr() instanceof \Doctrine\MongoDB\Query\Expr) { + if ($filterQuery->getExpr() instanceof Expr) { $expr = $filterQuery->getExpr()->field($field)->notEqual($values['value']); } else { $expr = $filterQuery->getExpr()->neq($field, sprintf('\'%s\'', $values['value'])); diff --git a/Tests/Fixtures/Filter/ItemEmbeddedOptionsFilterType.php b/Tests/Fixtures/Filter/ItemEmbeddedOptionsFilterType.php index 01b1990..67acf9d 100644 --- a/Tests/Fixtures/Filter/ItemEmbeddedOptionsFilterType.php +++ b/Tests/Fixtures/Filter/ItemEmbeddedOptionsFilterType.php @@ -2,8 +2,6 @@ namespace Lexik\Bundle\FormFilterBundle\Tests\Fixtures\Filter; -use Doctrine\MongoDB\Query\Builder; -use Doctrine\MongoDB\Query\Expr as MongoExpr; use Doctrine\ORM\Query\Expr as ORMExpr; use Doctrine\ORM\QueryBuilder; use Lexik\Bundle\FormFilterBundle\Filter\FilterBuilderExecuterInterface; diff --git a/Tests/TestCase.php b/Tests/TestCase.php index 6482bf9..41ce8af 100644 --- a/Tests/TestCase.php +++ b/Tests/TestCase.php @@ -2,18 +2,31 @@ namespace Lexik\Bundle\FormFilterBundle\Tests; +use Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension; +use Doctrine\Bundle\DoctrineBundle\DoctrineBundle; +use Doctrine\Bundle\MongoDBBundle\DependencyInjection\DoctrineMongoDBExtension; +use Doctrine\Bundle\MongoDBBundle\DoctrineMongoDBBundle; use Doctrine\Common\Annotations\AnnotationReader; +use Doctrine\Common\Cache\ArrayCache; +use Doctrine\ODM\MongoDB\Configuration; +use Doctrine\ODM\MongoDB\DocumentManager; +use Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver; use Doctrine\ORM\EntityManager; -use Symfony\Component\Form\FormRegistry; -use Symfony\Component\Form\ResolvedFormTypeFactory; -use Symfony\Component\Form\FormFactory; -use Symfony\Component\Form\Extension\Core\CoreExtension; -use Symfony\Component\Config\FileLocator; -use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Lexik\Bundle\FormFilterBundle\Filter\Form\FilterExtension; use Lexik\Bundle\FormFilterBundle\DependencyInjection\Compiler\FormDataExtractorPass; use Lexik\Bundle\FormFilterBundle\DependencyInjection\LexikFormFilterExtension; +use Lexik\Bundle\FormFilterBundle\Filter\Form\FilterExtension; +use Lexik\Bundle\FormFilterBundle\LexikFormFilterBundle; +use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension; +use Symfony\Bundle\FrameworkBundle\FrameworkBundle; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; +use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; +use Symfony\Component\Form\Extension\Core\CoreExtension; +use Symfony\Component\Form\FormFactory; +use Symfony\Component\Form\FormRegistry; +use Symfony\Component\Form\ResolvedFormTypeFactory; abstract class TestCase extends \PHPUnit\Framework\TestCase { @@ -36,10 +49,7 @@ public function getFormFactory() { $resolvedFormTypeFactory = new ResolvedFormTypeFactory(); - $registery = new FormRegistry(array( - new CoreExtension(), - new FilterExtension(), - ), $resolvedFormTypeFactory); + $registery = new FormRegistry([new CoreExtension(), new FilterExtension()], $resolvedFormTypeFactory); $formFactory = new FormFactory($registery, $resolvedFormTypeFactory); @@ -87,76 +97,96 @@ public function getSqliteEntityManager() return $em; } - /** - * @return \Doctrine\ODM\MongoDB\DocumentManager - */ - public function getMongodbDocumentManager($loggerCallback) + public function getMongodbDocumentManager(): DocumentManager { - $cache = new \Doctrine\Common\Cache\ArrayCache(); - - if (class_exists('Doctrine\Common\Annotations\DocParser')) { - $reader = new AnnotationReader(new \Doctrine\Common\Annotations\DocParser()); - } else { - $reader = new AnnotationReader($cache); - } + $cache = new ArrayCache(); - $xmlDriver = new \Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver($reader, array( - __DIR__.'/Fixtures/Document', - )); - - $config = new \Doctrine\ODM\MongoDB\Configuration(); + $config = new Configuration(); $config->setMetadataCacheImpl($cache); - $config->setMetadataDriverImpl($xmlDriver); + $config->setMetadataDriverImpl(new AnnotationDriver(new AnnotationReader(), [__DIR__.'/Fixtures/Document/'])); + + $config->setAutoGenerateProxyClasses(Configuration::AUTOGENERATE_FILE_NOT_EXISTS); $config->setProxyDir(sys_get_temp_dir()); + $config->setHydratorDir(sys_get_temp_dir()); + $config->setProxyNamespace('Proxy'); - $config->setAutoGenerateProxyClasses(true); - $config->setClassMetadataFactoryName('Doctrine\ODM\MongoDB\Mapping\ClassMetadataFactory'); $config->setDefaultDB('lexik_form_filter_bundle_test'); - $config->setHydratorDir(sys_get_temp_dir()); $config->setHydratorNamespace('Doctrine\ODM\MongoDB\Hydrator'); $config->setAutoGenerateHydratorClasses(true); $config->setDefaultCommitOptions(array()); - $config->setLoggerCallable($loggerCallback); - - $options = array(); - $conn = new \Doctrine\MongoDB\Connection(null, $options, $config); - - $dm = \Doctrine\ODM\MongoDB\DocumentManager::create($conn, $config); - return $dm; + return DocumentManager::create(null, $config); } protected function initQueryBuilderUpdater() { - $container = $this->getContainer(); + $container = $this->createContainerBuilder([ + 'framework' => ['secret' => 'test'], + 'lexik_form_filter' => [ + 'listeners' => [ + 'doctrine_orm' => true, 'doctrine_dbal' => true, 'doctrine_mongodb' => true, + ] + ], + ]); return $container->get('lexik_form_filter.query_builder_updater'); } - protected function getContainer() + private static function createContainerBuilder(array $configs = []) { - $container = new ContainerBuilder(); + $container = new ContainerBuilder(new ParameterBag([ + 'kernel.bundles' => [ + 'FrameworkBundle' => FrameworkBundle::class, + 'DoctrineBundle' => DoctrineBundle::class, + 'LexikJWTAuthenticationBundle' => LexikFormFilterBundle::class + ], + 'kernel.bundles_metadata' => [], + 'kernel.cache_dir' => __DIR__, + 'kernel.debug' => false, + 'kernel.environment' => 'test', + 'kernel.name' => 'kernel', + 'kernel.root_dir' => __DIR__, + 'kernel.project_dir' => __DIR__, + 'kernel.container_class' => 'AutowiringTestContainer', + 'kernel.charset' => 'utf8', + 'env(base64:default::SYMFONY_DECRYPTION_SECRET)' => 'dummy', + ])); + + $container->registerExtension(new FrameworkExtension()); $container->registerExtension(new LexikFormFilterExtension()); - $loadXml = new XmlFileLoader($container, new FileLocator(__DIR__.'/../vendor/symfony/framework-bundle/Resources/config')); - $loadXml->load('services.xml'); - - $loadXml = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); - $loadXml->load('services.xml'); - $loadXml->load('form.xml'); - $loadXml->load('doctrine_dbal.xml'); - $loadXml->load('doctrine_orm.xml'); - $loadXml->load('doctrine_mongodb.xml'); + $extension = new DoctrineExtension(); + $container->registerExtension($extension); + $extension->load([[ + 'dbal' => [ + 'connections' => [ + 'default' => [ + 'driver' => 'pdo_mysql', + 'charset' => 'UTF8', + ], + ], + 'default_connection' => 'default', + ], 'orm' => [ + 'default_entity_manager' => 'default', + 'resolve_target_entities' => ['Symfony\Component\Security\Core\User\UserInterface' => 'stdClass'], + ], + ], + ], $container); $container->setParameter('lexik_form_filter.where_method', null); - $container->getCompilerPassConfig()->setOptimizationPasses(array()); - $container->getCompilerPassConfig()->setRemovingPasses(array()); + foreach ($configs as $extension => $config) { + $container->loadFromExtension($extension, $config); + } + + $container->getCompilerPassConfig()->setOptimizationPasses([new ResolveChildDefinitionsPass()]); + $container->getCompilerPassConfig()->setRemovingPasses([]); $container->addCompilerPass(new FormDataExtractorPass()); - $container->addCompilerPass(new \Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass()); + $container->addCompilerPass(new RegisterListenersPass()); $container->compile(); return $container; } } + diff --git a/composer.json b/composer.json index 38868a7..4568d6d 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,6 @@ "keywords": ["Symfony", "bundle", "form", "filter", "doctrine"], "homepage": "https://github.com/lexik/LexikFormFilterBundle", "license": "MIT", - "minimum-stability": "dev", "prefer-stable": true, "authors": [ { @@ -18,20 +17,21 @@ } ], "require": { - "php": ">=5.5.9", + "php": ">=7.0", "doctrine/orm": "^2.4.8", - "symfony/framework-bundle": "~2.8|~3.0|^4.0", - "symfony/form": "~2.8|~3.0|^4.0" + "symfony/form": "^4.0|^5.0", + "symfony/framework-bundle": "^4.0|^5.0" }, "require-dev": { - "doctrine/mongodb-odm-bundle": "^3.0", - "phpunit/phpunit": "~5.0|^7.5" + "doctrine/doctrine-bundle": "^1.8 || ^2.0", + "doctrine/mongodb-odm-bundle": "^4.1", + "symfony/phpunit-bridge": "^4.0|^5.0", + "symfony/var-dumper": "^4.0|^5.0" }, "autoload": { "psr-4": { "Lexik\\Bundle\\FormFilterBundle\\": "" } }, "config": { - "bin-dir": "bin", "sort-packages": true }, "extra": { @@ -41,5 +41,10 @@ }, "suggest": { "alcaeus/mongo-php-adapter": "Install this package if using the PHP 7 MongoDB Driver" + }, + "scripts": { + "test": [ + "vendor/bin/simple-phpunit" + ] } } diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 3899c7f..652a020 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,18 +1,15 @@ - - + bootstrap="vendor/autoload.php" + > + ./Tests/ @@ -25,11 +22,16 @@ ./Resources ./Tests + ./vendor - + + + + +