From c748fd52fb0c98af674d8cd250353312e2cb87d1 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sat, 3 Mar 2018 22:08:06 +0800 Subject: [PATCH] Prevent user from being deleted if user has been paid --- app/Entities/Users/User.php | 5 +++++ app/Policies/UserPolicy.php | 4 +++- tests/Unit/Models/UserTest.php | 15 +++++++++++++++ tests/Unit/Policies/UserPolicyTest.php | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/Entities/Users/User.php b/app/Entities/Users/User.php index 7c1a704..8b1ee78 100644 --- a/app/Entities/Users/User.php +++ b/app/Entities/Users/User.php @@ -136,4 +136,9 @@ class User extends Authenticatable ->groupBy('worker_id') ->groupBy('project_id'); } + + public function payments() + { + return $this->morphMany('App\Entities\Payments\Payment', 'partner'); + } } diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 5fb41b4..efd1ec8 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -64,6 +64,8 @@ class UserPolicy */ public function delete(User $user, Worker $worker) { - return $user->hasRole('admin') && $worker->jobs->isEmpty(); + return $user->hasRole('admin') + && $worker->jobs()->count() == 0 + && $worker->payments()->count() == 0; } } diff --git a/tests/Unit/Models/UserTest.php b/tests/Unit/Models/UserTest.php index e7f44b6..85f7011 100644 --- a/tests/Unit/Models/UserTest.php +++ b/tests/Unit/Models/UserTest.php @@ -2,6 +2,7 @@ namespace Tests\Unit\Models; +use App\Entities\Payments\Payment; use App\Entities\Projects\Job; use App\Entities\Projects\Project; use App\Entities\Users\User; @@ -125,4 +126,18 @@ class UserTest extends TestCase $this->assertInstanceOf(Project::class, $user->projects->first()); $this->assertCount(1, $user->projects); } + + /** @test */ + public function a_user_has_many_payments_with_morph_relation() + { + $user = factory(User::class)->create(); + $payment = factory(Payment::class)->create([ + 'partner_type' => 'App\Entities\Users\User', + 'partner_id' => $user->id, + ]); + + $this->assertInstanceOf(Collection::class, $user->payments); + $this->assertInstanceOf(Payment::class, $user->payments->first()); + $this->assertCount(1, $user->payments); + } } diff --git a/tests/Unit/Policies/UserPolicyTest.php b/tests/Unit/Policies/UserPolicyTest.php index ad44968..4aced44 100644 --- a/tests/Unit/Policies/UserPolicyTest.php +++ b/tests/Unit/Policies/UserPolicyTest.php @@ -2,6 +2,7 @@ namespace Tests\Unit\Policies; +use App\Entities\Payments\Payment; use App\Entities\Projects\Job; use App\Entities\Users\User; use Illuminate\Foundation\Testing\DatabaseMigrations; @@ -55,4 +56,17 @@ class UserPolicyTest extends TestCase $this->assertFalse($admin->can('delete', $user)); } + + /** @test */ + public function admin_cannot_delete_a_user_if_user_has_been_paid() + { + $admin = $this->adminUserSigningIn(); + $user = factory(User::class)->create(); + $payment = factory(Payment::class)->create([ + 'partner_type' => 'App\Entities\Users\User', + 'partner_id' => $user->id, + ]); + + $this->assertFalse($admin->can('delete', $user)); + } }