diff options
| -rw-r--r-- | app/User.php | 146 | ||||
| -rw-r--r-- | tests/app/AuthTest.php | 2 | ||||
| -rw-r--r-- | tests/app/UserTest.php | 200 |
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()); } } |
