Skip to content

Commit 4dd80d9

Browse files
authored
Merge pull request #20 from danitome24/19-username-vo
#19 - Username vo added
2 parents 84c46ae + f71b6cb commit 4dd80d9

File tree

3 files changed

+143
-0
lines changed

3 files changed

+143
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
/**
3+
* This software was built by:
4+
* Daniel Tomé Fernández <danieltomefer@gmail.com>
5+
* GitHub: danitome24
6+
*/
7+
8+
namespace PhpValueObject\User\Exception;
9+
10+
use Throwable;
11+
12+
class InvalidUsernameException extends \Exception
13+
{
14+
public function __construct($message = "", $code = 0, Throwable $previous = null)
15+
{
16+
parent::__construct($message, $code, $previous);
17+
}
18+
}

src/PhpValueObject/User/Username.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
/**
3+
* This software was built by:
4+
* Daniel Tomé Fernández <danieltomefer@gmail.com>
5+
* GitHub: danitome24
6+
*/
7+
8+
namespace PhpValueObject\User;
9+
10+
use PhpValueObject\User\Exception\InvalidUsernameException;
11+
use PhpValueObject\ValueObject;
12+
13+
final class Username implements ValueObject
14+
{
15+
private const USERNAME_REGEX = '/^([A-Za-z0-9]{5,31})$/';
16+
17+
/**
18+
* @var string
19+
*/
20+
private $username;
21+
22+
/**
23+
* Username constructor.
24+
* @param string $username
25+
* @throws \PhpValueObject\User\Exception\InvalidUsernameException
26+
*/
27+
private function __construct(string $username)
28+
{
29+
$this->checkIfIsValid($username);
30+
$this->username = $username;
31+
}
32+
33+
/**
34+
* Named constructor
35+
*
36+
* @param string $username
37+
* @return Username
38+
* @throws \PhpValueObject\User\Exception\InvalidUsernameException
39+
*/
40+
public static function fromString(string $username): Username
41+
{
42+
return new self($username);
43+
}
44+
45+
/**
46+
* @return string
47+
*/
48+
public function username(): string
49+
{
50+
return $this->username;
51+
}
52+
53+
/**
54+
* Compare a value object with another one.
55+
*
56+
* @param static|ValueObject $valueObjectToCompare
57+
* @return bool
58+
*/
59+
public function equals(ValueObject $valueObjectToCompare): bool
60+
{
61+
return $this->username() === $valueObjectToCompare->username();
62+
}
63+
64+
/**
65+
* Check if username is valid
66+
*
67+
* @param $username
68+
* @throws InvalidUsernameException
69+
*/
70+
private function checkIfIsValid($username)
71+
{
72+
if (!preg_match(self::USERNAME_REGEX, $username)) {
73+
throw new InvalidUsernameException('Username must contain only letters and numbers anb must be from 5 to 31 length');
74+
}
75+
}
76+
}

tests/User/UsernameTest.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
/**
3+
* This software was built by:
4+
* Daniel Tomé Fernández <danieltomefer@gmail.com>
5+
* GitHub: danitome24
6+
*/
7+
8+
namespace User;
9+
10+
use PhpValueObject\User\Exception\InvalidUsernameException;
11+
use PhpValueObject\User\Username;
12+
use PHPUnit\Framework\TestCase;
13+
14+
class UsernameTest extends TestCase
15+
{
16+
17+
public function testIsInvalidUsername()
18+
{
19+
$this->expectException(InvalidUsernameException::class);
20+
21+
Username::fromString('dtom');
22+
}
23+
24+
public function testUserIsValid()
25+
{
26+
$usernameString = 'dtome23';
27+
$username = Username::fromString($usernameString);
28+
$this->assertEquals($usernameString, $username->username());
29+
}
30+
31+
/**
32+
* @dataProvider usernames
33+
* @param Username $username
34+
* @param Username $usernameToTest
35+
* @param bool $isEquals
36+
*/
37+
public function testEqualsMethodIsValid(Username $username, Username $usernameToTest, bool $isEquals)
38+
{
39+
$this->assertEquals($isEquals, $username->equals($usernameToTest));
40+
}
41+
42+
public function usernames()
43+
{
44+
return [
45+
[Username::fromString('dtome'), Username::fromString('dtome'), true],
46+
[Username::fromString('dfernandez'), Username::fromString('tests'), false]
47+
];
48+
}
49+
}

0 commit comments

Comments
 (0)