Fixed handling of errors and null type hint

This commit is contained in:
Eduardo Gulias Davis
2020-08-15 16:46:45 +02:00
parent 01bc948f11
commit e3710e7c12
14 changed files with 42 additions and 29 deletions
+1 -1
View File
@@ -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()) {
+8 -3
View File
@@ -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();
}
+1 -1
View File
@@ -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 -1
View File
@@ -1,5 +1,5 @@
# EmailValidator
[![Build Status](https://travis-ci.org/egulias/EmailValidator.svg?branch=master)](https://travis-ci.org/egulias/EmailValidator) [![Coverage Status](https://coveralls.io/repos/egulias/EmailValidator/badge.svg?branch=master)](https://coveralls.io/r/egulias/EmailValidator?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/egulias/EmailValidator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6/small.png)](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) [![Build Status](https://travis-ci.org/egulias/EmailValidator.svg?branch=master)](https://travis-ci.org/egulias/EmailValidator) [![Coverage Status](https://coveralls.io/repos/egulias/EmailValidator/badge.svg?branch=master)](https://coveralls.io/r/egulias/EmailValidator?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/egulias/EmailValidator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6/small.png)](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6)
=============================
## Suported RFCs ##
This library aims to support:
+1 -2
View File
@@ -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
View File
@@ -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"
},