MultipleValidationWithAnd fixed

This commit is contained in:
Eduardo Gulias Davis
2020-08-09 23:17:41 +02:00
parent 896ff4a4d9
commit d54bcf3f0a
5 changed files with 61 additions and 46 deletions
+7 -9
View File
@@ -1,26 +1,24 @@
<?php
namespace Egulias\EmailValidator\Validation\Result;
namespace Egulias\EmailValidator\Result;
use Egulias\EmailValidator\Result\InvalidEmail;
use Egulias\EmailValidator\Result\Reason\Reason;
class MultipleErrors extends InvalidEmail
{
const CODE = 999;
const REASON = "Accumulated errors for multiple validations";
/**
* @var Reason[]
*/
private $errors = [];
/**
* @param Reason[] $errors
*/
public function __construct(Reason $reason, string $token, array $errors)
public function __construct()
{
$this->errors = $errors;
parent::__construct($reason, $token);
}
public function addError(Reason $reason)
{
$this->errors[$reason->code()] = $reason;
}
/**
@@ -13,5 +13,4 @@ class CharNotAllowed implements Reason
{
return "Character not allowed";
}
}
@@ -0,0 +1,19 @@
<?php
namespace Egulias\EmailValidator\Result\Reason;
class CommaInDomain implements Reason
{
const CODE = 200;
const REASON = "Comma ',' is not allowed in domain part";
public function code() : int
{
return 200;
}
public function description() : string
{
return "Comma ',' is not allowed in domain part";
}
}
@@ -5,12 +5,13 @@ namespace Egulias\EmailValidator\Validation;
use Egulias\EmailValidator\EmailLexer;
use Egulias\EmailValidator\Result\InvalidEmail;
use Egulias\EmailValidator\Validation\Exception\EmptyValidationList;
use Egulias\EmailValidator\Result\MultipleErrors;
class MultipleValidationWithAnd implements EmailValidation
{
/**
* If one of validations gets failure skips all succeeding validation.
* This means MultipleErrors will only contain a single error which first found.
* If one of validations fails, the remaining validations will be skept.
* This means MultipleErrors will only contain a single error, the first found.
*/
const STOP_ON_ERROR = 0;
@@ -52,6 +53,7 @@ class MultipleValidationWithAnd implements EmailValidation
$this->validations = $validations;
$this->mode = $mode;
$this->error = new MultipleErrors();
}
/**
@@ -65,34 +67,22 @@ class MultipleValidationWithAnd implements EmailValidation
$emailLexer->reset();
$validationResult = $validation->isValid($email, $emailLexer);
$result = $result && $validationResult;
$this->warnings = array_merge($this->warnings, $validation->getWarnings());
$errors = $this->addNewError($validation->getError(), $errors);
$this->processValidation($validation);
if ($this->shouldStop($result)) {
break;
}
}
if (!empty($errors)) {
$this->error = new MultipleErrors($errors);
}
return $result;
}
/**
* @param \Egulias\EmailValidator\Exception\InvalidEmail|null $possibleError
* @param \Egulias\EmailValidator\Exception\InvalidEmail[] $errors
*
* @return \Egulias\EmailValidator\Exception\InvalidEmail[]
*/
private function addNewError($possibleError, array $errors)
private function processValidation(EmailValidation $validation)
{
if (null !== $possibleError) {
$errors[] = $possibleError;
$this->warnings = array_merge($this->warnings, $validation->getWarnings());
if (null !== $validation->getError()) {
$this->error->addError($validation->getError()->reason());
}
return $errors;
}
/**
@@ -2,17 +2,17 @@
namespace Egulias\Tests\EmailValidator\Validation;
use Egulias\EmailValidator\EmailLexer;
use Egulias\EmailValidator\Exception\CommaInDomain;
use Egulias\EmailValidator\Exception\NoDomainPart;
use Egulias\EmailValidator\Validation\EmailValidation;
use Egulias\EmailValidator\Validation\MultipleErrors;
use Egulias\EmailValidator\Validation\MultipleValidationWithAnd;
use Egulias\EmailValidator\Validation\RFCValidation;
use Egulias\EmailValidator\Validation\Exception\EmptyValidationList;
use Egulias\EmailValidator\Warning\AddressLiteral;
use Egulias\EmailValidator\Warning\DomainLiteral;
use PHPUnit\Framework\TestCase;
use Egulias\EmailValidator\EmailLexer;
use Egulias\EmailValidator\Warning\DomainLiteral;
use Egulias\EmailValidator\Warning\AddressLiteral;
use Egulias\EmailValidator\Result\Reason\CommaInDomain;
use Egulias\EmailValidator\Result\Reason\NoDomainPart;
use Egulias\EmailValidator\Validation\RFCValidation;
use Egulias\EmailValidator\Validation\EmailValidation;
use Egulias\EmailValidator\Result\MultipleErrors;
use Egulias\EmailValidator\Validation\MultipleValidationWithAnd;
use Egulias\EmailValidator\Validation\Exception\EmptyValidationList;
class MultipleValidationWithAndTest extends TestCase
{
@@ -25,6 +25,7 @@ class MultipleValidationWithAndTest extends TestCase
$validationFalse = $this->getMockBuilder(EmailValidation::class)->getMock();
$validationFalse->expects($this->any())->method("isValid")->willReturn(false);
$validationFalse->expects($this->any())->method("getWarnings")->willReturn([]);
$validationFalse->expects($this->any())->method("reason")->willReturn(new NoDomainPart());
$multipleValidation = new MultipleValidationWithAnd([$validationTrue, $validationFalse]);
$this->assertFalse($multipleValidation->isValid("exmpale@example.com", $lexer));
}
@@ -42,6 +43,7 @@ class MultipleValidationWithAndTest extends TestCase
$validation = $this->getMockBuilder(EmailValidation::class)->getMock();
$validation->expects($this->any())->method("isValid")->willReturn(true);
$validation->expects($this->once())->method("getWarnings")->willReturn([]);
$validation->expects($this->any())->method("reason")->willReturn(new CommaInDomain());
$multipleValidation = new MultipleValidationWithAnd([$validation]);
$this->assertTrue($multipleValidation->isValid("example@example.com", $lexer));
@@ -62,11 +64,13 @@ class MultipleValidationWithAndTest extends TestCase
$validation1 = $this->getMockBuilder("Egulias\\EmailValidator\\Validation\\EmailValidation")->getMock();
$validation1->expects($this->any())->method("isValid")->willReturn(true);
$validation1->expects($this->once())->method("getWarnings")->willReturn($warnings1);
$validation1->expects($this->any())->method("reason")->willReturn(new NoDomainPart());
$validation2 = $this->getMockBuilder(EmailValidation::class)->getMock();
$validation2->expects($this->any())->method("isValid")->willReturn(false);
$validation2->expects($this->once())->method("getWarnings")->willReturn($warnings2);
$validation2->expects($this->any())->method("reason")->willReturn(new NoDomainPart());
$multipleValidation = new MultipleValidationWithAnd([$validation1, $validation2]);
$multipleValidation->isValid("example@example.com", $lexer);
@@ -76,9 +80,11 @@ class MultipleValidationWithAndTest extends TestCase
public function testGathersAllTheErrors()
{
$error1 = new CommaInDomain();
$error2 = new NoDomainPart();
$error2 = new NoDomainPart();
$expectedResult = new MultipleErrors([$error1, $error2]);
$expectedResult = new MultipleErrors();
$expectedResult->addError($error1);
$expectedResult->addError($error2);
$lexer = new EmailLexer();
@@ -100,9 +106,11 @@ class MultipleValidationWithAndTest extends TestCase
public function testStopsAfterFirstError()
{
$error1 = new CommaInDomain();
$error2 = new NoDomainPart();
$error2 = new NoDomainPart();
$expectedResult = new MultipleErrors([$error1]);
$expectedResult = new MultipleErrors();
$expectedResult->addError($error1);
$expectedResult->addError($error2);
$lexer = new EmailLexer();
@@ -123,16 +131,17 @@ class MultipleValidationWithAndTest extends TestCase
public function testBreakOutOfLoopWhenError()
{
$error = new CommaInDomain();
$error1 = new CommaInDomain();
$expectedResult = new MultipleErrors([$error]);
$expectedResult = new MultipleErrors();
$expectedResult->addError($error1);
$lexer = new EmailLexer();
$validation1 = $this->getMockBuilder(EmailValidation::class)->getMock();
$validation1->expects($this->any())->method("isValid")->willReturn(false);
$validation1->expects($this->once())->method("getWarnings")->willReturn([]);
$validation1->expects($this->once())->method("getError")->willReturn($error);
$validation1->expects($this->once())->method("getError")->willReturn($error1);
$validation2 = $this->getMockBuilder(EmailValidation::class)->getMock();
$validation2->expects($this->never())->method("isValid");