diff options
-rw-r--r-- | src/Http/Validation/Rules/Between.php | 10 | ||||
-rw-r--r-- | src/Http/Validation/Rules/Max.php | 10 | ||||
-rw-r--r-- | src/Http/Validation/Rules/Min.php | 10 | ||||
-rw-r--r-- | src/Http/Validation/Rules/StringInputLength.php | 44 | ||||
-rw-r--r-- | tests/Unit/Http/Validation/Rules/BetweenTest.php | 28 | ||||
-rw-r--r-- | tests/Unit/Http/Validation/Rules/MaxTest.php | 26 | ||||
-rw-r--r-- | tests/Unit/Http/Validation/Rules/MinTest.php | 26 | ||||
-rw-r--r-- | tests/Unit/Http/Validation/Rules/StringInputLengthTest.php | 37 | ||||
-rw-r--r-- | tests/Unit/Http/Validation/Rules/Stub/ParentClassImplementation.php | 23 | ||||
-rw-r--r-- | tests/Unit/Http/Validation/Rules/Stub/UsesStringInputLength.php | 10 | ||||
-rw-r--r-- | tests/Unit/Http/Validation/ValidatorTest.php | 5 |
11 files changed, 227 insertions, 2 deletions
diff --git a/src/Http/Validation/Rules/Between.php b/src/Http/Validation/Rules/Between.php new file mode 100644 index 00000000..106a93ac --- /dev/null +++ b/src/Http/Validation/Rules/Between.php @@ -0,0 +1,10 @@ +<?php + +namespace Engelsystem\Http\Validation\Rules; + +use Respect\Validation\Rules\Between as RespectBetween; + +class Between extends RespectBetween +{ + use StringInputLength; +} diff --git a/src/Http/Validation/Rules/Max.php b/src/Http/Validation/Rules/Max.php new file mode 100644 index 00000000..b1b2cfa3 --- /dev/null +++ b/src/Http/Validation/Rules/Max.php @@ -0,0 +1,10 @@ +<?php + +namespace Engelsystem\Http\Validation\Rules; + +use Respect\Validation\Rules\Max as RespectMax; + +class Max extends RespectMax +{ + use StringInputLength; +} diff --git a/src/Http/Validation/Rules/Min.php b/src/Http/Validation/Rules/Min.php new file mode 100644 index 00000000..ab8d4e1a --- /dev/null +++ b/src/Http/Validation/Rules/Min.php @@ -0,0 +1,10 @@ +<?php + +namespace Engelsystem\Http\Validation\Rules; + +use Respect\Validation\Rules\Min as RespectMin; + +class Min extends RespectMin +{ + use StringInputLength; +} diff --git a/src/Http/Validation/Rules/StringInputLength.php b/src/Http/Validation/Rules/StringInputLength.php new file mode 100644 index 00000000..7b5c248b --- /dev/null +++ b/src/Http/Validation/Rules/StringInputLength.php @@ -0,0 +1,44 @@ +<?php + +namespace Engelsystem\Http\Validation\Rules; + +use DateTime; +use Illuminate\Support\Str; +use Throwable; + +trait StringInputLength +{ + /** + * Use the input length of a string + * + * @param mixed $input + * @return bool + */ + public function validate($input): bool + { + if ( + is_string($input) + && !is_numeric($input) + && !$this->isDateTime($input) + ) { + $input = Str::length($input); + } + + return parent::validate($input); + } + + /** + * @param mixed $input + * @return bool + */ + protected function isDateTime($input): bool + { + try { + new DateTime($input); + } catch (Throwable $e) { + return false; + } + + return true; + } +} diff --git a/tests/Unit/Http/Validation/Rules/BetweenTest.php b/tests/Unit/Http/Validation/Rules/BetweenTest.php new file mode 100644 index 00000000..130d2f93 --- /dev/null +++ b/tests/Unit/Http/Validation/Rules/BetweenTest.php @@ -0,0 +1,28 @@ +<?php + +namespace Engelsystem\Test\Unit\Http\Validation\Rules; + +use Engelsystem\Http\Validation\Rules\Between; +use Engelsystem\Test\Unit\TestCase; + +class BetweenTest extends TestCase +{ + /** + * @covers \Engelsystem\Http\Validation\Rules\Between + */ + public function testValidate() + { + $rule = new Between(3, 10); + $this->assertFalse($rule->validate(1)); + $this->assertFalse($rule->validate('11')); + $this->assertTrue($rule->validate(5)); + $this->assertFalse($rule->validate('AS')); + $this->assertFalse($rule->validate('TestContentThatCounts')); + $this->assertTrue($rule->validate('TESTING')); + + $rule = new Between('2042-01-01', '2042-10-10'); + $this->assertFalse($rule->validate('2000-01-01')); + $this->assertFalse($rule->validate('3000-01-01')); + $this->assertTrue($rule->validate('2042-05-11')); + } +} diff --git a/tests/Unit/Http/Validation/Rules/MaxTest.php b/tests/Unit/Http/Validation/Rules/MaxTest.php new file mode 100644 index 00000000..3f4d9516 --- /dev/null +++ b/tests/Unit/Http/Validation/Rules/MaxTest.php @@ -0,0 +1,26 @@ +<?php + +namespace Engelsystem\Test\Unit\Http\Validation\Rules; + +use Engelsystem\Http\Validation\Rules\Max; +use Engelsystem\Test\Unit\TestCase; + +class MaxTest extends TestCase +{ + /** + * @covers \Engelsystem\Http\Validation\Rules\Max + */ + public function testValidate() + { + $rule = new Max(3); + $this->assertFalse($rule->validate(10)); + $this->assertFalse($rule->validate('22')); + $this->assertTrue($rule->validate(3)); + $this->assertFalse($rule->validate('TEST')); + $this->assertTrue($rule->validate('AS')); + + $rule = new Max('2042-01-01'); + $this->assertFalse($rule->validate('2100-01-01')); + $this->assertTrue($rule->validate('2000-01-01')); + } +} diff --git a/tests/Unit/Http/Validation/Rules/MinTest.php b/tests/Unit/Http/Validation/Rules/MinTest.php new file mode 100644 index 00000000..56350802 --- /dev/null +++ b/tests/Unit/Http/Validation/Rules/MinTest.php @@ -0,0 +1,26 @@ +<?php + +namespace Engelsystem\Test\Unit\Http\Validation\Rules; + +use Engelsystem\Http\Validation\Rules\Min; +use Engelsystem\Test\Unit\TestCase; + +class MinTest extends TestCase +{ + /** + * @covers \Engelsystem\Http\Validation\Rules\Min + */ + public function testValidate() + { + $rule = new Min(3); + $this->assertFalse($rule->validate(1)); + $this->assertFalse($rule->validate('2')); + $this->assertTrue($rule->validate(3)); + $this->assertFalse($rule->validate('AS')); + $this->assertTrue($rule->validate('TEST')); + + $rule = new Min('2042-01-01'); + $this->assertFalse($rule->validate('2000-01-01')); + $this->assertTrue($rule->validate('2345-01-01')); + } +} diff --git a/tests/Unit/Http/Validation/Rules/StringInputLengthTest.php b/tests/Unit/Http/Validation/Rules/StringInputLengthTest.php new file mode 100644 index 00000000..5c4dc512 --- /dev/null +++ b/tests/Unit/Http/Validation/Rules/StringInputLengthTest.php @@ -0,0 +1,37 @@ +<?php + +namespace Engelsystem\Test\Unit\Http\Validation\Rules; + +use Engelsystem\Test\Unit\Http\Validation\Rules\Stub\UsesStringInputLength; +use Engelsystem\Test\Unit\TestCase; + +class StringInputLengthTest extends TestCase +{ + /** + * @covers \Engelsystem\Http\Validation\Rules\StringInputLength::validate + * @covers \Engelsystem\Http\Validation\Rules\StringInputLength::isDateTime + * @dataProvider validateProvider + * @param mixed $input + * @param mixed $expectedInput + */ + public function testValidate($input, $expectedInput) + { + $rule = new UsesStringInputLength(); + $rule->validate($input); + + $this->assertEquals($expectedInput, $rule->lastInput); + } + + /** + * @return array[] + */ + public function validateProvider() + { + return [ + ['TEST', 4], + ['?', 1], + ['2042-01-01 00:00', '2042-01-01 00:00'], + ['3', '3'], + ]; + } +} diff --git a/tests/Unit/Http/Validation/Rules/Stub/ParentClassImplementation.php b/tests/Unit/Http/Validation/Rules/Stub/ParentClassImplementation.php new file mode 100644 index 00000000..1b6aaaf5 --- /dev/null +++ b/tests/Unit/Http/Validation/Rules/Stub/ParentClassImplementation.php @@ -0,0 +1,23 @@ +<?php + +namespace Engelsystem\Test\Unit\Http\Validation\Rules\Stub; + +class ParentClassImplementation +{ + /** @var bool */ + public $validateResult = true; + + /** @var mixed */ + public $lastInput; + + /** + * @param mixed $input + * @return bool + */ + public function validate($input): bool + { + $this->lastInput = $input; + + return $this->validateResult; + } +} diff --git a/tests/Unit/Http/Validation/Rules/Stub/UsesStringInputLength.php b/tests/Unit/Http/Validation/Rules/Stub/UsesStringInputLength.php new file mode 100644 index 00000000..3522304c --- /dev/null +++ b/tests/Unit/Http/Validation/Rules/Stub/UsesStringInputLength.php @@ -0,0 +1,10 @@ +<?php + +namespace Engelsystem\Test\Unit\Http\Validation\Rules\Stub; + +use Engelsystem\Http\Validation\Rules\StringInputLength; + +class UsesStringInputLength extends ParentClassImplementation +{ + use StringInputLength; +} diff --git a/tests/Unit/Http/Validation/ValidatorTest.php b/tests/Unit/Http/Validation/ValidatorTest.php index 450e5d4e..124673df 100644 --- a/tests/Unit/Http/Validation/ValidatorTest.php +++ b/tests/Unit/Http/Validation/ValidatorTest.php @@ -50,9 +50,10 @@ class ValidatorTest extends TestCase )); $this->assertFalse($val->validate( - ['lorem' => 2], - ['lorem' => 'required|min:3|max:10'] + ['lorem' => 'OMG'], + ['lorem' => 'required|min:4|max:10'] )); + $this->assertEquals(['lorem' => ['validation.lorem.min']], $val->getErrors()); $this->assertFalse($val->validate( ['lorem' => 42], ['lorem' => 'required|min:3|max:10'] |