%PDF- %PDF-
| Direktori : /www/varak.net/dmarc.varak.net/tests/classes/Users/ |
| Current File : //www/varak.net/dmarc.varak.net/tests/classes/Users/DbUserTest.php |
<?php
namespace Liuch\DmarcSrg;
use Liuch\DmarcSrg\Users\User;
use Liuch\DmarcSrg\Users\DbUser;
use Liuch\DmarcSrg\Exception\SoftException;
use Liuch\DmarcSrg\Exception\LogicException;
use Liuch\DmarcSrg\Exception\DatabaseNotFoundException;
use Liuch\DmarcSrg\Database\DatabaseController;
use Liuch\DmarcSrg\Database\UserMapperInterface;
class DbUserTest extends \PHPUnit\Framework\TestCase
{
public function testIfExist(): void
{
$user = new DbUser('username', $this->getDatabaseMapperOnce('exists', '', true));
$this->assertTrue($user->exists());
$this->assertTrue($user->exists());
$user = new DbUser('username', $this->getDatabaseMapperOnce('exists', '', false));
$this->assertFalse($user->exists());
$this->assertFalse($user->exists());
}
public function testZeroId(): void
{
$this->expectException(LogicException::class);
new DbUser([ 'id' => 0 ], $this->getDatabaseNever());
}
public function testNegativeId(): void
{
$this->expectException(LogicException::class);
new DbUser([ 'id' => -1 ], $this->getDatabaseNever());
}
public function testIdFromData(): void
{
$this->assertSame(1, (new DbUser([ 'id' => 1 ], $this->getDatabaseNever()))->id());
$this->expectException(SoftException::class);
$this->expectExceptionMessage('User not found');
$user = new DbUser('user1', $this->getDatabaseMapperNotFound('fetch'));
$user->id();
}
public function testIdFromDatabase(): void
{
$this->assertSame(2, (new DbUser('some', $this->getDatabaseMapperOnce('fetch', 'id', 2)))->id());
$user = new DbUser([ 'name' => 'some' ], $this->getDatabaseMapperOnce('fetch', 'id', 3));
$this->assertSame(3, $user->id());
$this->assertSame(3, $user->id());
}
public function testEmptyName1(): void
{
$this->expectException(SoftException::class);
new DbUser('', $this->getDatabaseNever());
}
public function testEmptyName2(): void
{
$this->expectException(SoftException::class);
new DbUser([ 'name' => '', 'id' => 33 ], $this->getDatabaseNever());
}
public function testReservedName(): void
{
$this->expectException(SoftException::class);
new DbUser('admin', $this->getDatabaseNever());
}
public function testName(): void
{
$this->assertSame('user1', (new DbUser('user1', $this->getDatabaseNever()))->name());
$this->assertSame('user2', (new DbUser([ 'name' => 'user2' ], $this->getDatabaseNever()))->name());
$user = new DbUser([ 'id' => 88 ], $this->getDatabaseMapperOnce('fetch', 'name', 'user3'));
$this->assertSame('user3', $user->name());
$this->assertSame('user3', $user->name());
$this->expectException(SoftException::class);
$this->expectExceptionMessage('User not found');
$user = new DbUser([ 'id' => 7 ], $this->getDatabaseMapperNotFound('fetch'));
$user->name();
}
public function testLevel(): void
{
$this->assertSame(
User::LEVEL_USER,
(new DbUser([ 'name' => 'user1', 'level' => User::LEVEL_USER ], $this->getDatabaseNever()))->level()
);
$user = new DbUser('user2', $this->getDatabaseMapperOnce('fetch', 'level', User::LEVEL_MANAGER));
$this->assertSame(User::LEVEL_MANAGER, $user->level());
$this->assertSame(User::LEVEL_MANAGER, $user->level());
$this->expectException(SoftException::class);
$this->expectExceptionMessage('User not found');
$user = new DbUser('user3', $this->getDatabaseMapperNotFound('fetch'));
$user->level();
}
public function testIsEnabled(): void
{
$this->assertTrue(
(new DbUser([ 'name' => 'user1', 'enabled' => true ], $this->getDatabaseNever()))->isEnabled()
);
$this->assertFalse(
(new DbUser([ 'name' => 'user2', 'enabled' => false ], $this->getDatabaseNever()))->isEnabled()
);
$user = new DbUser('user3', $this->getDatabaseMapperOnce('fetch', 'enabled', false));
$this->assertFalse($user->isEnabled());
$this->assertFalse($user->isEnabled());
$this->expectException(SoftException::class);
$this->expectExceptionMessage('User not found');
$user = new DbUser('user4', $this->getDatabaseMapperNotFound('fetch'));
$user->isEnabled();
}
public function testToArray(): void
{
$data = [
'id' => 33,
'name' => 'user1',
'enabled' => true,
'password' => true,
'level' => User::LEVEL_USER,
'email' => 'w@b.c',
'key' => 'zxd',
'domains' => null,
'created_time' => new \DateTime(),
'updated_time' => (new \DateTime())->modify('+1 day')
];
$user = new DbUser($data, $this->getDatabaseNever());
unset($data['id']);
$data['password'] = null;
$data['level'] = $data['level'];
$this->assertSame($data, $user->toArray());
$this->expectException(SoftException::class);
$this->expectExceptionMessage('User not found');
$user = new DbUser('user2', $this->getDatabaseMapperNotFound('fetch'));
$user->toArray();
}
public function testSave(): void
{
$user = new DbUser([ 'name' => 'user1', 'id' => 1 ], $this->getDatabaseMapperOnce('save', '', true));
$user->save();
$this->assertTrue($user->exists());
}
public function testDelete(): void
{
$mp = $this->getMockBuilder(UserMapperInterface::class)
->disableOriginalConstructor()
->getMock();
$mp->expects($this->once())->method('fetch');
$mp->expects($this->once())->method('delete');
$db = $this->getDatabase();
$db->expects($this->any())
->method('getMapper')
->with('user')
->willReturn($mp);
$user = new DbUser('user1', $db);
$user->delete();
$this->assertFalse($user->exists());
$mp = $this->getMockBuilder(UserMapperInterface::class)
->disableOriginalConstructor()
->getMock();
$mp->expects($this->never())->method('fetch');
$mp->expects($this->once())->method('delete');
$db = $this->getDatabase();
$db->expects($this->once())
->method('getMapper')
->with('user')
->willReturn($mp);
$user = new DbUser([ 'name' => 'user2', 'id' => 2 ], $db);
$user->delete();
$this->assertFalse($user->exists());
$this->expectException(SoftException::class);
$this->expectExceptionMessage('User not found');
$user = new DbUser('user2', $this->getDatabaseMapperNotFound('fetch'));
$user->delete();
}
public function testEmptyPassword(): void
{
$this->assertFalse((new DbUser('user1', $this->getDatabaseNever()))->verifyPassword(''));
}
public function testIncorrectPassword(): void
{
$user = new DbUser(
'user1',
$this->getDatabaseMapperOnce('getPasswordHash', '', password_hash('password1', PASSWORD_DEFAULT))
);
$this->assertFalse($user->verifyPassword('fake'));
$user = new DbUser(
'user1',
$this->getDatabaseMapperOnce('getPasswordHash', '', password_hash('', PASSWORD_DEFAULT))
);
$this->assertFalse($user->verifyPassword('fake'));
}
public function testCorrectPassword(): void
{
$user = new DbUser(
'user1',
$this->getDatabaseMapperOnce('getPasswordHash', '', password_hash('password1', PASSWORD_DEFAULT))
);
$this->assertTrue($user->verifyPassword('password1'));
}
public function testPasswordForNonexistentUser(): void
{
$this->assertFalse(
(new DbUser('user1', $this->getDatabaseMapperNotFound('getPasswordHash')))->verifyPassword('some')
);
}
public function testSetPassword(): void
{
$mp = $this->getMockBuilder(UserMapperInterface::class)
->disableOriginalConstructor()
->getMock();
$mp->expects($this->once())
->method('savePasswordHash')
->willReturnCallback(function (&$data, $hash) {
$this->assertTrue(password_verify('password1', $hash));
});
$db = $this->getDatabase();
$db->expects($this->once())
->method('getMapper')
->with('user')
->willReturn($mp);
(new DbUser('user1', $db))->setPassword('password1');
}
private function getDatabase(): object
{
return $this->getMockBuilder(DatabaseController::class)
->disableOriginalConstructor()
->onlyMethods([ 'getMapper' ])
->getMock();
}
private function getDatabaseNever(): object
{
$db = $this->getDatabase();
$db->expects($this->never())->method('getMapper');
return $db;
}
private function getDatabaseMapperOnce(string $method, string $key, $value): object
{
$mapper = $this->getMockBuilder(UserMapperInterface::class)
->disableOriginalConstructor()
->getMock();
$mapper->expects($this->once())
->method($method)
->willReturnCallback(function (&$data) use ($key, $value) {
if (!empty($key)) {
$data[$key] = $value;
}
return $value;
});
$db = $this->getDatabase();
$db->expects($this->once())
->method('getMapper')
->with('user')
->willReturn($mapper);
return $db;
}
private function getDatabaseMapperNotFound($method): object
{
$mapper = $this->getMockBuilder(UserMapperInterface::class)
->disableOriginalConstructor()
->getMock();
$mapper->expects($this->once())
->method($method)
->willThrowException(new DatabaseNotFoundException('Not found'));
$db = $this->getDatabase();
$db->expects($this->any())
->method('getMapper')
->with('user')
->willReturn($mapper);
return $db;
}
}