mirror of
https://github.com/egulias/EmailValidator.git
synced 2026-09-11 18:47:02 +00:00
Fixed handling of errors and null type hint
This commit is contained in:
@@ -151,7 +151,7 @@ class DomainPart extends Parser
|
||||
return $result;
|
||||
}
|
||||
|
||||
if ($this->lexer->token['type'] !== EmailLexer::S_OPENBRACKET) {
|
||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENBRACKET) {
|
||||
$literalResult = $this->parseDomainLiteral();
|
||||
//Invalid literal parsing
|
||||
if($literalResult->isInvalid()) {
|
||||
|
||||
@@ -10,7 +10,7 @@ class MultipleErrors extends InvalidEmail
|
||||
/**
|
||||
* @var Reason[]
|
||||
*/
|
||||
private $errors = [];
|
||||
private $reasons = [];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
@@ -24,8 +24,13 @@ class MultipleErrors extends InvalidEmail
|
||||
/**
|
||||
* @return Reason[]
|
||||
*/
|
||||
public function getReason()
|
||||
public function getReasons() : array
|
||||
{
|
||||
return $this->errors;
|
||||
return $this->reasons;
|
||||
}
|
||||
|
||||
public function reason() : Reason
|
||||
{
|
||||
return $this->reasons[0];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ class DNSCheckValidation implements EmailValidation
|
||||
return $this->checkDNS($host);
|
||||
}
|
||||
|
||||
public function getError() : InvalidEmail
|
||||
public function getError() : ?InvalidEmail
|
||||
{
|
||||
return $this->error;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ interface EmailValidation
|
||||
*
|
||||
* @return InvalidEmail|null
|
||||
*/
|
||||
public function getError() : InvalidEmail;
|
||||
public function getError() : ?InvalidEmail;
|
||||
|
||||
/**
|
||||
* Returns the validation warnings.
|
||||
|
||||
@@ -53,7 +53,6 @@ class MultipleValidationWithAnd implements EmailValidation
|
||||
|
||||
$this->validations = $validations;
|
||||
$this->mode = $mode;
|
||||
$this->error = new MultipleErrors();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -62,12 +61,14 @@ class MultipleValidationWithAnd implements EmailValidation
|
||||
public function isValid($email, EmailLexer $emailLexer)
|
||||
{
|
||||
$result = true;
|
||||
$errors = [];
|
||||
foreach ($this->validations as $validation) {
|
||||
$emailLexer->reset();
|
||||
$validationResult = $validation->isValid($email, $emailLexer);
|
||||
$result = $result && $validationResult;
|
||||
$this->processValidation($validation);
|
||||
$this->warnings = array_merge($this->warnings, $validation->getWarnings());
|
||||
if (!$validationResult) {
|
||||
$this->processError($validation);
|
||||
}
|
||||
|
||||
if ($this->shouldStop($result)) {
|
||||
break;
|
||||
@@ -77,10 +78,17 @@ class MultipleValidationWithAnd implements EmailValidation
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function processValidation(EmailValidation $validation)
|
||||
private function initErrorStorage()
|
||||
{
|
||||
if (null === $this->error) {
|
||||
$this->error = new MultipleErrors();
|
||||
}
|
||||
}
|
||||
|
||||
private function processError(EmailValidation $validation)
|
||||
{
|
||||
$this->warnings = array_merge($this->warnings, $validation->getWarnings());
|
||||
if (null !== $validation->getError()) {
|
||||
$this->initErrorStorage();
|
||||
$this->error->addReason($validation->getError()->reason());
|
||||
}
|
||||
}
|
||||
@@ -99,7 +107,7 @@ class MultipleValidationWithAnd implements EmailValidation
|
||||
* Returns the validation errors.
|
||||
*
|
||||
*/
|
||||
public function getError() : InvalidEmail
|
||||
public function getError() : ?InvalidEmail
|
||||
{
|
||||
return $this->error;
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ class NoRFCWarningsValidation extends RFCValidation
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getError() : InvalidEmail
|
||||
public function getError() : ?InvalidEmail
|
||||
{
|
||||
return $this->error ?: parent::getError();
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ class RFCValidation implements EmailValidation
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getError() : InvalidEmail
|
||||
public function getError() : ?InvalidEmail
|
||||
{
|
||||
return $this->error;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ class SpoofCheckValidation implements EmailValidation
|
||||
/**
|
||||
* @return InvalidEmail
|
||||
*/
|
||||
public function getError() : InvalidEmail
|
||||
public function getError() : ?InvalidEmail
|
||||
{
|
||||
return $this->error;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# EmailValidator
|
||||
[](https://travis-ci.org/egulias/EmailValidator) [](https://coveralls.io/r/egulias/EmailValidator?branch=master) [](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6)
|
||||
[!https://img.shields.io/packagist/v/egulias/email-validator.svg?style=flat-square](https://packagist.org/packages/egulias/email-validator) [](https://travis-ci.org/egulias/EmailValidator) [](https://coveralls.io/r/egulias/EmailValidator?branch=master) [](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6)
|
||||
=============================
|
||||
## Suported RFCs ##
|
||||
This library aims to support:
|
||||
|
||||
@@ -27,12 +27,11 @@ class EmailValidatorTest extends TestCase
|
||||
|
||||
public function testMultipleValidation()
|
||||
{
|
||||
$invalidEmail = new InvalidEmail(new DummyReason(), '');
|
||||
$validator = new EmailValidator();
|
||||
$validation = $this->getMockBuilder(EmailValidation::class)->getMock();
|
||||
$validation->expects($this->once())->method("isValid")->willReturn(true);
|
||||
$validation->expects($this->once())->method("getWarnings")->willReturn([]);
|
||||
$validation->expects($this->exactly(2))->method("getError")->willReturn($invalidEmail);
|
||||
$validation->expects($this->never(2))->method("getError");
|
||||
$multiple = new MultipleValidationWithAnd([$validation]);
|
||||
|
||||
$this->assertTrue($validator->isValid("example@example.com", $multiple));
|
||||
|
||||
@@ -57,7 +57,7 @@ class DNSCheckValidationTest extends TestCase
|
||||
public function testNoDNSError()
|
||||
{
|
||||
$validation = new DNSCheckValidation();
|
||||
$expectedError = new InvalidEmail(new NoDNSRecord(),"example@invalid.example.com");
|
||||
$expectedError = new InvalidEmail(new NoDNSRecord(),"invalid.example.com.");
|
||||
$validation->isValid("example@invalid.example.com", new EmailLexer());
|
||||
$this->assertEquals($expectedError, $validation->getError());
|
||||
}
|
||||
|
||||
@@ -30,7 +30,9 @@ class MultipleValidationWithAndTest extends TestCase
|
||||
$validationFalse->expects($this->any())->method("isValid")->willReturn(false);
|
||||
$validationFalse->expects($this->any())->method("getWarnings")->willReturn([]);
|
||||
$validationFalse->expects($this->any())->method("getError")->willReturn($invalidEmail);
|
||||
|
||||
$multipleValidation = new MultipleValidationWithAnd([$validationTrue, $validationFalse]);
|
||||
|
||||
$this->assertFalse($multipleValidation->isValid("exmpale@example.com", $lexer));
|
||||
}
|
||||
|
||||
@@ -43,12 +45,11 @@ class MultipleValidationWithAndTest extends TestCase
|
||||
public function testValidationIsValid()
|
||||
{
|
||||
$lexer = new EmailLexer();
|
||||
$invalidEmail = new InvalidEmail(new DummyReason(), '');
|
||||
|
||||
$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("getError")->willReturn($invalidEmail);
|
||||
$validation->expects($this->any())->method("getError")->willReturn(null);
|
||||
|
||||
$multipleValidation = new MultipleValidationWithAnd([$validation]);
|
||||
$this->assertTrue($multipleValidation->isValid("example@example.com", $lexer));
|
||||
@@ -99,12 +100,12 @@ class MultipleValidationWithAndTest extends TestCase
|
||||
$validation1 = $this->getMockBuilder(EmailValidation::class)->getMock();
|
||||
$validation1->expects($this->once())->method("isValid")->willReturn(false);
|
||||
$validation1->expects($this->once())->method("getWarnings")->willReturn([]);
|
||||
$validation1->expects($this->once())->method("getError")->willReturn($invalidEmail);
|
||||
$validation1->expects($this->exactly(2))->method("getError")->willReturn($invalidEmail);
|
||||
|
||||
$validation2 = $this->getMockBuilder(EmailValidation::class)->getMock();
|
||||
$validation2->expects($this->once())->method("isValid")->willReturn(false);
|
||||
$validation2->expects($this->once())->method("getWarnings")->willReturn([]);
|
||||
$validation2->expects($this->once())->method("getError")->willReturn($invalidEmail);
|
||||
$validation2->expects($this->exactly(2))->method("getError")->willReturn($invalidEmail);
|
||||
|
||||
$multipleValidation = new MultipleValidationWithAnd([$validation1, $validation2]);
|
||||
$multipleValidation->isValid("example@example.com", $lexer);
|
||||
@@ -127,12 +128,12 @@ class MultipleValidationWithAndTest extends TestCase
|
||||
$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($invalidEmail);
|
||||
$validation1->expects($this->exactly(2))->method("getError")->willReturn($invalidEmail);
|
||||
|
||||
$validation2 = $this->getMockBuilder(EmailValidation::class)->getMock();
|
||||
$validation2->expects($this->any())->method("isValid")->willReturn(false);
|
||||
$validation2->expects($this->never())->method("getWarnings")->willReturn([]);
|
||||
$validation2->expects($this->never())->method("getError")->willReturn($invalidEmail);
|
||||
$validation1->expects($this->exactly(2))->method("getError")->willReturn($invalidEmail);
|
||||
|
||||
$multipleValidation = new MultipleValidationWithAnd([$validation1, $validation2], MultipleValidationWithAnd::STOP_ON_ERROR);
|
||||
$multipleValidation->isValid("example@example.com", $lexer);
|
||||
@@ -152,7 +153,7 @@ class MultipleValidationWithAndTest extends TestCase
|
||||
$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($invalidEmail);
|
||||
$validation1->expects($this->exactly(2))->method("getError")->willReturn($invalidEmail);
|
||||
|
||||
$validation2 = $this->getMockBuilder(EmailValidation::class)->getMock();
|
||||
$validation2->expects($this->never())->method("isValid");
|
||||
|
||||
@@ -22,8 +22,8 @@ class NoRFCWarningsValidationTest extends TestCase
|
||||
{
|
||||
$validation = new NoRFCWarningsValidation();
|
||||
|
||||
$this->assertFalse($validation->isValid(str_repeat('x', 254).'@example.com', new EmailLexer())); // too long email
|
||||
$this->assertInstanceOf(RFCWarnings::class, $validation->getError());
|
||||
$this->assertFalse($validation->isValid('test()@example.com', new EmailLexer()));
|
||||
$this->assertInstanceOf(RFCWarnings::class, $validation->getError()->reason());
|
||||
}
|
||||
|
||||
public function testEmailWithoutWarningsIsValid()
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"php-coveralls/php-coveralls": "^2.2",
|
||||
"phpunit/phpunit": "^8.2",
|
||||
"phpunit/phpunit": "^8",
|
||||
"dominicsayers/isemail": "^3.0.7",
|
||||
"vimeo/psalm": "^3.11"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user