Refactored Storage to be just Storage (not blacklist)

Implemented whitelist functionality
This commit is contained in:
ErickSkrauch 2016-04-28 23:37:24 +03:00
parent afad6a5b09
commit ca7e357b68
4 changed files with 195 additions and 52 deletions

View File

@ -4,45 +4,45 @@ namespace Ely\TempMailBuster;
class Storage class Storage
{ {
/** /**
* @var array of string, which contains masks for temp mail services * @var array of strings, which contains masks for temp mail services
*/ */
private $blacklist; private $items;
/** /**
* @param array $blacklist * @param array $items
*/ */
public function __construct(array $blacklist = []) public function __construct(array $items = [])
{ {
$this->blacklist = $blacklist; $this->items = $items;
} }
/** /**
* @return array with current blacklist * @return array with current items
*/ */
public function getBlacklist() public function getItems()
{ {
return $this->blacklist; return $this->items;
} }
/** /**
* @param string|array $items item or items, that will be merged to blacklist * @param array $items override current items with passed values
* @return static * @return static
*/ */
public function appendToBlacklist($items) public function setItems(array $items)
{ {
$items = (array)$items; $this->items = $items;
$this->blacklist = array_merge($this->blacklist, $items);
return $this; return $this;
} }
/** /**
* @param array $items override current blacklist with passed values * @param string|array $items item or items, that will be merged to items
* @return static * @return static
*/ */
public function setBlacklist(array $items) public function append($items)
{ {
$this->blacklist = $items; $items = (array)$items;
$this->items = array_merge($this->items, $items);
return $this; return $this;
} }
} }

View File

