diff --git a/app/Models/User.php b/app/Models/User.php index c0d9470b1..5e385b951 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -312,6 +312,11 @@ public function hasBlocked(User $user): bool return $this->blockedUsers()->where('blocked_user_id', $user->getKey())->exists(); } + public function hasUnblocked(User $user): bool + { + return ! $this->hasBlocked($user); + } + public function scopeWithUsersWhoDoesntBlock(Builder $query, User $user) { return $query->whereDoesntHave('blockedUsers', function ($query) use ($user) { diff --git a/tests/Feature/BlockUsersTest.php b/tests/Feature/BlockUsersTest.php new file mode 100644 index 000000000..8fe884446 --- /dev/null +++ b/tests/Feature/BlockUsersTest.php @@ -0,0 +1,65 @@ +createUser(); + + $this->put("/users/{$user->username}/block")->assertRedirectedTo('login'); +}); + +test('cannot unblock user when not logged in', function () { + $user = $this->createUser(); + + $this->put("/users/{$user->username}/unblock")->assertRedirectedTo('login'); +}); + +test('cannot block self', function () { + $user = $this->createUser(); + + $this->loginAs($user); + + $this->put("/users/{$user->username}/block")->assertForbidden(); +}); + +test('cannot block moderator', function () { + $user = $this->createUser(); + $moderator = $this->createUser([ + 'username' => 'moderator', + 'email' => 'moderator@example.com', + 'type' => User::MODERATOR, + ]); + + $this->loginAs($user); + + $this->put("/users/{$moderator->username}/block")->assertForbidden(); +}); + +test('can block other user', function () { + $blocker = $this->createUser(); + $blocked = $this->createUser([ + 'username' => 'blocked', + 'email' => 'blocked@example.com', + ]); + + $this->loginAs($blocker); + + $this->put("/users/{$blocked->username}/block")->assertSessionHas('success', trans('settings.user.blocked')); +}); + +test('can unblock other user', function () { + $unblocker = $this->createUser(); + $unblocked = $this->createUser([ + 'username' => 'unblocked', + 'email' => 'unblocked@example.com', + ]); + + $this->loginAs($unblocker); + + $this->put("/users/{$unblocked->username}/unblock")->assertSessionHas('success', trans('settings.user.unblocked')); +}); diff --git a/tests/Integration/Jobs/BlockUserTest.php b/tests/Integration/Jobs/BlockUserTest.php new file mode 100644 index 000000000..398848914 --- /dev/null +++ b/tests/Integration/Jobs/BlockUserTest.php @@ -0,0 +1,22 @@ +createUser(); + $blocked = $this->createUser([ + 'username' => 'blocked', + 'email' => 'blocked@example.com', + ]); + + $this->loginAs($blocker); + + $this->dispatch(new BlockUser($blocker, $blocked)); + + expect($blocker->hasBlocked($blocked))->toBeTrue(); +}); diff --git a/tests/Integration/Jobs/UnblockUserTest.php b/tests/Integration/Jobs/UnblockUserTest.php new file mode 100644 index 000000000..1594d7592 --- /dev/null +++ b/tests/Integration/Jobs/UnblockUserTest.php @@ -0,0 +1,22 @@ +createUser(); + $unblocked = $this->createUser([ + 'username' => 'unblocked', + 'email' => 'unblocked@example.com', + ]); + + $this->loginAs($unblocker); + + $this->dispatch(new UnblockUser($unblocker, $unblocked)); + + expect($unblocker->hasUnblocked($unblocked))->toBeTrue(); +});