From 4d13b14e3a2f04d379aa262a4c5096b7987ce726 Mon Sep 17 00:00:00 2001 From: Raul Robledo Date: Fri, 10 Mar 2023 20:30:55 -0600 Subject: [PATCH 1/3] Update testAllowsComposingChildEntities to validate fix for issue 22 Signed-off-by: Raul Robledo --- src/Annotation/ElementAnnotationsListener.php | 3 +- test/Annotation/AbstractBuilderTestCase.php | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/Annotation/ElementAnnotationsListener.php b/src/Annotation/ElementAnnotationsListener.php index 54ac51b41..b7d4bf410 100644 --- a/src/Annotation/ElementAnnotationsListener.php +++ b/src/Annotation/ElementAnnotationsListener.php @@ -156,7 +156,8 @@ public function handleComposedObjectAnnotation(EventInterface $e): void if (! isset($inputFilter['type'])) { $inputFilter['type'] = InputFilter::class; } - $e->setParam('inputSpec', $inputFilter); + $inputSpec = $e->getParam('inputSpec'); + $inputSpec->exchangeArray($inputFilter); unset($specification['input_filter']); // Compose specification as a fieldset into parent form/fieldset diff --git a/test/Annotation/AbstractBuilderTestCase.php b/test/Annotation/AbstractBuilderTestCase.php index 6d74ea16f..527b31ace 100644 --- a/test/Annotation/AbstractBuilderTestCase.php +++ b/test/Annotation/AbstractBuilderTestCase.php @@ -6,6 +6,7 @@ use ArrayObject; use Generator; +use Laminas\Filter\StringTrim; use Laminas\Form\Annotation; use Laminas\Form\Element; use Laminas\Form\Element\Collection; @@ -17,6 +18,9 @@ use Laminas\InputFilter\InputFilterInterface; use Laminas\InputFilter\InputInterface; use Laminas\Stdlib\PriorityList; +use Laminas\Validator\EmailAddress; +use Laminas\Validator\NotEmpty; +use Laminas\Validator\StringLength; use LaminasTest\Form\TestAsset; use LaminasTest\Form\TestAsset\Annotation\Entity; use LaminasTest\Form\TestAsset\Annotation\Form; @@ -215,6 +219,23 @@ public function testAllowsComposingChildEntities(): void self::assertInstanceOf(InputFilterInterface::class, $composed); self::assertTrue($composed->has('username')); self::assertTrue($composed->has('password')); + $usernameInput = $composed->get('username'); + $usernameValidators = $usernameInput->getValidatorChain()->getValidators(); + self::assertCount(2, $usernameValidators); + self::assertInstanceOf(NotEmpty::class, $usernameValidators[0]['instance']); + self::assertInstanceOf(StringLength::class, $usernameValidators[1]['instance']); + $usernameFilters = $usernameInput->getFilterChain()->getFilters()->toArray(); + self::assertCount(1, $usernameFilters); + self::assertInstanceOf(StringTrim::class, $usernameFilters[0]); + + $passwordInput = $composed->get('password'); + $passwordValidators = $passwordInput->getValidatorChain()->getValidators(); + self::assertCount(1, $passwordValidators); + self::assertInstanceOf(EmailAddress::class, $passwordValidators[0]['instance']); + + $passwordFilters = $passwordInput->getFilterChain()->getFilters()->toArray(); + self::assertCount(1, $passwordFilters); + self::assertInstanceOf(StringTrim::class, $passwordFilters[0]); } public function testAllowsComposingMultipleChildEntities(): void @@ -231,6 +252,47 @@ public function testAllowsComposingMultipleChildEntities(): void self::assertInstanceOf(FieldsetInterface::class, $target); self::assertTrue($target->has('username')); self::assertTrue($target->has('password')); + $filterSpec = $target->getInputFilterSpecification(); + self::assertArrayHasKey('username', $filterSpec); + self::assertArrayHasKey('password', $filterSpec); + $usernameFilterSpec = $filterSpec['username']; + self::assertEquals([ + 'name' => 'username', + 'error_message' => 'Invalid or missing username', + 'required' => 1, + 'filters' => [ + '0' => [ + 'name' => 'StringTrim' + ], + ], + 'validators' => [ + '0' => [ + 'name' => 'NotEmpty' + ], + 1 => [ + 'name' => 'StringLength', + 'options' => [ + 'min' => 3, + 'max' => 25 + ] + + ] + ] + ], $usernameFilterSpec); + $passwordFilterSpec = $filterSpec['password']; + self::assertEquals([ + 'name' => 'password', + 'filters' => [ + '0' => [ + 'name' => 'StringTrim' + ], + ], + 'validators' => [ + '0' => [ + 'name' => 'EmailAddress' + ] + ] + ], $passwordFilterSpec); } /** From a2895a817033cae893341b79553520495b1ffa23 Mon Sep 17 00:00:00 2001 From: Raul Robledo Date: Fri, 10 Mar 2023 20:44:37 -0600 Subject: [PATCH 2/3] Applying phpcbf Signed-off-by: Raul Robledo --- test/Annotation/AbstractBuilderTestCase.php | 41 ++++++++++----------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/test/Annotation/AbstractBuilderTestCase.php b/test/Annotation/AbstractBuilderTestCase.php index 527b31ace..049e40ba6 100644 --- a/test/Annotation/AbstractBuilderTestCase.php +++ b/test/Annotation/AbstractBuilderTestCase.php @@ -219,7 +219,7 @@ public function testAllowsComposingChildEntities(): void self::assertInstanceOf(InputFilterInterface::class, $composed); self::assertTrue($composed->has('username')); self::assertTrue($composed->has('password')); - $usernameInput = $composed->get('username'); + $usernameInput = $composed->get('username'); $usernameValidators = $usernameInput->getValidatorChain()->getValidators(); self::assertCount(2, $usernameValidators); self::assertInstanceOf(NotEmpty::class, $usernameValidators[0]['instance']); @@ -228,7 +228,7 @@ public function testAllowsComposingChildEntities(): void self::assertCount(1, $usernameFilters); self::assertInstanceOf(StringTrim::class, $usernameFilters[0]); - $passwordInput = $composed->get('password'); + $passwordInput = $composed->get('password'); $passwordValidators = $passwordInput->getValidatorChain()->getValidators(); self::assertCount(1, $passwordValidators); self::assertInstanceOf(EmailAddress::class, $passwordValidators[0]['instance']); @@ -257,41 +257,40 @@ public function testAllowsComposingMultipleChildEntities(): void self::assertArrayHasKey('password', $filterSpec); $usernameFilterSpec = $filterSpec['username']; self::assertEquals([ - 'name' => 'username', + 'name' => 'username', 'error_message' => 'Invalid or missing username', - 'required' => 1, - 'filters' => [ + 'required' => 1, + 'filters' => [ '0' => [ - 'name' => 'StringTrim' + 'name' => 'StringTrim', ], ], - 'validators' => [ + 'validators' => [ '0' => [ - 'name' => 'NotEmpty' + 'name' => 'NotEmpty', ], - 1 => [ - 'name' => 'StringLength', + 1 => [ + 'name' => 'StringLength', 'options' => [ 'min' => 3, - 'max' => 25 - ] - - ] - ] + 'max' => 25, + ], + ], + ], ], $usernameFilterSpec); $passwordFilterSpec = $filterSpec['password']; self::assertEquals([ - 'name' => 'password', - 'filters' => [ + 'name' => 'password', + 'filters' => [ '0' => [ - 'name' => 'StringTrim' + 'name' => 'StringTrim', ], ], 'validators' => [ '0' => [ - 'name' => 'EmailAddress' - ] - ] + 'name' => 'EmailAddress', + ], + ], ], $passwordFilterSpec); } From f181e75febf50c88135b1c8b325813ef8587f75b Mon Sep 17 00:00:00 2001 From: Raul Robledo Date: Fri, 10 Mar 2023 22:44:22 -0600 Subject: [PATCH 3/3] Fix psalm errors Signed-off-by: Raul Robledo --- test/Annotation/AbstractBuilderTestCase.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/test/Annotation/AbstractBuilderTestCase.php b/test/Annotation/AbstractBuilderTestCase.php index 049e40ba6..d12c604b6 100644 --- a/test/Annotation/AbstractBuilderTestCase.php +++ b/test/Annotation/AbstractBuilderTestCase.php @@ -12,6 +12,7 @@ use Laminas\Form\Element\Collection; use Laminas\Form\Fieldset; use Laminas\Form\FieldsetInterface; +use Laminas\Form\InputFilterProviderFieldset; use Laminas\Hydrator\ClassMethodsHydrator; use Laminas\Hydrator\ObjectPropertyHydrator; use Laminas\InputFilter\Input; @@ -21,6 +22,7 @@ use Laminas\Validator\EmailAddress; use Laminas\Validator\NotEmpty; use Laminas\Validator\StringLength; +use Laminas\Validator\ValidatorChain; use LaminasTest\Form\TestAsset; use LaminasTest\Form\TestAsset\Annotation\Entity; use LaminasTest\Form\TestAsset\Annotation\Form; @@ -219,8 +221,11 @@ public function testAllowsComposingChildEntities(): void self::assertInstanceOf(InputFilterInterface::class, $composed); self::assertTrue($composed->has('username')); self::assertTrue($composed->has('password')); - $usernameInput = $composed->get('username'); - $usernameValidators = $usernameInput->getValidatorChain()->getValidators(); + $usernameInput = $composed->get('username'); + self::assertInstanceOf(Input::class, $usernameInput); + $validatorChain = $usernameInput->getValidatorChain(); + self::assertInstanceOf(ValidatorChain::class, $validatorChain); + $usernameValidators = $validatorChain->getValidators(); self::assertCount(2, $usernameValidators); self::assertInstanceOf(NotEmpty::class, $usernameValidators[0]['instance']); self::assertInstanceOf(StringLength::class, $usernameValidators[1]['instance']); @@ -228,8 +233,10 @@ public function testAllowsComposingChildEntities(): void self::assertCount(1, $usernameFilters); self::assertInstanceOf(StringTrim::class, $usernameFilters[0]); - $passwordInput = $composed->get('password'); - $passwordValidators = $passwordInput->getValidatorChain()->getValidators(); + $passwordInput = $composed->get('password'); + self::assertInstanceOf(Input::class, $passwordInput); + $validatorChain = $passwordInput->getValidatorChain(); + $passwordValidators = $validatorChain->getValidators(); self::assertCount(1, $passwordValidators); self::assertInstanceOf(EmailAddress::class, $passwordValidators[0]['instance']); @@ -252,6 +259,7 @@ public function testAllowsComposingMultipleChildEntities(): void self::assertInstanceOf(FieldsetInterface::class, $target); self::assertTrue($target->has('username')); self::assertTrue($target->has('password')); + self::assertInstanceOf(InputFilterProviderFieldset::class, $target); $filterSpec = $target->getInputFilterSpecification(); self::assertArrayHasKey('username', $filterSpec); self::assertArrayHasKey('password', $filterSpec);