Skip to content

Commit

Permalink
Merge pull request #207 from riul88/hotfix/22
Browse files Browse the repository at this point in the history
Fixes #22: "ComposedObject" Annotation does not add inputSpec to element configuration
  • Loading branch information
Slamdunk authored Mar 13, 2023
2 parents 0ee5537 + f181e75 commit 843056a
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/Annotation/ElementAnnotationsListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
69 changes: 69 additions & 0 deletions test/Annotation/AbstractBuilderTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,23 @@

use ArrayObject;
use Generator;
use Laminas\Filter\StringTrim;
use Laminas\Form\Annotation;
use Laminas\Form\Element;
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;
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 Laminas\Validator\ValidatorChain;
use LaminasTest\Form\TestAsset;
use LaminasTest\Form\TestAsset\Annotation\Entity;
use LaminasTest\Form\TestAsset\Annotation\Form;
Expand Down Expand Up @@ -215,6 +221,28 @@ public function testAllowsComposingChildEntities(): void
self::assertInstanceOf(InputFilterInterface::class, $composed);
self::assertTrue($composed->has('username'));
self::assertTrue($composed->has('password'));
$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']);
$usernameFilters = $usernameInput->getFilterChain()->getFilters()->toArray();
self::assertCount(1, $usernameFilters);
self::assertInstanceOf(StringTrim::class, $usernameFilters[0]);

$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']);

$passwordFilters = $passwordInput->getFilterChain()->getFilters()->toArray();
self::assertCount(1, $passwordFilters);
self::assertInstanceOf(StringTrim::class, $passwordFilters[0]);
}

public function testAllowsComposingMultipleChildEntities(): void
Expand All @@ -231,6 +259,47 @@ 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);
$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);
}

/**
Expand Down

0 comments on commit 843056a

Please sign in to comment.