Skip to content

Commit

Permalink
Add multiple validator
Browse files Browse the repository at this point in the history
  • Loading branch information
vermakhushboo committed Dec 27, 2023
1 parent d714fcb commit 55792e0
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 0 deletions.
115 changes: 115 additions & 0 deletions src/Http/Validator/Multiple.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
<?php

namespace Utopia\Http\Validator;

use Utopia\Http\Validator;

/**
* Multiple
*
* Multiple validator is a container of multiple validations each acting as a rule.
*
* @package Utopia\Validator
*/
class Multiple extends Validator
{
/**
* @var Validator[]
*/
protected $rules = [];

protected $type = self::TYPE_MIXED;

/**
* Constructor
*
* Multiple constructor can get any number of arguments containing Validator instances using PHP func_get_args function.
*
* Example:
*
* $multiple = new Multiple([$validator1, $validator2]);
* $multiple = new Multiple([$validator1, $validator2, $validator3], self::TYPE_STRING);
*/
public function __construct(array $rules, ?string $type = self::TYPE_MIXED)
{
foreach ($rules as $rule) {
$this->addRule($rule);
}

$this->type = $type;
}
/**
* Add rule
*
* Add a new rule to the end of the rules containing array
*
* @param Validator $rule
* @return $this
*/
public function addRule(Validator $rule)
{
$this->rules[] = $rule;

return $this;
}

/**
* Get Description
*
* Returns validator description
*
* @return string
*/
public function getDescription(): string
{
$description = '';
foreach ($this->rules as $key => $rule) {
$description .= ++$key . '. ' . $rule->getDescription() . " \n";
}

return $description;
}

/**
* Is valid
*
* Validation will pass when all rules are valid if only one of the rules is invalid validation will fail.
*
* @param mixed $value
* @return bool
*/
public function isValid(mixed $value): bool
{
foreach ($this->rules as $rule) { /* @var $rule Validator */
if (false === $rule->isValid($value)) {
return false;
}
}

return true;
}

/**
* Get Type
*
* Returns validator type.
*
* @return string
*/
public function getType(): string
{
return $this->type;
}

/**
* Is array
*
* Function will return true if object is array.
*
* @return bool
*/
public function isArray(): bool
{
return true;
}
}
35 changes: 35 additions & 0 deletions tests/Validator/MultipleTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Utopia\Http\Validator;

use PHPUnit\Framework\TestCase;

class MultipleTest extends TestCase
{
protected Multiple $validator;

public function setUp(): void
{
$this->validator = new Multiple([new Text(20), new URL()], Multiple::TYPE_STRING);
}

public function testIsValid()
{
$this->assertEquals('string', $this->validator->getType());
$this->assertEquals("1. Value must be a valid string and at least 1 chars and no longer than 20 chars \n2. Value must be a valid URL \n", $this->validator->getDescription());

// Valid URL but invalid text length
$this->assertFalse($this->validator->isValid('http://example.com/very-long-url'));

// Valid text within length, but invalid URL
$this->assertFalse($this->validator->isValid('hello world'));

// Both conditions satisfied
$this->assertTrue($this->validator->isValid('http://example.com'));
$this->assertTrue($this->validator->isValid('https://google.com'));

// Neither condition satisfied
$this->assertFalse($this->validator->isValid('example.com/hello-world'));
$this->assertFalse($this->validator->isValid(''));
}
}

0 comments on commit 55792e0

Please sign in to comment.