From 17083f10d84f2a308a24e6644ecf702c5c021f6d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rub=C3=A9n=20D?=
+ * @param mixed $offset
* An offset to check for.
*
- * The return value will be casted to boolean if non-boolean was returned. + * The return value will be cast to boolean if non-boolean was returned. */ public function offsetExists(mixed $offset): bool { @@ -237,7 +239,7 @@ abstract class Model implements JsonSerializable, \ArrayAccess /** * Unset a non-class property * - * @param mixed $offset + * @param mixed $offset * * @return void */ diff --git a/tests/SP/Providers/Auth/Database/DatabaseAuthTest.php b/tests/SP/Providers/Auth/Database/DatabaseAuthTest.php new file mode 100644 index 00000000..972ed2d8 --- /dev/null +++ b/tests/SP/Providers/Auth/Database/DatabaseAuthTest.php @@ -0,0 +1,260 @@ +. + */ + +namespace SP\Tests\Providers\Auth\Database; + +use PHPUnit\Framework\MockObject\MockObject; +use SP\Core\Crypt\Hash; +use SP\DataModel\UserLoginData; +use SP\Domain\User\Ports\UserPassServiceInterface; +use SP\Domain\User\Ports\UserServiceInterface; +use SP\Infrastructure\Common\Repositories\NoSuchItemException; +use SP\Providers\Auth\Database\DatabaseAuth; +use SP\Tests\Generators\UserDataGenerator; +use SP\Tests\UnitaryTestCase; + +/** + * Class DatabaseAuthTest + * + * @group unitary + */ +class DatabaseAuthTest extends UnitaryTestCase +{ + + private UserServiceInterface|MockObject $userService; + private MockObject|UserPassServiceInterface $userPassService; + private DatabaseAuth $databaseAuth; + + public function testAuthenticate() + { + $user = self::$faker->userName; + $pass = self::$faker->password; + $hashedPass = Hash::hashKey($pass); + + $userData = UserDataGenerator::factory()->buildUserData()->mutate(['login' => $user, 'pass' => $hashedPass]); + + $this->userService + ->expects(self::once()) + ->method('getByLogin') + ->with($user) + ->willReturn($userData); + + $userLoginData = new UserLoginData(); + $userLoginData->setLoginUser($user); + $userLoginData->setLoginPass($pass); + + self::assertTrue($this->databaseAuth->authenticate($userLoginData)->isOk()); + } + + public function testAuthenticateWithWrongLogin() + { + $user = self::$faker->userName; + $pass = self::$faker->password; + + $this->userService + ->expects(self::once()) + ->method('getByLogin') + ->with($user) + ->willThrowException(new NoSuchItemException('User does not exist')); + + $userLoginData = new UserLoginData(); + $userLoginData->setLoginUser($user); + $userLoginData->setLoginPass($pass); + + self::assertFalse($this->databaseAuth->authenticate($userLoginData)->isOk()); + } + + public function testAuthenticateWithWrongPass() + { + $user = self::$faker->userName; + $pass = self::$faker->password; + + $userData = UserDataGenerator::factory()->buildUserData()->mutate(['login' => $user]); + + $this->userService + ->expects(self::once()) + ->method('getByLogin') + ->with($user) + ->willReturn($userData); + + $userLoginData = new UserLoginData(); + $userLoginData->setLoginUser($user); + $userLoginData->setLoginPass($pass); + + self::assertFalse($this->databaseAuth->authenticate($userLoginData)->isOk()); + } + + public function testAuthenticateWithMigrationBySHA1() + { + $user = self::$faker->userName; + $pass = self::$faker->password; + + $userData = UserDataGenerator::factory() + ->buildUserData() + ->mutate( + [ + 'login' => $user, + 'pass' => md5($pass), + 'isMigrate' => true + ] + ); + + $this->userService + ->expects(self::once()) + ->method('getByLogin') + ->with($user) + ->willReturn($userData); + + $this->userPassService + ->expects(self::once()) + ->method('migrateUserPassById') + ->with($userData->getId(), $pass); + + $userLoginData = new UserLoginData(); + $userLoginData->setLoginUser($user); + $userLoginData->setLoginPass($pass); + + self::assertTrue($this->databaseAuth->authenticate($userLoginData)->isOk()); + } + + public function testAuthenticateWithMigrationByMD5() + { + $user = self::$faker->userName; + $pass = self::$faker->password; + $salt = self::$faker->password; + + $userData = UserDataGenerator::factory() + ->buildUserData() + ->mutate( + [ + 'login' => $user, + 'pass' => sha1($salt . $pass), + 'hashSalt' => $salt, + 'isMigrate' => true + ] + ); + + $this->userService + ->expects(self::once()) + ->method('getByLogin') + ->with($user) + ->willReturn($userData); + + $this->userPassService + ->expects(self::once()) + ->method('migrateUserPassById') + ->with($userData->getId(), $pass); + + $userLoginData = new UserLoginData(); + $userLoginData->setLoginUser($user); + $userLoginData->setLoginPass($pass); + + self::assertTrue($this->databaseAuth->authenticate($userLoginData)->isOk()); + } + + public function testAuthenticateWithMigrationByCrypt() + { + $user = self::$faker->userName; + $pass = self::$faker->password; + $salt = self::$faker->password; + + $userData = UserDataGenerator::factory() + ->buildUserData() + ->mutate( + [ + 'login' => $user, + 'pass' => crypt($pass, $salt), + 'hashSalt' => $salt, + 'isMigrate' => true + ] + ); + + $this->userService + ->expects(self::once()) + ->method('getByLogin') + ->with($user) + ->willReturn($userData); + + $this->userPassService + ->expects(self::once()) + ->method('migrateUserPassById') + ->with($userData->getId(), $pass); + + $userLoginData = new UserLoginData(); + $userLoginData->setLoginUser($user); + $userLoginData->setLoginPass($pass); + + self::assertTrue($this->databaseAuth->authenticate($userLoginData)->isOk()); + } + + public function testAuthenticateWithMigrationByHash() + { + $user = self::$faker->userName; + $pass = self::$faker->password; + $hashedPass = Hash::hashKey($pass); + + $userData = UserDataGenerator::factory() + ->buildUserData() + ->mutate( + [ + 'login' => $user, + 'pass' => $hashedPass, + 'isMigrate' => true + ] + ); + + $this->userService + ->expects(self::once()) + ->method('getByLogin') + ->with($user) + ->willReturn($userData); + + $this->userPassService + ->expects(self::once()) + ->method('migrateUserPassById') + ->with($userData->getId(), $pass); + + $userLoginData = new UserLoginData(); + $userLoginData->setLoginUser($user); + $userLoginData->setLoginPass($pass); + + self::assertTrue($this->databaseAuth->authenticate($userLoginData)->isOk()); + } + + public function testIsAuthGranted() + { + self::assertTrue($this->databaseAuth->isAuthGranted()); + } + + protected function setUp(): void + { + parent::setUp(); + + $this->userService = $this->createMock(UserServiceInterface::class); + $this->userPassService = $this->createMock(UserPassServiceInterface::class); + + $this->databaseAuth = new DatabaseAuth($this->userService, $this->userPassService); + } + +}