mirror of
https://github.com/egulias/EmailValidator.git
synced 2026-09-10 18:16:41 +00:00
MultipleValidationWithAnd fixed
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user