diff --git a/src/Input.php b/src/Input.php index cd0a507c..2eda11ee 100644 --- a/src/Input.php +++ b/src/Input.php @@ -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()); diff --git a/test/ArrayInputTest.php b/test/ArrayInputTest.php index f0ec6e34..4d613aed 100644 --- a/test/ArrayInputTest.php +++ b/test/ArrayInputTest.php @@ -13,6 +13,7 @@ use Zend\Filter; use Zend\InputFilter\ArrayInput; use Zend\InputFilter\Exception\InvalidArgumentException; +use Zend\InputFilter\Input; use Zend\Validator; /** @@ -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()); @@ -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(); diff --git a/test/FileInputTest.php b/test/FileInputTest.php index f901153c..1c9f12c5 100644 --- a/test/FileInputTest.php +++ b/test/FileInputTest.php @@ -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'; @@ -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() { diff --git a/test/InputTest.php b/test/InputTest.php index 3f98fe63..a24d47ca 100644 --- a/test/InputTest.php +++ b/test/InputTest.php @@ -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; @@ -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()); @@ -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 @@ -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; @@ -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. *