Skip to content

Commit 1c48d68

Browse files
authored
Merge pull request #15 from byjg/feature/login-field-email-or-username
Add support for login via email or username
2 parents ab76471 + 1d148a7 commit 1c48d68

4 files changed

Lines changed: 71 additions & 7 deletions

File tree

src/Enum/LoginField.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ enum LoginField
66
{
77
case Email;
88
case Username;
9+
case EmailOrUsername;
910
}

src/Service/UsersService.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,11 @@ public function getLoginField(): LoginField
105105

106106
public function getLoginValue(UserModel $user): ?string
107107
{
108-
return $this->loginField === LoginField::Email
109-
? $user->getEmail()
110-
: $user->getUsername();
108+
return match($this->loginField) {
109+
LoginField::Email => $user->getEmail(),
110+
LoginField::Username => $user->getUsername(),
111+
LoginField::EmailOrUsername => $user->getUsername() ?? $user->getEmail(),
112+
};
111113
}
112114

113115
/**
@@ -258,9 +260,11 @@ public function getByUsername(string $username): ?UserModel
258260
#[\Override]
259261
public function getByLogin(string $login): ?UserModel
260262
{
261-
return $this->loginField === LoginField::Email
262-
? $this->getByEmail($login)
263-
: $this->getByUsername($login);
263+
return match($this->loginField) {
264+
LoginField::Email => $this->getByEmail($login),
265+
LoginField::Username => $this->getByUsername($login),
266+
LoginField::EmailOrUsername => $this->getByUsername($login) ?? $this->getByEmail($login),
267+
};
264268
}
265269

266270
/**

tests/TestUsersBase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function __chooseValue($forUsername, $forEmail): string
3131
{
3232
return match ($this->loginField) {
3333
LoginField::Email => $forEmail,
34-
LoginField::Username => $forUsername,
34+
LoginField::Username, LoginField::EmailOrUsername => $forUsername,
3535
};
3636
}
3737

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
namespace Tests;
4+
5+
use ByJG\Authenticate\Enum\LoginField;
6+
7+
class UsersDBDatasetByEmailOrUsernameTest extends UsersDBDatasetByUsernameTestUsersBase
8+
{
9+
#[\Override]
10+
public function setUp(): void
11+
{
12+
$this->__setUp(LoginField::EmailOrUsername);
13+
}
14+
15+
#[\Override]
16+
public function testIsValidUser(): void
17+
{
18+
// Both username and email must work
19+
$user = $this->object->isValidUser('user3', 'pwd3');
20+
$this->assertEquals('User 3', $user->getName());
21+
22+
$user = $this->object->isValidUser('user3@gmail.com', 'pwd3');
23+
$this->assertEquals('User 3', $user->getName());
24+
25+
// Wrong password returns null regardless of field used
26+
$this->assertNull($this->object->isValidUser('user3', 'wrongpwd'));
27+
$this->assertNull($this->object->isValidUser('user3@gmail.com', 'wrongpwd'));
28+
29+
// Non-existent identifier returns null
30+
$this->assertNull($this->object->isValidUser('nonexistent', 'pwd3'));
31+
}
32+
33+
public function testGetByLoginWithUsername(): void
34+
{
35+
$user = $this->object->getByLogin('user1');
36+
$this->assertNotNull($user);
37+
$this->assertEquals('User 1', $user->getName());
38+
$this->assertEquals('user1', $user->getUsername());
39+
}
40+
41+
public function testGetByLoginWithEmail(): void
42+
{
43+
$user = $this->object->getByLogin('user1@gmail.com');
44+
$this->assertNotNull($user);
45+
$this->assertEquals('User 1', $user->getName());
46+
$this->assertEquals('user1@gmail.com', $user->getEmail());
47+
}
48+
49+
public function testGetLoginValueReturnsUsername(): void
50+
{
51+
$user = $this->object->getByLogin('user2');
52+
$this->assertEquals('user2', $this->object->getLoginValue($user));
53+
}
54+
55+
public function testGetLoginFieldIsEmailOrUsername(): void
56+
{
57+
$this->assertEquals(LoginField::EmailOrUsername, $this->object->getLoginField());
58+
}
59+
}

0 commit comments

Comments
 (0)