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

Consolidate of InputInterface::merge and Fix unsafe merge #44

Merged
Merged
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
4 changes: 3 additions & 1 deletion src/Input.php
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,9 @@ public function clearFallbackValue()
public function merge(InputInterface $input)
{
$this->setBreakOnFailure($input->breakOnFailure());
$this->setContinueIfEmpty($input->continueIfEmpty());
if ($input instanceof Input) {
$this->setContinueIfEmpty($input->continueIfEmpty());
}
$this->setErrorMessage($input->getErrorMessage());
$this->setName($input->getName());
$this->setRequired($input->isRequired());
Expand Down
46 changes: 21 additions & 25 deletions test/ArrayInputTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use Zend\Filter;
use Zend\InputFilter\ArrayInput;
use Zend\InputFilter\Exception\InvalidArgumentException;
use Zend\InputFilter\Input;
use Zend\Validator;

/**
Expand Down Expand Up @@ -122,31 +123,6 @@ public function testRequiredNotEmptyValidatorNotAddedWhenOneExists()
$this->assertEquals($notEmptyMock, $validators[0]['instance']);
}

public function testMerge()
{
$input = new ArrayInput('foo');
$input->setValue([' 123 ']);
$filter = new Filter\StringTrim();
$input->getFilterChain()->attach($filter);
$validator = new Validator\Digits();
$input->getValidatorChain()->attach($validator);

$input2 = new ArrayInput('bar');
$input2->merge($input);
$validatorChain = $input->getValidatorChain();
$filterChain = $input->getFilterChain();

$this->assertEquals([' 123 '], $input2->getRawValue());
$this->assertEquals(1, $validatorChain->count());
$this->assertEquals(1, $filterChain->count());

$validators = $validatorChain->getValidators();
$this->assertInstanceOf(Validator\Digits::class, $validators[0]['instance']);

$filters = $filterChain->getFilters()->toArray();
$this->assertInstanceOf(Filter\StringTrim::class, $filters[0]);
}

public function testDoNotInjectNotEmptyValidatorIfAnywhereInChain()
{
$this->assertTrue($this->input->isRequired());
Expand Down Expand Up @@ -186,6 +162,26 @@ public function testNotAllowEmptyWithFilterConvertsEmptyToNonEmptyIsValid()
$this->assertTrue($this->input->isValid());
}

public function testMerge($sourceRawValue = 'bazRawValue')
{
parent::testMerge([$sourceRawValue]);
}

public function testInputMerge()
{
$source = new Input();
$source->setValue([]);
$source->setContinueIfEmpty(true);

$target = $this->input;
$target->setContinueIfEmpty(false);

$return = $target->merge($source);
$this->assertSame($target, $return, 'merge() must return it self');

$this->assertEquals(true, $target->continueIfEmpty(), 'continueIfEmpty() value not match');
}

public function fallbackValueVsIsValidProvider()
{
$dataSets = parent::fallbackValueVsIsValidProvider();
Expand Down
49 changes: 20 additions & 29 deletions test/FileInputTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -328,35 +328,6 @@ public function testFallbackValueVsIsValidRulesWhenValueNotSet(
$this->markTestSkipped('Input::setFallbackValue is not implemented on FileInput');
}

public function testMerge()
{
$value = ['tmp_name' => 'bar'];

$input = new FileInput('foo');
$input->setAutoPrependUploadValidator(false);
$input->setValue($value);
$filter = new Filter\StringTrim();
$input->getFilterChain()->attach($filter);
$validator = new Validator\Digits();
$input->getValidatorChain()->attach($validator);

$input2 = new FileInput('bar');
$input2->merge($input);
$validatorChain = $input->getValidatorChain();
$filterChain = $input->getFilterChain();

$this->assertFalse($input2->getAutoPrependUploadValidator());
$this->assertEquals($value, $input2->getRawValue());
$this->assertEquals(1, $validatorChain->count());
$this->assertEquals(1, $filterChain->count());

$validators = $validatorChain->getValidators();
$this->assertInstanceOf(Validator\Digits::class, $validators[0]['instance']);

$filters = $filterChain->getFilters()->toArray();
$this->assertInstanceOf(Filter\StringTrim::class, $filters[0]);
}

public function testIsEmptyFileNotArray()
{
$rawValue = 'file';
Expand Down Expand Up @@ -415,6 +386,26 @@ public function testNotAllowEmptyWithFilterConvertsEmptyToNonEmptyIsValid()
$this->markTestSkipped('does not apply to FileInput');
}

/**
* Specific FileInput::merge extras
*/
public function testFileInputMerge()
{
$source = new FileInput();
$source->setAutoPrependUploadValidator(true);

$target = $this->input;
$target->setAutoPrependUploadValidator(false);

$return = $target->merge($source);
$this->assertSame($target, $return, 'merge() must return it self');

$this->assertEquals(
true,
$target->getAutoPrependUploadValidator(),
'getAutoPrependUploadValidator() value not match'
);
}

public function isRequiredVsAllowEmptyVsContinueIfEmptyVsIsValidProvider()
{
Expand Down
132 changes: 82 additions & 50 deletions test/InputTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
use PHPUnit_Framework_TestCase as TestCase;
use stdClass;
use Zend\Filter;
use Zend\Filter\FilterChain;
use Zend\InputFilter\Input;
use Zend\InputFilter\InputInterface;
use Zend\Validator;
use Zend\Validator\ValidatorChain;

Expand Down Expand Up @@ -300,31 +302,6 @@ public function testNotAllowEmptyWithFilterConvertsEmptyToNonEmptyIsValid()
$this->assertTrue($this->input->isValid());
}

public function testMerge()
{
$input = new Input('foo');
$input->setValue(' 123 ');
$filter = new Filter\StringTrim();
$input->getFilterChain()->attach($filter);
$validator = new Validator\Digits();
$input->getValidatorChain()->attach($validator);

$input2 = new Input('bar');
$input2->merge($input);
$validatorChain = $input->getValidatorChain();
$filterChain = $input->getFilterChain();

$this->assertEquals(' 123 ', $input2->getRawValue());
$this->assertEquals(1, $validatorChain->count());
$this->assertEquals(1, $filterChain->count());

$validators = $validatorChain->getValidators();
$this->assertInstanceOf(Validator\Digits::class, $validators[0]['instance']);

$filters = $filterChain->getFilters()->toArray();
$this->assertInstanceOf(Filter\StringTrim::class, $filters[0]);
}

public function testDoNotInjectNotEmptyValidatorIfAnywhereInChain()
{
$this->assertTrue($this->input->isRequired());
Expand All @@ -346,31 +323,6 @@ public function testDoNotInjectNotEmptyValidatorIfAnywhereInChain()
$this->assertEquals($notEmptyMock, $validators[1]['instance']);
}

public function testMergeRetainsContinueIfEmptyFlag()
{
$input = new Input('foo');
$input->setContinueIfEmpty(true);

$input2 = new Input('bar');
$input2->merge($input);
$this->assertTrue($input2->continueIfEmpty());
}

public function testMergeRetainsAllowEmptyFlag()
{
$input = new Input('foo');
$input->setRequired(true);
$input->setAllowEmpty(true);

$input2 = new Input('bar');
$input2->setRequired(true);
$input2->setAllowEmpty(false);
$input2->merge($input);

$this->assertTrue($input2->isRequired());
$this->assertTrue($input2->allowEmpty());
}

/**
* @group 7448
* @dataProvider isRequiredVsAllowEmptyVsContinueIfEmptyVsIsValidProvider
Expand Down Expand Up @@ -429,6 +381,64 @@ public function testResetValueReturnsInputValueToDefaultValue($value)
$this->assertEquals($originalInput, $input, 'Input was not reset to the default value state');
}

public function testMerge($sourceRawValue = 'bazRawValue')
{
$source = $this->createInputInterfaceMock();
$source->method('getName')->willReturn('bazInput');
$source->method('getErrorMessage')->willReturn('bazErrorMessage');
$source->method('breakOnFailure')->willReturn(true);
$source->method('isRequired')->willReturn(true);
$source->method('getRawValue')->willReturn($sourceRawValue);
$source->method('getFilterChain')->willReturn($this->createFilterChainMock());
$source->method('getValidatorChain')->willReturn($this->createValidatorChainMock());

$targetFilterChain = $this->createFilterChainMock();
$targetFilterChain->expects(TestCase::once())
->method('merge')
->with($source->getFilterChain())
;

$targetValidatorChain = $this->createValidatorChainMock();
$targetValidatorChain->expects(TestCase::once())
->method('merge')
->with($source->getValidatorChain())
;

$target = $this->input;
$target->setName('fooInput');
$target->setErrorMessage('fooErrorMessage');
$target->setBreakOnFailure(false);
$target->setRequired(false);
$target->setFilterChain($targetFilterChain);
$target->setValidatorChain($targetValidatorChain);

$return = $target->merge($source);
$this->assertSame($target, $return, 'merge() must return it self');

$this->assertEquals('bazInput', $target->getName(), 'getName() value not match');
$this->assertEquals('bazErrorMessage', $target->getErrorMessage(), 'getErrorMessage() value not match');
$this->assertEquals(true, $target->breakOnFailure(), 'breakOnFailure() value not match');
$this->assertEquals(true, $target->isRequired(), 'isRequired() value not match');
$this->assertEquals($sourceRawValue, $target->getRawValue(), 'getRawValue() value not match');
}

/**
* Specific Input::merge extras
*/
public function testInputMerge()
{
$source = new Input();
$source->setContinueIfEmpty(true);

$target = $this->input;
$target->setContinueIfEmpty(false);

$return = $target->merge($source);
$this->assertSame($target, $return, 'merge() must return it self');

$this->assertEquals(true, $target->continueIfEmpty(), 'continueIfEmpty() value not match');
}

public function fallbackValueVsIsValidProvider()
{
$required = true;
Expand Down Expand Up @@ -558,6 +568,28 @@ public function mixedValueProvider()
];
}

/**
* @return InputInterface|MockObject|
*/
protected function createInputInterfaceMock()
{
/** @var InputInterface|MockObject $source */
$source = $this->getMock(InputInterface::class);

return $source;
}

/**
* @return FilterChain|MockObject
*/
protected function createFilterChainMock()
{
/** @var FilterChain|MockObject $filterChain */
$filterChain = $this->getMock(FilterChain::class);

return $filterChain;
}

/**
* @param null|bool $isValid If set stub isValid method for return the argument value.
*
Expand Down