@ -6,22 +6,23 @@ class TempMailBuster
/** /**
* @var Storage * @var Storage
*/ */
private $storage; private $primaryStorage;
/**
* @var Storage|null
*/
private $secondaryStorage;
/**
* @var bool
*/
private $isWhitelistMode = false;
/** /**
* @param Storage $storage * @param Storage $storage
*/ */
public function __construct(Storage $storage) public function __construct(Storage $primaryStorage, Storage $secondaryStorage = null)
{ {
$this->storage = $storage; $this->primaryStorage = $primaryStorage;
} $this->secondaryStorage = $secondaryStorage;
/**
* @return Storage
*/
public function getStorage()
{
return $this->storage;
} }
/** /**
@ -35,12 +36,85 @@ class TempMailBuster
public function validate($email) public function validate($email)
{ {
$domain = $this->getDomain($email); $domain = $this->getDomain($email);
$tempMailsRegex = $this->buildRegex($this->getStorage()->getBlacklist()); $secondaryStorage = $this->secondaryStorage;
$match = preg_match($tempMailsRegex, $domain); if ($secondaryStorage === null) {
$secondaryStorage = new Storage();
}
// TODO: add support for whitelists if (!$this->isWhitelistMode) {
$blacklist = $this->primaryStorage;
$whitelist = $secondaryStorage;
} else {
$blacklist = $secondaryStorage;
$whitelist = $this->primaryStorage;
}
return !$match; $blacklistRegex = $this->buildRegex($blacklist->getItems());
$match = !!preg_match($blacklistRegex, $domain);
if ($match == $this->isWhitelistMode) {
return !$this->isWhitelistMode;
}
$whitelistRegex = $this->buildRegex($whitelist->getItems());
$match = !!preg_match($whitelistRegex, $domain);
return $match;
}
/**
* @return Storage
*/
public function getPrimaryStorage()
{
return $this->primaryStorage;
}
/**
* @param Storage $primaryStorage
* @return static
*/
public function setPrimaryStorage(Storage $primaryStorage)
{
$this->primaryStorage = $primaryStorage;
return $this;
}
/**
* @return Storage|null
*/
public function getSecondaryStorage()
{
return $this->secondaryStorage;
}
/**
* @param Storage|null $secondaryStorage
* @return static
*/
public function setSecondaryStorage(Storage $secondaryStorage = null)
{
$this->secondaryStorage = $secondaryStorage;
return $this;
}
/**
* @return bool is enabled whitelist mode
*/
public function isIsWhitelistMode()
{
return $this->isWhitelistMode;
}
/**
* Switching validator working mode
*
* @param bool $enable
* @return static
*/
public function whitelistMode($enable = true)
{
$this->isWhitelistMode = $enable;
return $this;
} }
/** /**

View File

@ -3,27 +3,27 @@ namespace Ely\TempMailBuster;
class StorageTest extends \PHPUnit_Framework_TestCase class StorageTest extends \PHPUnit_Framework_TestCase
{ {
public function testGetBlackList() public function testGetItems()
{ {
$storage = new Storage(['item']); $storage = new Storage(['item']);
$this->assertEquals(['item'], $storage->getBlacklist()); $this->assertEquals(['item'], $storage->getItems());
} }
public function testAppendToBlacklist() public function testAppend()
{ {
$storage = new Storage(['item1']); $storage = new Storage(['item1']);
$this->assertEquals($storage, $storage->appendToBlacklist(['item2'])); $this->assertEquals($storage, $storage->append(['item2']));
$this->assertEquals(['item1', 'item2'], $storage->getBlacklist()); $this->assertEquals(['item1', 'item2'], $storage->getItems());
$storage = new Storage(['item1']); $storage = new Storage(['item1']);
$this->assertEquals($storage, $storage->appendToBlacklist('item2')); $this->assertEquals($storage, $storage->append('item2'));
$this->assertEquals(['item1', 'item2'], $storage->getBlacklist()); $this->assertEquals(['item1', 'item2'], $storage->getItems());
} }
public function testSetBlacklist() public function testSetItems()
{ {
$storage = new Storage(['item1']); $storage = new Storage(['item1']);
$this->assertEquals($storage, $storage->setBlacklist(['item2'])); $this->assertEquals($storage, $storage->setItems(['item2']));
$this->assertEquals(['item2'], $storage->getBlacklist()); $this->assertEquals(['item2'], $storage->getItems());
} }
} }

View File

@ -3,11 +3,70 @@ namespace Ely\TempMailBuster;
class TempMailBusterTest extends \PHPUnit_Framework_TestCase class TempMailBusterTest extends \PHPUnit_Framework_TestCase
{ {
public function testGetStorage() public function testValidate()
{
$object = new TempMailBuster(new Storage());
$this->assertTrue($object->validate('notch@mojang.com'));
$object = new TempMailBuster(new Storage());
$object->whitelistMode();
$this->assertFalse($object->validate('notch@mojang.com'));
$object = new TempMailBuster(new Storage(['mojang\.com']));
$this->assertFalse($object->validate('notch@mojang.com'));
$this->assertTrue($object->validate('erickskrauch@ely.by'));
$object = new TempMailBuster(new Storage(['gmail\.com']));
$object->whitelistMode();
$this->assertFalse($object->validate('team@ely.by'));
$this->assertTrue($object->validate('erickskrauch@gmail.com'));
$object = new TempMailBuster(new Storage(['mojang\.com', 'ely\.by']), new Storage(['ely\.by']));
$this->assertFalse($object->validate('notch@mojang.com'));
$this->assertTrue($object->validate('team@ely.by'));
$object = new TempMailBuster(new Storage(['gmail\.com', 'mail\.ru']), new Storage(['mail\.ru']));
$object->whitelistMode();
$this->assertTrue($object->validate('erickskrauch@gmail.com'));
$this->assertFalse($object->validate('random@mail.ru'));
}
public function testGetPrimaryStorage()
{ {
$storage = new Storage(['test']); $storage = new Storage(['test']);
$object = new TempMailBuster($storage); $object = new TempMailBuster($storage);
$this->assertEquals($storage, $object->getStorage()); $this->assertEquals($storage, $object->getPrimaryStorage());
}
public function testSetPrimaryStorage()
{
$storage = new Storage(['test2']);
$object = new TempMailBuster(new Storage(['test1']));
$this->assertEquals($object, $object->setPrimaryStorage($storage));
$this->assertEquals($storage, $object->getPrimaryStorage());
}
public function testGetSecondaryStorage()
{
$object = new TempMailBuster(new Storage());
$this->assertNull($object->getSecondaryStorage());
$storage = new Storage(['test']);
$object = new TempMailBuster(new Storage(), $storage);
$this->assertEquals($storage, $object->getSecondaryStorage());
}
public function testSetSecondaryStorage()
{
$storage = new Storage(['test2']);
$object = new TempMailBuster(new Storage());
$this->assertEquals($object, $object->setSecondaryStorage($storage));
$this->assertEquals($storage, $object->getSecondaryStorage());
$object->setSecondaryStorage(null);
$this->assertNull($object->getSecondaryStorage(), 'Set by null should work');
$object->setSecondaryStorage($storage);
$object->setSecondaryStorage();
$this->assertNull($object->getSecondaryStorage(), 'Set by empty value should work');
} }
public function testGetDomain() public function testGetDomain()
@ -18,6 +77,25 @@ class TempMailBusterTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('ely.by', $this->callGetDomain($object, 'ely.by')); $this->assertEquals('ely.by', $this->callGetDomain($object, 'ely.by'));
} }
public function testIsIsWhitelistMode()
{
$object = new TempMailBuster(new Storage());
$this->assertFalse($object->isIsWhitelistMode(), 'Default should be false');
$object->whitelistMode();
$this->assertTrue($object->isIsWhitelistMode());
}
public function testWhitelistMode()
{
$object = new TempMailBuster(new Storage());
$this->assertEquals($object, $object->whitelistMode());
$this->assertTrue($object->isIsWhitelistMode(), 'Default value should change mode to whitelist');
$object->whitelistMode(false);
$this->assertFalse($object->isIsWhitelistMode());
$object->whitelistMode(true);
$this->assertTrue($object->isIsWhitelistMode());
}
public function testBuildRegex() public function testBuildRegex()
{ {
$object = new TempMailBuster(new Storage()); $object = new TempMailBuster(new Storage());
@ -25,15 +103,6 @@ class TempMailBusterTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('/^(simple|another)$/', $this->callBuildRegex($object, ['simple', 'another'])); $this->assertEquals('/^(simple|another)$/', $this->callBuildRegex($object, ['simple', 'another']));
} }
public function testValidate()
{
$storage = new Storage(['mojang\.com']);
$object = new TempMailBuster($storage);
$this->assertFalse($object->validate('notch@mojang.com'));
$this->assertTrue($object->validate('jeb@mojang1.com'));
$this->assertTrue($object->validate('erickskrauch@ely.by'));
}
private function callGetDomain($object, $email) private function callGetDomain($object, $email)
{ {
$class = new \ReflectionClass($object); $class = new \ReflectionClass($object);