Skip to content
This repository was archived by the owner on Jan 30, 2020. It is now read-only.

Deprecate BaseInputFilter and fix for BaseInputFilter::add() contract violation #18

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
"zendframework/zend-i18n": "~2.5",
"zendframework/zend-servicemanager": "~2.5",
"fabpot/php-cs-fixer": "1.7.*",
"maks3w/phpunit-methods-trait": "^4.6",
"phpunit/php-code-coverage": "2.1.*",
"phpunit/PHPUnit": "~4.0"
},
"suggest": {
Expand Down
51 changes: 47 additions & 4 deletions src/BaseInputFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
use Zend\Stdlib\ArrayUtils;
use Zend\Stdlib\InitializableInterface;

/**
* @deprecated 2.5.5 Use `Zend\InputFilter\InputFilter` instead.
*/
class BaseInputFilter implements
InputFilterInterface,
UnknownInputsCapableInterface,
Expand All @@ -25,6 +28,11 @@ class BaseInputFilter implements
*/
protected $data;

/**
* @var Factory
*/
protected $factory;

/**
* @var InputInterface[]|InputFilterInterface[]
*/
Expand All @@ -45,6 +53,33 @@ class BaseInputFilter implements
*/
protected $validInputs;

/**
* Set factory to use when adding inputs and filters by spec
*
* @param Factory $factory
* @return InputFilter
*/
public function setFactory(Factory $factory)
{
$this->factory = $factory;
return $this;
}

/**
* Get factory to use when adding inputs and filters by spec
*
* Lazy-loads a Factory instance if none attached.
*
* @return Factory
*/
public function getFactory()
{
if (null === $this->factory) {
$this->setFactory(new Factory());
}
return $this->factory;
}

/**
* This function is automatically called when creating element with factory. It
* allows to perform various operations (add elements...)
Expand All @@ -70,19 +105,27 @@ public function count()
/**
* Add an input to the input filter
*
* @param InputInterface|InputFilterInterface $input
* @param InputInterface|InputFilterInterface|array|Traversable|InputProviderInterface $input
* @param null|string $name Name used to retrieve this input
* @throws Exception\InvalidArgumentException
* @return InputFilterInterface
*/
public function add($input, $name = null)
{
if (is_array($input) || $input instanceof Traversable || $input instanceof InputProviderInterface) {
$factory = $this->getFactory();
$input = $factory->createInput($input);
}

if (!$input instanceof InputInterface && !$input instanceof InputFilterInterface) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects an instance of %s or %s as its first argument; received "%s"',
'%s expects an instance of %s, %s, %s, %s or %s as its first argument; received "%s"',
__METHOD__,
'Zend\InputFilter\InputInterface',
'Zend\InputFilter\InputFilterInterface',
InputInterface::class,
InputFilterInterface::class,
'array',
Traversable::class,
InputProviderInterface::class,
(is_object($input) ? get_class($input) : gettype($input))
));
}
Expand Down
51 changes: 0 additions & 51 deletions src/InputFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,57 +9,6 @@

namespace Zend\InputFilter;

use Traversable;

class InputFilter extends BaseInputFilter
{
/**
* @var Factory
*/
protected $factory;

/**
* Set factory to use when adding inputs and filters by spec
*
* @param Factory $factory
* @return InputFilter
*/
public function setFactory(Factory $factory)
{
$this->factory = $factory;
return $this;
}

/**
* Get factory to use when adding inputs and filters by spec
*
* Lazy-loads a Factory instance if none attached.
*
* @return Factory
*/
public function getFactory()
{
if (null === $this->factory) {
$this->setFactory(new Factory());
}
return $this->factory;
}

/**
* Add an input to the input filter
*
* @param array|Traversable|InputInterface|InputFilterInterface $input
* @param null|string $name
* @return InputFilter
*/
public function add($input, $name = null)
{
if (is_array($input)
|| ($input instanceof Traversable && !$input instanceof InputFilterInterface)
) {
$factory = $this->getFactory();
$input = $factory->createInput($input);
}
return parent::add($input, $name);
}
}
2 changes: 1 addition & 1 deletion src/InputFilterInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ interface InputFilterInterface extends Countable
/**
* Add an input to the input filter
*
* @param InputInterface|InputFilterInterface|array $input
* @param InputInterface|InputFilterInterface|array|Traversable|InputProviderInterface $input
* @param null|string $name Name used to retrieve this input
* @return InputFilterInterface
*/
Expand Down
150 changes: 114 additions & 36 deletions test/BaseInputFilterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,61 +10,42 @@
namespace ZendTest\InputFilter;

use ArrayObject;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
use PHPUnit_Framework_TestCase as TestCase;
use stdClass;
use Zend\InputFilter\CollectionInputFilter;
use Zend\InputFilter\Exception\InvalidArgumentException;
use Zend\InputFilter\Factory;
use Zend\InputFilter\Input;
use Zend\InputFilter\InputInterface;
use Zend\InputFilter\FileInput;
use Zend\InputFilter\BaseInputFilter as InputFilter;
use Zend\Filter;
use Zend\Validator;

