Validation rules: min/max/between: Use string length to compare strings

This commit is contained in:
Igor Scheller 2019-10-07 21:59:40 +02:00
parent faf74150e9
commit 8d090438b6
11 changed files with 227 additions and 2 deletions

View File

@ -0,0 +1,10 @@
<?php
namespace Engelsystem\Http\Validation\Rules;
use Respect\Validation\Rules\Between as RespectBetween;
class Between extends RespectBetween
{
use StringInputLength;
}

View File

@ -0,0 +1,10 @@
<?php
namespace Engelsystem\Http\Validation\Rules;
use Respect\Validation\Rules\Max as RespectMax;
class Max extends RespectMax
{
use StringInputLength;
}

View File

@ -0,0 +1,10 @@
<?php
namespace Engelsystem\Http\Validation\Rules;
use Respect\Validation\Rules\Min as RespectMin;
class Min extends RespectMin
{
use StringInputLength;
}

View File

@ -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;
}
}

View File

@ -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'));
}
}

View File

@ -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'));
}
}

View File

@ -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'));
}
}

View File

@ -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'],
];
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -50,9 +50,10 @@ class ValidatorTest extends TestCase
)); ));
$this->assertFalse($val->validate( $this->assertFalse($val->validate(
['lorem' => 2], ['lorem' => 'OMG'],
['lorem' => 'required|min:3|max:10'] ['lorem' => 'required|min:4|max:10']
)); ));
$this->assertEquals(['lorem' => ['validation.lorem.min']], $val->getErrors());
$this->assertFalse($val->validate( $this->assertFalse($val->validate(
['lorem' => 42], ['lorem' => 42],
['lorem' => 'required|min:3|max:10'] ['lorem' => 'required|min:3|max:10']