diff --git a/src/Enum/LoginField.php b/src/Enum/LoginField.php index 79ae8ef..d421d8b 100644 --- a/src/Enum/LoginField.php +++ b/src/Enum/LoginField.php @@ -6,4 +6,5 @@ enum LoginField { case Email; case Username; + case EmailOrUsername; } diff --git a/src/Service/UsersService.php b/src/Service/UsersService.php index 393764a..c706e5e 100644 --- a/src/Service/UsersService.php +++ b/src/Service/UsersService.php @@ -105,9 +105,11 @@ public function getLoginField(): LoginField public function getLoginValue(UserModel $user): ?string { - return $this->loginField === LoginField::Email - ? $user->getEmail() - : $user->getUsername(); + return match($this->loginField) { + LoginField::Email => $user->getEmail(), + LoginField::Username => $user->getUsername(), + LoginField::EmailOrUsername => $user->getUsername() ?? $user->getEmail(), + }; } /** @@ -258,9 +260,11 @@ public function getByUsername(string $username): ?UserModel #[\Override] public function getByLogin(string $login): ?UserModel { - return $this->loginField === LoginField::Email - ? $this->getByEmail($login) - : $this->getByUsername($login); + return match($this->loginField) { + LoginField::Email => $this->getByEmail($login), + LoginField::Username => $this->getByUsername($login), + LoginField::EmailOrUsername => $this->getByUsername($login) ?? $this->getByEmail($login), + }; } /** diff --git a/tests/TestUsersBase.php b/tests/TestUsersBase.php index bf26f80..9d47b70 100644 --- a/tests/TestUsersBase.php +++ b/tests/TestUsersBase.php @@ -31,7 +31,7 @@ public function __chooseValue($forUsername, $forEmail): string { return match ($this->loginField) { LoginField::Email => $forEmail, - LoginField::Username => $forUsername, + LoginField::Username, LoginField::EmailOrUsername => $forUsername, }; } diff --git a/tests/UsersDBDatasetByEmailOrUsernameTest.php b/tests/UsersDBDatasetByEmailOrUsernameTest.php new file mode 100644 index 0000000..ba74617 --- /dev/null +++ b/tests/UsersDBDatasetByEmailOrUsernameTest.php @@ -0,0 +1,59 @@ +__setUp(LoginField::EmailOrUsername); + } + + #[\Override] + public function testIsValidUser(): void + { + // Both username and email must work + $user = $this->object->isValidUser('user3', 'pwd3'); + $this->assertEquals('User 3', $user->getName()); + + $user = $this->object->isValidUser('user3@gmail.com', 'pwd3'); + $this->assertEquals('User 3', $user->getName()); + + // Wrong password returns null regardless of field used + $this->assertNull($this->object->isValidUser('user3', 'wrongpwd')); + $this->assertNull($this->object->isValidUser('user3@gmail.com', 'wrongpwd')); + + // Non-existent identifier returns null + $this->assertNull($this->object->isValidUser('nonexistent', 'pwd3')); + } + + public function testGetByLoginWithUsername(): void + { + $user = $this->object->getByLogin('user1'); + $this->assertNotNull($user); + $this->assertEquals('User 1', $user->getName()); + $this->assertEquals('user1', $user->getUsername()); + } + + public function testGetByLoginWithEmail(): void + { + $user = $this->object->getByLogin('user1@gmail.com'); + $this->assertNotNull($user); + $this->assertEquals('User 1', $user->getName()); + $this->assertEquals('user1@gmail.com', $user->getEmail()); + } + + public function testGetLoginValueReturnsUsername(): void + { + $user = $this->object->getByLogin('user2'); + $this->assertEquals('user2', $this->object->getLoginValue($user)); + } + + public function testGetLoginFieldIsEmailOrUsername(): void + { + $this->assertEquals(LoginField::EmailOrUsername, $this->object->getLoginField()); + } +} \ No newline at end of file