Skip to content

Commit

Permalink
Merge pull request #21 from darckking/1.11.x-do-not-overwrite-custom-…
Browse files Browse the repository at this point in the history
…collection-input-filter

Do not overwrite custom CollectionInputFilter.
  • Loading branch information
weierophinney committed Jan 11, 2022
2 parents bf606f1 + 4c5df3d commit b0969bd
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 2 deletions.
3 changes: 2 additions & 1 deletion psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,8 @@
<code>getBodyParams</code>
<code>getBodyParams</code>
</MixedMethodCall>
<PossiblyInvalidArgument occurrences="50">
<PossiblyInvalidArgument occurrences="51">
<code>$matches</code>
<code>$matches</code>
<code>$matches</code>
<code>$matches</code>
Expand Down
5 changes: 4 additions & 1 deletion src/ContentValidationListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,10 @@ public function onRoute(MvcEvent $e)

$inputFilter = $this->getInputFilter($inputFilterService);

if ($isCollection && ! in_array($method, $this->methodsWithoutBodies)) {
if (
$isCollection && ! in_array($method, $this->methodsWithoutBodies)
&& ! $inputFilter instanceof CollectionInputFilter
) {
$collectionInputFilter = new CollectionInputFilter();
$collectionInputFilter->setInputFilter($inputFilter);
$inputFilter = $collectionInputFilter;
Expand Down
49 changes: 49 additions & 0 deletions test/ContentValidationListenerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2945,4 +2945,53 @@ public function testRemoveEmptyDataIsNotSetSoEmptyDataAreNotRemoved(): void
$dataParams->getBodyParams()
);
}

/**
* @dataProvider listMethods
*/
public function testDoNotOverwriteCustomCollectionInputFilter(string $method): void
{
$services = new ServiceManager();

$customCollectionInputFilter = new TestAsset\CustomCollectionInputFilter();
$customCollectionInputFilter->setInputFilter(
[
'foo' => [
'name' => 'foo',
'required' => false,
],
]
);

$services->setService(TestAsset\CustomCollectionInputFilter::class, $customCollectionInputFilter);
$listener = new ContentValidationListener(
[
'Foo' => ["{$method}_COLLECTION" => TestAsset\CustomCollectionInputFilter::class],
],
$services,
[
'Foo' => 'foo_id',
]
);

$request = new HttpRequest();
$request->setMethod($method);

$matches = $this->createRouteMatch(['controller' => 'Foo']);

$dataParams = new ParameterDataContainer();
$dataParams->setBodyParams([['foo' => '']]);

$event = new MvcEvent();
$event->setName('route');
$event->setRequest($request);
$event->setRouteMatch($matches);
$event->setParam('LaminasContentNegotiationParameterData', $dataParams);
// if ContentValidationListener overwrites CustomCollectionInputFilter with instance of CollectionInputFilter
// it sets CustomCollectionInputFilter to CollectionInputFilter::inputFilter property
// as a consequence it throws InvalidArgumentException in CollectionInputFilter::setData()
$this->assertNull($listener->onRoute($event));
$inputFilter = $event->getParam('Laminas\ApiTools\ContentValidation\InputFilter');
$this->assertInstanceOf(TestAsset\CustomCollectionInputFilter::class, $inputFilter);
}
}
18 changes: 18 additions & 0 deletions test/TestAsset/CustomCollectionInputFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace LaminasTest\ApiTools\ContentValidation\TestAsset;

use Laminas\InputFilter\CollectionInputFilter;

class CustomCollectionInputFilter extends CollectionInputFilter
{
/**
* @param mixed $context
*/
public function isValid($context = null): bool
{
return true;
}
}

0 comments on commit b0969bd

Please sign in to comment.