/**
* @covers Zend\InputFilter\BaseInputFilter
*/
class BaseInputFilterTest extends TestCase
{
use InputFilterInterfaceTestTrait;

public function testInputFilterIsEmptyByDefault()
{
$filter = new InputFilter();
$this->assertEquals(0, count($filter));
}

public function testAddingInputsIncreasesCountOfFilter()
{
$filter = new InputFilter();
$foo = new Input('foo');
$filter->add($foo);
$this->assertEquals(1, count($filter));
$bar = new Input('bar');
$filter->add($bar);
$this->assertEquals(2, count($filter));
}

public function testAddingInputWithNameDoesNotInjectNameInInput()
public function testAddWithInvalidInputTypeThrowsInvalidArgumentException()
{
$filter = new InputFilter();
$foo = new Input('foo');
$filter->add($foo, 'bar');
$test = $filter->get('bar');
$this->assertSame($foo, $test);
$this->assertEquals('foo', $foo->getName());
}

public function testCanAddInputFilterAsInput()
{
$parent = new InputFilter();
$child = new InputFilter();
$parent->add($child, 'child');
$this->assertEquals(1, count($parent));
$this->assertSame($child, $parent->get('child'));
}

public function testCanRemoveInputFilter()
{
$parent = new InputFilter();
$child = new InputFilter();
$parent->add($child, 'child');
$this->assertEquals(1, count($parent));
$this->assertSame($child, $parent->get('child'));
$parent->remove('child');
$this->assertEquals(0, count($parent));
$this->setExpectedException(
InvalidArgumentException::class,
'expects an instance of Zend\InputFilter\InputInterface, Zend\InputFilter\InputFilterInterface, array, '.
'Traversable or Zend\InputFilter\InputProviderInterface as its first argument; received "stdClass"'
);
$filter->add(new stdClass());
}

public function getInputFilter()
Expand Down Expand Up @@ -1114,4 +1095,101 @@ public function testAllowsValidatingArrayAccessData()
$filter->setData($data);
$this->assertTrue($filter->isValid());
}

public function testLazilyComposesAFactoryByDefault()
{
$filter = new InputFilter();

$factory = $filter->getFactory();
$this->assertInstanceOf(Factory::class, $factory);
}

public function testCanComposeAFactory()
{
$filter = new InputFilter();

/** @var Factory|MockObject $factory */
$factory = $this->getMock(Factory::class);
$filter->setFactory($factory);
$this->assertSame($factory, $filter->getFactory());
}

/**
* @covers \Zend\InputFilter\InputFilter::getValue
*
* @group 6028
*/
public function testGetValueReturnsArrayIfNestedInputFilters()
{
$filter = new InputFilter();

$inputFilter = new InputFilter();
$inputFilter->add(new Input(), 'name');

$filter->add($inputFilter, 'people');

$data = [
'people' => [
'name' => 'Wanderson'
]
];

$filter->setData($data);
$this->assertTrue($filter->isValid());

$this->assertInternalType('array', $filter->getValue('people'));
}

/**
* @group ZF2-5648
*/
public function testCountZeroValidateInternalInputWithCollectionInputFilter()
{
$filter = new InputFilter();

$inputFilter = new InputFilter();
$inputFilter->add(new Input(), 'name');

$collection = new CollectionInputFilter();
$collection->setInputFilter($inputFilter);
$collection->setCount(0);

$filter->add($collection, 'people');

$data = [
'people' => [
[
'name' => 'Wanderson',
],
],
];
$filter->setData($data);

$this->assertTrue($filter->isValid());
$this->assertSame($data, $filter->getValues());
}

public function testCanUseContextPassedToInputFilter()
{
$filter = new InputFilter();

$context = new \stdClass();

/** @var InputInterface|MockObject $input */
$input = $this->getMock(InputInterface::class);
$input->expects($this->once())->method('isValid')->with($context)->will($this->returnValue(true));
$input->method('getRawValue')->will($this->returnValue('Mwop'));

$filter->add($input, 'username');
$filter->setData(['username' => 'Mwop']);

$filter->isValid($context);
}

protected function createDefaultInputFilter()
{
$inputFilter = new InputFilter();

return $inputFilter;
}
}
9 changes: 9 additions & 0 deletions test/CollectionInputFilterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

class CollectionInputFilterTest extends TestCase
{
use InputFilterInterfaceTestTrait;

/**
* @var \Zend\InputFilter\CollectionInputFilter
*/
Expand Down Expand Up @@ -781,4 +783,11 @@ public function testInvalidCollectionIsNotValid()

$this->assertFalse($this->filter->isValid());
}

protected function createDefaultInputFilter()
{
$inputFilter = new CollectionInputFilter();

return $inputFilter;
}
}
Loading