summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/User.php146
-rw-r--r--tests/app/AuthTest.php2
-rw-r--r--tests/app/UserTest.php200
3 files changed, 281 insertions, 67 deletions
diff --git a/app/User.php b/app/User.php
index 5282968b43..82e1f0451f 100644
--- a/app/User.php
+++ b/app/User.php
@@ -19,6 +19,7 @@ namespace Fisharebest\Webtrees;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Builder;
+use Illuminate\Database\Query\JoinClause;
use stdClass;
/**
@@ -237,16 +238,15 @@ class User
*/
public static function all(): array
{
- $rows = Database::prepare(
- "SELECT user_id, user_name, real_name, email" .
- " FROM `##user`" .
- " WHERE user_id > 0" .
- " ORDER BY real_name"
- )->fetchAll();
+ $rows = DB::table('user')
+ ->where('user_id', '>', 0)
+ ->orderBy('real_name')
+ ->select(['user_id', 'user_name', 'real_name', 'email'])
+ ->get();
- return array_map(function (stdClass $row): User {
+ return $rows->map(function(stdClass $row): User {
return new static($row);
- }, $rows);
+ })->all();
}
/**
@@ -256,17 +256,21 @@ class User
*/
public static function administrators(): array
{
- $rows = Database::prepare(
- "SELECT user_id, user_name, real_name, email" .
- " FROM `##user`" .
- " JOIN `##user_setting` USING (user_id)" .
- " WHERE user_id > 0 AND setting_name = 'canadmin' AND setting_value = '1'" .
- " ORDER BY real_name"
- )->fetchAll();
+ $rows = DB::table('user')
+ ->join('user_setting', function(JoinClause $join): void {
+ $join
+ ->on('user_setting.user_id', '=', 'user.user_id')
+ ->where('user_setting.setting_name', '=', 'canadmin')
+ ->where('user_setting.setting_value', '=', '1');
+ })
+ ->where('user.user_id', '>', 0)
+ ->orderBy('real_name')
+ ->select(['user.user_id', 'user_name', 'real_name', 'email'])
+ ->get();
- return array_map(function (stdClass $row): User {
+ return $rows->map(function(stdClass $row): User {
return new static($row);
- }, $rows);
+ })->all();
}
/**
@@ -278,9 +282,9 @@ class User
*/
public function checkPassword(string $password): bool
{
- $password_hash = Database::prepare(
- "SELECT password FROM `##user` WHERE user_id = ?"
- )->execute([$this->user_id])->fetchOne();
+ $password_hash = DB::table('user')
+ ->where('user_id', '=', $this->user_id)
+ ->value('password');
if ($password_hash !== null && password_verify($password, $password_hash)) {
if (password_needs_rehash($password_hash, PASSWORD_DEFAULT)) {
@@ -300,17 +304,21 @@ class User
*/
public static function managers(): array
{
- $rows = Database::prepare(
- "SELECT user_id, user_name, real_name, email" .
- " FROM `##user` JOIN `##user_gedcom_setting` USING (user_id)" .
- " WHERE setting_name = 'canedit' AND setting_value='admin'" .
- " GROUP BY user_id, real_name" .
- " ORDER BY real_name"
- )->fetchAll();
+ $rows = DB::table('user')
+ ->join('user_gedcom_setting', function(JoinClause $join): void {
+ $join
+ ->on('user_gedcom_setting.user_id', '=', 'user.user_id')
+ ->where('user_gedcom_setting.setting_name', '=', 'canedit')
+ ->where('user_gedcom_setting.setting_value', '=', 'admin');
+ })
+ ->where('user.user_id', '>', 0)
+ ->orderBy('real_name')
+ ->select(['user.user_id', 'user_name', 'real_name', 'email'])
+ ->get();
- return array_map(function (stdClass $row): User {
+ return $rows->map(function(stdClass $row): User {
return new static($row);
- }, $rows);
+ })->all();
}
/**
@@ -320,17 +328,21 @@ class User
*/
public static function moderators(): array
{
- $rows = Database::prepare(
- "SELECT user_id, user_name, real_name, email" .
- " FROM `##user` JOIN `##user_gedcom_setting` USING (user_id)" .
- " WHERE setting_name = 'canedit' AND setting_value='accept'" .
- " GROUP BY user_id, real_name" .
- " ORDER BY real_name"
- )->fetchAll();
+ $rows = DB::table('user')
+ ->join('user_gedcom_setting', function(JoinClause $join): void {
+ $join
+ ->on('user_gedcom_setting.user_id', '=', 'user.user_id')
+ ->where('user_gedcom_setting.setting_name', '=', 'canedit')
+ ->where('user_gedcom_setting.setting_value', '=', 'accept');
+ })
+ ->where('user.user_id', '>', 0)
+ ->orderBy('real_name')
+ ->select(['user.user_id', 'user_name', 'real_name', 'email'])
+ ->get();
- return array_map(function (stdClass $row): User {
+ return $rows->map(function(stdClass $row): User {
return new static($row);
- }, $rows);
+ })->all();
}
/**
@@ -340,16 +352,21 @@ class User
*/
public static function unapproved(): array
{
- $rows = Database::prepare(
- "SELECT user_id, user_name, real_name, email" .
- " FROM `##user` JOIN `##user_setting` USING (user_id)" .
- " WHERE setting_name = 'verified_by_admin' AND setting_value = '0'" .
- " ORDER BY real_name"
- )->fetchAll();
+ $rows = DB::table('user')
+ ->join('user_setting', function(JoinClause $join): void {
+ $join
+ ->on('user_setting.user_id', '=', 'user.user_id')
+ ->where('user_setting.setting_name', '=', 'verified_by_admin')
+ ->where('user_setting.setting_value', '=', '0');
+ })
+ ->where('user.user_id', '>', 0)
+ ->orderBy('real_name')
+ ->select(['user.user_id', 'user_name', 'real_name', 'email'])
+ ->get();
- return array_map(function (stdClass $row): User {
+ return $rows->map(function(stdClass $row): User {
return new static($row);
- }, $rows);
+ })->all();
}
/**
@@ -359,16 +376,21 @@ class User
*/
public static function unverified(): array
{
- $rows = Database::prepare(
- "SELECT user_id, user_name, real_name, email" .
- " FROM `##user` JOIN `##user_setting` USING (user_id)" .
- " WHERE setting_name = 'verified' AND setting_value = '0'" .
- " ORDER BY real_name"
- )->fetchAll();
+ $rows = DB::table('user')
+ ->join('user_setting', function(JoinClause $join): void {
+ $join
+ ->on('user_setting.user_id', '=', 'user.user_id')
+ ->where('user_setting.setting_name', '=', 'verified')
+ ->where('user_setting.setting_value', '=', '0');
+ })
+ ->where('user.user_id', '>', 0)
+ ->orderBy('real_name')
+ ->select(['user.user_id', 'user_name', 'real_name', 'email'])
+ ->get();
- return array_map(function (stdClass $row): User {
+ return $rows->map(function(stdClass $row): User {
return new static($row);
- }, $rows);
+ })->all();
}
/**
@@ -378,15 +400,17 @@ class User
*/
public static function allLoggedIn(): array
{
- $rows = Database::prepare(
- "SELECT DISTINCT user_id, user_name, real_name, email" .
- " FROM `##user`" .
- " JOIN `##session` USING (user_id)"
- )->fetchAll();
+ $rows = DB::table('user')
+ ->join('session', 'session.user_id', '=', 'user.user_id')
+ ->where('user.user_id', '>', 0)
+ ->orderBy('real_name')
+ ->select(['user.user_id', 'user_name', 'real_name', 'email'])
+ ->distinct()
+ ->get();
- return array_map(function (stdClass $row): User {
+ return $rows->map(function(stdClass $row): User {
return new static($row);
- }, $rows);
+ })->all();
}
/**
diff --git a/tests/app/AuthTest.php b/tests/app/AuthTest.php
index 8465167bc7..05fb4c6f23 100644
--- a/tests/app/AuthTest.php
+++ b/tests/app/AuthTest.php
@@ -99,7 +99,7 @@ class AuthTest extends \Fisharebest\Webtrees\TestCase
$user = User::create('admin', 'Administrator', 'admin@example.com', 'secret');
$this->assertFalse(Auth::isAdmin($user));
- // Make the user a manager.
+ // Make the user an administrator.
$user->setPreference('canadmin', '1');
$this->assertTrue(Auth::isAdmin($user));
diff --git a/tests/app/UserTest.php b/tests/app/UserTest.php
index 52d8250048..879ff5fa74 100644
--- a/tests/app/UserTest.php
+++ b/tests/app/UserTest.php
@@ -34,9 +34,54 @@ class UserTest extends \Fisharebest\Webtrees\TestCase
$user = User::create('user', 'User', 'user@example.com', 'secret');
$this->assertSame(1, $user->getUserId());
+ }
+
+ /**
+ * @covers \Fisharebest\Webtrees\User::setUserId
+ * @covers \Fisharebest\Webtrees\User::getUserId
+ * @covers \Fisharebest\Webtrees\User::setUserName
+ * @covers \Fisharebest\Webtrees\User::getUserName
+ * @covers \Fisharebest\Webtrees\User::setRealName
+ * @covers \Fisharebest\Webtrees\User::getRealName
+ * @covers \Fisharebest\Webtrees\User::setEmail
+ * @covers \Fisharebest\Webtrees\User::getEmail
+ * @covers \Fisharebest\Webtrees\User::setPassword
+ * @covers \Fisharebest\Webtrees\User::checkPassword
+ * @return void
+ */
+ public function testGettersAndSetters(): void
+ {
+ $user = User::create('user', 'User', 'user@example.com', 'secret');
+
+ $this->assertSame(1, $user->getUserId());
+
$this->assertSame('user', $user->getUserName());
+ $user->setUserName('foo');
+ $this->assertSame('foo', $user->getUserName());
+
$this->assertSame('User', $user->getRealName());
+ $user->setRealName('Foo');
+ $this->assertSame('Foo', $user->getRealName());
+
$this->assertSame('user@example.com', $user->getEmail());
+ $user->setEmail('foo@example.com');
+ $this->assertSame('foo@example.com', $user->getEmail());
+
+ $this->assertTrue($user->checkPassword('secret'));
+ $user->setPassword('letmein');
+ $this->assertTrue($user->checkPassword('letmein'));
+ }
+
+ /**
+ * @covers \Fisharebest\Webtrees\User::checkPassword
+ * @return void
+ */
+ public function testCheckPasswordCaseSensitive(): void
+ {
+ $user = User::create('user', 'User', 'user@example.com', 'secret');
+
+ $this->assertTrue($user->checkPassword('secret'));
+ $this->assertFalse($user->checkPassword('SECRET'));
}
/**
@@ -53,6 +98,20 @@ class UserTest extends \Fisharebest\Webtrees\TestCase
}
/**
+ * @covers \Fisharebest\Webtrees\User::setPreference
+ * @covers \Fisharebest\Webtrees\User::getPreference
+ * @return void
+ */
+ public function testPreferences(): void
+ {
+ $user = User::create('user', 'User', 'user@example.com', 'secret');
+
+ $this->assertSame('', $user->getPreference('foo'));
+ $user->setPreference('foo', 'bar');
+ $this->assertSame('bar', $user->getPreference('foo'));
+ }
+
+ /**
* @covers \Fisharebest\Webtrees\User::find
* @return void
*/
@@ -72,7 +131,7 @@ class UserTest extends \Fisharebest\Webtrees\TestCase
$user1 = User::create('user', 'User', 'user@example.com', 'secret');
$user2 = User::find($user1->getUserId());
- $this->assertSame($user1, $user2);
+ $this->assertSame($user1->getuserId(), $user2->getuserId());
}
/**
@@ -84,7 +143,7 @@ class UserTest extends \Fisharebest\Webtrees\TestCase
$user1 = User::create('user', 'User', 'user@example.com', 'secret');
$user2 = User::findByEmail($user1->getEmail());
- $this->assertSame($user1, $user2);
+ $this->assertSame($user1->getuserId(), $user2->getuserId());
}
/**
@@ -96,7 +155,7 @@ class UserTest extends \Fisharebest\Webtrees\TestCase
$user1 = User::create('user', 'User', 'user@example.com', 'secret');
$user2 = User::findByUserName($user1->getUserName());
- $this->assertSame($user1, $user2);
+ $this->assertSame($user1->getuserId(), $user2->getuserId());
}
/**
@@ -109,7 +168,138 @@ class UserTest extends \Fisharebest\Webtrees\TestCase
$user2 = User::findByIdentifier($user1->getUsername());
$user3 = User::findByIdentifier($user1->getEmail());
- $this->assertSame($user1, $user2);
- $this->assertSame($user1, $user3);
+ $this->assertSame($user1->getuserId(), $user2->getuserId());
+ $this->assertSame($user1->getuserId(), $user3->getuserId());
+ }
+
+ /**
+ * @covers \Fisharebest\Webtrees\User::findByIndividual
+ * @return void
+ */
+ public function testFindUsersByIndividual(): void
+ {
+ $user = User::create('user', 'User', 'user@example.com', 'secret');
+ Auth::login($user);
+ $tree = $this->importTree('demo.ged');
+ $indi = $tree->createIndividual('0 @@ INDI');
+ $tree->setUserPreference($user, 'gedcomid', $indi->xref());
+
+ $users = User::findByIndividual($indi);
+
+ $this->assertSame(1, count($users));
+ $this->assertSame($user->getuserId(), $users[0]->getuserId());
+ }
+
+ /**
+ * @covers \Fisharebest\Webtrees\User::all
+ * @return void
+ */
+ public function testFindAllUsers(): void
+ {
+ $user1 = User::create('bbbbb', 'BBBBB', 'bbbbb@example.com', 'secret');
+ $user2 = User::create('aaaaa', 'AAAAA', 'aaaaa@example.com', 'secret');
+
+ $users = User::all();
+
+ $this->assertSame(2, count($users));
+ $this->assertSame($user2->getUserId(), $users[0]->getUserId());
+ $this->assertSame($user1->getUserId(), $users[1]->getUserId());
+ }
+
+ /**
+ * @covers \Fisharebest\Webtrees\User::administrators
+ * @return void
+ */
+ public function testFindAdministrators(): void
+ {
+ User::create('user', 'User', 'user@example.com', 'secret');
+
+ $admin = User::create('admin', 'Admin', 'admin@example.com', 'secret');
+ $admin->setPreference('canadmin', '1');
+
+ $users = User::administrators();
+
+ $this->assertSame(1, count($users));
+ $this->assertSame($admin->getUserId(), $users[0]->getUserId());
+ }
+
+ /**
+ * @covers \Fisharebest\Webtrees\User::managers
+ * @return void
+ */
+ public function testFindManagers(): void
+ {
+ $user1 = User::create('user1', 'User1', 'user1@example.com', 'secret');
+ $user2 = User::create('user2', 'User2', 'user2@example.com', 'secret');
+ $user3 = User::create('user3', 'User3', 'user3@example.com', 'secret');
+ $user4 = User::create('user4', 'User4', 'user4@example.com', 'secret');
+
+ $tree = $this->importTree('demo.ged');
+ $tree->setUserPreference($user1, 'canedit', 'admin');
+ $tree->setUserPreference($user2, 'canedit', 'accept');
+ $tree->setUserPreference($user3, 'canedit', 'edit');
+ $tree->setUserPreference($user4, 'canedit', 'access');
+
+ $users = User::managers();
+
+ $this->assertSame(1, count($users));
+ $this->assertSame($user1->getuserId(), $users[0]->getuserId());
+ }
+
+ /**
+ * @covers \Fisharebest\Webtrees\User::moderators
+ * @return void
+ */
+ public function testFindModerators(): void
+ {
+ $user1 = User::create('user1', 'User1', 'user1@example.com', 'secret');
+ $user2 = User::create('user2', 'User2', 'user2@example.com', 'secret');
+ $user3 = User::create('user3', 'User3', 'user3@example.com', 'secret');
+ $user4 = User::create('user4', 'User4', 'user4@example.com', 'secret');
+
+ $tree = $this->importTree('demo.ged');
+ $tree->setUserPreference($user1, 'canedit', 'admin');
+ $tree->setUserPreference($user2, 'canedit', 'accept');
+ $tree->setUserPreference($user3, 'canedit', 'edit');
+ $tree->setUserPreference($user4, 'canedit', 'access');
+
+ $users = User::moderators();
+
+ $this->assertSame(1, count($users));
+ $this->assertSame($user2->getuserId(), $users[0]->getuserId());
+ }
+
+ /**
+ * @covers \Fisharebest\Webtrees\User::unapproved
+ * @covers \Fisharebest\Webtrees\User::unverified
+ * @return void
+ */
+ public function testFindUnapprovedAndUnverified(): void
+ {
+ $user1 = User::create('user1', 'User1', 'user1@example.com', 'secret');
+ $user2 = User::create('user2', 'User2', 'user2@example.com', 'secret');
+ $user3 = User::create('user3', 'User3', 'user3@example.com', 'secret');
+ $user4 = User::create('user4', 'User4', 'user4@example.com', 'secret');
+
+ $user1->setPreference('verified', '0');
+ $user1->setPreference('verified_by_admin', '0');
+ $user2->setPreference('verified', '0');
+ $user2->setPreference('verified_by_admin', '1');
+ $user3->setPreference('verified', '1');
+ $user3->setPreference('verified_by_admin', '0');
+ $user4->setPreference('verified', '1');
+ $user4->setPreference('verified_by_admin', '1');
+
+ $users = User::unapproved();
+
+ $this->assertSame(2, count($users));
+ $this->assertSame($user1->getuserId(), $users[0]->getuserId());
+ $this->assertSame($user3->getuserId(), $users[1]->getuserId());
+
+ $users = User::unverified();
+
+ $this->assertSame(2, count($users));
+ $this->assertSame($user1->getuserId(), $users[0]->getuserId());
+ $this->assertSame($user2->getuserId(), $users[1]->getuserId());
}
}