Browse Source

Prevent user from being deleted if user has been paid

pull/6/head
Nafies Luthfi 8 years ago
parent
commit
c748fd52fb
  1. 5
      app/Entities/Users/User.php
  2. 4
      app/Policies/UserPolicy.php
  3. 15
      tests/Unit/Models/UserTest.php
  4. 14
      tests/Unit/Policies/UserPolicyTest.php

5
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');
}
}

4
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;
}
}

15
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);
}
}

14
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));
}
}
Loading…
Cancel
Save