diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3a08b12796..9bb585d772 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -11,6 +11,7 @@ Yii Framework 2 Change Log - Bug #3042: `yii\widgets\Pjax` should end application right after it finishes responding to a pjax request (qiangxue) - Bug #3066: `yii\db\mssql\Schema::getTableSchema()` should return null when the table does not exist (qiangxue) - Bug #3091: Fixed inconsistent treatment of `Widget::run()` when a widget is used as a container and as a self-contained object (qiangxue) +- Bug #3118: Ensure client validation has the same behavior as server side validation for number validator (cebe) - Bug #3121: `yii\base\Application::bootstrap` may fail to load some components if they are specified as class names (qiangxue) - Bug #3125: `yii\console\controllers\AssetController` now respects data URL resources (klimov-paul) - Bug #3128: Fixed the bug that `defaultRoles` set in RBAC manager was not working as specified (qiangxue) diff --git a/framework/validators/NumberValidator.php b/framework/validators/NumberValidator.php index 1492213914..0d008fc5b0 100644 --- a/framework/validators/NumberValidator.php +++ b/framework/validators/NumberValidator.php @@ -128,14 +128,18 @@ class NumberValidator extends Validator ]; if ($this->min !== null) { - $options['min'] = $this->min; + // ensure numeric value to make javascript comparison equal to PHP comparison + // https://github.com/yiisoft/yii2/issues/3118 + $options['min'] = is_string($this->min) ? (float)$this->min : $this->min; $options['tooSmall'] = Yii::$app->getI18n()->format($this->tooSmall, [ 'attribute' => $label, 'min' => $this->min, ], Yii::$app->language); } if ($this->max !== null) { - $options['max'] = $this->max; + // ensure numeric value to make javascript comparison equal to PHP comparison + // https://github.com/yiisoft/yii2/issues/3118 + $options['max'] = is_string($this->max) ? (float)$this->max : $this->max; $options['tooBig'] = Yii::$app->getI18n()->format($this->tooBig, [ 'attribute' => $label, 'max' => $this->max, diff --git a/tests/unit/framework/validators/BooleanValidatorTest.php b/tests/unit/framework/validators/BooleanValidatorTest.php index 7447c4c0e2..520b985d69 100644 --- a/tests/unit/framework/validators/BooleanValidatorTest.php +++ b/tests/unit/framework/validators/BooleanValidatorTest.php @@ -6,7 +6,7 @@ use yii\validators\BooleanValidator; use yiiunit\TestCase; /** - * BooleanValidatorTest + * @group validators */ class BooleanValidatorTest extends TestCase { diff --git a/tests/unit/framework/validators/CompareValidatorTest.php b/tests/unit/framework/validators/CompareValidatorTest.php index c106539e23..b1af755807 100644 --- a/tests/unit/framework/validators/CompareValidatorTest.php +++ b/tests/unit/framework/validators/CompareValidatorTest.php @@ -6,6 +6,9 @@ use yii\validators\CompareValidator; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class CompareValidatorTest extends TestCase { protected function setUp() diff --git a/tests/unit/framework/validators/DateValidatorTest.php b/tests/unit/framework/validators/DateValidatorTest.php index c24ec2ef1a..58b508f0d3 100644 --- a/tests/unit/framework/validators/DateValidatorTest.php +++ b/tests/unit/framework/validators/DateValidatorTest.php @@ -7,6 +7,9 @@ use yii\validators\DateValidator; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class DateValidatorTest extends TestCase { protected function setUp() diff --git a/tests/unit/framework/validators/DefaultValueValidatorTest.php b/tests/unit/framework/validators/DefaultValueValidatorTest.php index cfa0f00a6a..80a0fdcdb1 100644 --- a/tests/unit/framework/validators/DefaultValueValidatorTest.php +++ b/tests/unit/framework/validators/DefaultValueValidatorTest.php @@ -6,7 +6,7 @@ use yii\validators\DefaultValueValidator; use yiiunit\TestCase; /** - * DefaultValueValidatorTest + * @group validators */ class DefaultValueValidatorTest extends TestCase { diff --git a/tests/unit/framework/validators/EmailValidatorTest.php b/tests/unit/framework/validators/EmailValidatorTest.php index 929914db8d..616ba1445a 100644 --- a/tests/unit/framework/validators/EmailValidatorTest.php +++ b/tests/unit/framework/validators/EmailValidatorTest.php @@ -6,7 +6,6 @@ use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; /** - * EmailValidatorTest * @group validators */ class EmailValidatorTest extends TestCase diff --git a/tests/unit/framework/validators/ExistValidatorDriverTests/ExistValidatorPostgresTest.php b/tests/unit/framework/validators/ExistValidatorDriverTests/ExistValidatorPostgresTest.php index 2e8d894071..af1d277f85 100644 --- a/tests/unit/framework/validators/ExistValidatorDriverTests/ExistValidatorPostgresTest.php +++ b/tests/unit/framework/validators/ExistValidatorDriverTests/ExistValidatorPostgresTest.php @@ -3,6 +3,9 @@ namespace yiiunit\framework\validators\ExistValidatorDriverTests; use yiiunit\framework\validators\ExistValidatorTest; +/** + * @group validators + */ class ExistValidatorPostgresTest extends ExistValidatorTest { protected $driverName = 'pgsql'; diff --git a/tests/unit/framework/validators/ExistValidatorDriverTests/ExistValidatorSQliteTest.php b/tests/unit/framework/validators/ExistValidatorDriverTests/ExistValidatorSQliteTest.php index f840afe9a1..f0e3345a35 100644 --- a/tests/unit/framework/validators/ExistValidatorDriverTests/ExistValidatorSQliteTest.php +++ b/tests/unit/framework/validators/ExistValidatorDriverTests/ExistValidatorSQliteTest.php @@ -3,6 +3,9 @@ namespace yiiunit\framework\validators\ExistValidatorDriverTests; use yiiunit\framework\validators\ExistValidatorTest; +/** + * @group validators + */ class ExistValidatorSQliteTest extends ExistValidatorTest { protected $driverName = 'sqlite'; diff --git a/tests/unit/framework/validators/ExistValidatorTest.php b/tests/unit/framework/validators/ExistValidatorTest.php index 757d11ca11..decbc4d37b 100644 --- a/tests/unit/framework/validators/ExistValidatorTest.php +++ b/tests/unit/framework/validators/ExistValidatorTest.php @@ -12,6 +12,9 @@ use yiiunit\data\validators\models\ValidatorTestMainModel; use yiiunit\data\validators\models\ValidatorTestRefModel; use yiiunit\framework\db\DatabaseTestCase; +/** + * @group validators + */ class ExistValidatorTest extends DatabaseTestCase { protected $driverName = 'mysql'; diff --git a/tests/unit/framework/validators/FileValidatorTest.php b/tests/unit/framework/validators/FileValidatorTest.php index bc790d11ec..6aa30b164c 100644 --- a/tests/unit/framework/validators/FileValidatorTest.php +++ b/tests/unit/framework/validators/FileValidatorTest.php @@ -8,6 +8,9 @@ use Yii; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class FileValidatorTest extends TestCase { public function setUp() diff --git a/tests/unit/framework/validators/FilterValidatorTest.php b/tests/unit/framework/validators/FilterValidatorTest.php index 920ca8df10..1b77047e50 100644 --- a/tests/unit/framework/validators/FilterValidatorTest.php +++ b/tests/unit/framework/validators/FilterValidatorTest.php @@ -6,6 +6,9 @@ use yii\validators\FilterValidator; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class FilterValidatorTest extends TestCase { protected function setUp() diff --git a/tests/unit/framework/validators/NumberValidatorTest.php b/tests/unit/framework/validators/NumberValidatorTest.php index a46809a261..47bb1bb654 100644 --- a/tests/unit/framework/validators/NumberValidatorTest.php +++ b/tests/unit/framework/validators/NumberValidatorTest.php @@ -3,9 +3,13 @@ namespace yiiunit\framework\validators; use yii\validators\NumberValidator; +use yii\web\View; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class NumberValidatorTest extends TestCase { protected function setUp() @@ -162,4 +166,46 @@ class NumberValidatorTest extends TestCase $msgs = $model->getErrors('attr_number'); $this->assertSame('attr_number is to small.', $msgs[0]); } + + /** + * https://github.com/yiisoft/yii2/issues/3118 + */ + public function testClientValidateComparison() + { + $val = new NumberValidator([ + 'min' => 5, + 'max' => 10, + ]); + $model = new FakedValidationModel(); + $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]])); + $this->assertContains('"min":5', $js); + $this->assertContains('"max":10', $js); + + $val = new NumberValidator([ + 'min' => '5', + 'max' => '10', + ]); + $model = new FakedValidationModel(); + $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]])); + $this->assertContains('"min":5', $js); + $this->assertContains('"max":10', $js); + + $val = new NumberValidator([ + 'min' => 5.65, + 'max' => 13.37, + ]); + $model = new FakedValidationModel(); + $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]])); + $this->assertContains('"min":5.65', $js); + $this->assertContains('"max":13.37', $js); + + $val = new NumberValidator([ + 'min' => '5.65', + 'max' => '13.37', + ]); + $model = new FakedValidationModel(); + $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]])); + $this->assertContains('"min":5.65', $js); + $this->assertContains('"max":13.37', $js); + } } diff --git a/tests/unit/framework/validators/RangeValidatorTest.php b/tests/unit/framework/validators/RangeValidatorTest.php index 0c27412a1c..1124e76237 100644 --- a/tests/unit/framework/validators/RangeValidatorTest.php +++ b/tests/unit/framework/validators/RangeValidatorTest.php @@ -6,6 +6,9 @@ use yii\validators\RangeValidator; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class RangeValidatorTest extends TestCase { protected function setUp() diff --git a/tests/unit/framework/validators/RegularExpressionValidatorTest.php b/tests/unit/framework/validators/RegularExpressionValidatorTest.php index c6226da327..e9c3ce7557 100644 --- a/tests/unit/framework/validators/RegularExpressionValidatorTest.php +++ b/tests/unit/framework/validators/RegularExpressionValidatorTest.php @@ -6,6 +6,9 @@ use yii\validators\RegularExpressionValidator; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class RegularExpressionValidatorTest extends TestCase { protected function setUp() diff --git a/tests/unit/framework/validators/RequiredValidatorTest.php b/tests/unit/framework/validators/RequiredValidatorTest.php index 2e892d614e..ce62773154 100644 --- a/tests/unit/framework/validators/RequiredValidatorTest.php +++ b/tests/unit/framework/validators/RequiredValidatorTest.php @@ -5,6 +5,9 @@ use yii\validators\RequiredValidator; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class RequiredValidatorTest extends TestCase { protected function setUp() diff --git a/tests/unit/framework/validators/StringValidatorTest.php b/tests/unit/framework/validators/StringValidatorTest.php index c7afc78a75..3f6100ffc0 100644 --- a/tests/unit/framework/validators/StringValidatorTest.php +++ b/tests/unit/framework/validators/StringValidatorTest.php @@ -6,6 +6,9 @@ use yii\validators\StringValidator; use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\TestCase; +/** + * @group validators + */ class StringValidatorTest extends TestCase { public function setUp() diff --git a/tests/unit/framework/validators/UniqueValidatorDriverTests/UniqueValidatorPostgresTest.php b/tests/unit/framework/validators/UniqueValidatorDriverTests/UniqueValidatorPostgresTest.php index 64a663024a..d8921937cb 100644 --- a/tests/unit/framework/validators/UniqueValidatorDriverTests/UniqueValidatorPostgresTest.php +++ b/tests/unit/framework/validators/UniqueValidatorDriverTests/UniqueValidatorPostgresTest.php @@ -4,6 +4,9 @@ namespace yiiunit\framework\validators\UniqueValidatorDriverTests; use yiiunit\framework\validators\UniqueValidatorTest; +/** + * @group validators + */ class UniqueValidatorPostgresTest extends UniqueValidatorTest { protected $driverName = 'pgsql'; diff --git a/tests/unit/framework/validators/UniqueValidatorDriverTests/UniqueValidatorSQliteTest.php b/tests/unit/framework/validators/UniqueValidatorDriverTests/UniqueValidatorSQliteTest.php index a291853041..bd4ceb97e1 100644 --- a/tests/unit/framework/validators/UniqueValidatorDriverTests/UniqueValidatorSQliteTest.php +++ b/tests/unit/framework/validators/UniqueValidatorDriverTests/UniqueValidatorSQliteTest.php @@ -4,6 +4,9 @@ namespace yiiunit\framework\validators\UniqueValidatorDriverTests; use yiiunit\framework\validators\UniqueValidatorTest; +/** + * @group validators + */ class UniqueValidatorSQliteTest extends UniqueValidatorTest { protected $driverName = 'sqlite'; diff --git a/tests/unit/framework/validators/UniqueValidatorTest.php b/tests/unit/framework/validators/UniqueValidatorTest.php index 5ad9c6e017..7a1b805725 100644 --- a/tests/unit/framework/validators/UniqueValidatorTest.php +++ b/tests/unit/framework/validators/UniqueValidatorTest.php @@ -12,6 +12,9 @@ use yiiunit\data\validators\models\ValidatorTestMainModel; use yiiunit\data\validators\models\ValidatorTestRefModel; use yiiunit\framework\db\DatabaseTestCase; +/** + * @group validators + */ class UniqueValidatorTest extends DatabaseTestCase { protected $driverName = 'mysql'; diff --git a/tests/unit/framework/validators/UrlValidatorTest.php b/tests/unit/framework/validators/UrlValidatorTest.php index 74cc3e89ab..5ae66c9502 100644 --- a/tests/unit/framework/validators/UrlValidatorTest.php +++ b/tests/unit/framework/validators/UrlValidatorTest.php @@ -7,7 +7,7 @@ use yii\validators\UrlValidator; use yiiunit\TestCase; /** - * UrlValidatorTest + * @group validators */ class UrlValidatorTest extends TestCase { diff --git a/tests/unit/framework/validators/ValidatorTest.php b/tests/unit/framework/validators/ValidatorTest.php index e93153b294..2da0e8b7f7 100644 --- a/tests/unit/framework/validators/ValidatorTest.php +++ b/tests/unit/framework/validators/ValidatorTest.php @@ -9,6 +9,9 @@ use yiiunit\data\validators\models\FakedValidationModel; use yiiunit\data\validators\TestValidator; use yiiunit\TestCase; +/** + * @group validators + */ class ValidatorTest extends TestCase { protected function setUp()