diff --git a/src/EmailChecker/EmailChecker.php b/src/EmailChecker/EmailChecker.php index 14e2ba3..4a81250 100644 --- a/src/EmailChecker/EmailChecker.php +++ b/src/EmailChecker/EmailChecker.php @@ -54,6 +54,24 @@ public function isValid($email) return false; } - return !$this->adapter->isThrowawayDomain($domain); + foreach ($this->allDomainSuffixes($domain) as $domainSuffix) { + if ($this->adapter->isThrowawayDomain($domainSuffix)) { + return false; + } + } + + return true; + } + + /** + * @return iterable + */ + private function allDomainSuffixes(string $domain): iterable + { + $components = explode('.', $domain); + + foreach ($components as $i => $_) { + yield implode('.', array_slice($components, $i)); + } } } diff --git a/tests/EmailChecker/Tests/EmailCheckerTest.php b/tests/EmailChecker/Tests/EmailCheckerTest.php index 78ce8e6..849b644 100644 --- a/tests/EmailChecker/Tests/EmailCheckerTest.php +++ b/tests/EmailChecker/Tests/EmailCheckerTest.php @@ -12,17 +12,14 @@ namespace EmailChecker\Tests; use EmailChecker\Adapter\AdapterInterface; +use EmailChecker\Adapter\ArrayAdapter; use EmailChecker\EmailChecker; final class EmailCheckerTest extends TestCase { public function testEmailIsValid(): void { - $adapter = $this->createMock(AdapterInterface::class); - $adapter - ->method('isThrowawayDomain') - ->willReturn(false); - + $adapter = new ArrayAdapter([]); $checker = new EmailChecker($adapter); self::assertTrue($checker->isValid('foo@bar.org')); @@ -30,11 +27,7 @@ public function testEmailIsValid(): void public function testEmailIsNotValid(): void { - $adapter = $this->createMock(AdapterInterface::class); - $adapter - ->method('isThrowawayDomain') - ->willReturn(true); - + $adapter = new ArrayAdapter(['bar.org']); $checker = new EmailChecker($adapter); self::assertFalse($checker->isValid('foo@bar.org')); @@ -42,9 +35,17 @@ public function testEmailIsNotValid(): void public function testMalformattedEmail(): void { - $adapter = $this->createMock(AdapterInterface::class); + $adapter = new ArrayAdapter([]); $checker = new EmailChecker($adapter); self::assertFalse($checker->isValid('foo[at]bar.org')); } + + public function testSubDomain(): void + { + $adapter = new ArrayAdapter(['bar.org']); + $checker = new EmailChecker($adapter); + + self::assertFalse($checker->isValid('foo@baz.bar.org')); + } }