diff --git a/tests/FormModelTest.php b/tests/FormModelTest.php index 5718c42..0dac5b8 100644 --- a/tests/FormModelTest.php +++ b/tests/FormModelTest.php @@ -18,6 +18,7 @@ use Yiisoft\FormModel\Tests\Support\Form\FormWithNestedStructures; use Yiisoft\FormModel\Tests\Support\Form\LoginForm; use Yiisoft\FormModel\Tests\Support\Form\NestedForm; +use Yiisoft\FormModel\Tests\Support\Form\NestedRuleForm\MainForm; use Yiisoft\FormModel\Tests\Support\StubInputField; use Yiisoft\FormModel\Tests\Support\TestHelper; use Yiisoft\Test\Support\Container\SimpleContainer; @@ -414,4 +415,31 @@ public function testFormWithNestedStructures(): void $this->assertSame('12.24', $coordinates->getLatitude()); $this->assertSame('56.78', $coordinates->getLongitude()); } + + /** + * @see https://github.com/yiisoft/form-model/issues/7 + */ + public function testNestedRuleWithFormModels(): void + { + $form = new MainForm(); + + TestHelper::createFormHydrator()->populate( + $form, + [ + 'value' => 'main-form', + 'firstLevelForm.secondLevelForm.float' => '-7.1', + ], + scope: '' + ); + + $result = $form->getValidationResult(); + + $this->assertFalse($result->isValid()); + $this->assertSame( + [ + 'firstLevelForm.secondLevelForm.float' => ['Value must be no less than 0.'] + ], + $result->getErrorMessagesIndexedByPath() + ); + } } diff --git a/tests/Support/Form/NestedRuleForm/FirstLevelForm.php b/tests/Support/Form/NestedRuleForm/FirstLevelForm.php new file mode 100644 index 0000000..8d7260b --- /dev/null +++ b/tests/Support/Form/NestedRuleForm/FirstLevelForm.php @@ -0,0 +1,29 @@ +secondLevelForm = new SecondLevelForm(); + } + + public function getRules(): array + { + return [ + 'number' => new Integer(min: 1), + 'secondLevelForm' => new Nested(), + ]; + } +} diff --git a/tests/Support/Form/NestedRuleForm/MainForm.php b/tests/Support/Form/NestedRuleForm/MainForm.php new file mode 100644 index 0000000..9d5d3c2 --- /dev/null +++ b/tests/Support/Form/NestedRuleForm/MainForm.php @@ -0,0 +1,29 @@ +firstLevelForm = new FirstLevelForm(); + } + + public function getRules(): array + { + return [ + 'value' => new Required(), + 'firstLevelForm' => new Nested(), + ]; + } +} diff --git a/tests/Support/Form/NestedRuleForm/SecondLevelForm.php b/tests/Support/Form/NestedRuleForm/SecondLevelForm.php new file mode 100644 index 0000000..972e4af --- /dev/null +++ b/tests/Support/Form/NestedRuleForm/SecondLevelForm.php @@ -0,0 +1,21 @@ + new Number(min: 0), + ]; + } +}