Add tests for delete predefined kit endpoint

This commit is contained in:
Marcus Moore 2024-09-16 13:29:41 -07:00
parent 53c673dee2
commit c269184c60
No known key found for this signature in database
4 changed files with 87 additions and 0 deletions

View file

@ -4,6 +4,7 @@ namespace App\Models;
use App\Models\Traits\Searchable; use App\Models\Traits\Searchable;
use App\Presenters\Presentable; use App\Presenters\Presentable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use Watson\Validating\ValidatingTrait; use Watson\Validating\ValidatingTrait;
@ -16,6 +17,7 @@ use Watson\Validating\ValidatingTrait;
class PredefinedKit extends SnipeModel class PredefinedKit extends SnipeModel
{ {
protected $presenter = \App\Presenters\PredefinedKitPresenter::class; protected $presenter = \App\Presenters\PredefinedKitPresenter::class;
use HasFactory;
use Presentable; use Presentable;
protected $table = 'kits'; protected $table = 'kits';

View file

@ -0,0 +1,23 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\PredefinedKit>
*/
class PredefinedKitFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => $this->faker->words(3, true),
];
}
}

View file

@ -351,6 +351,11 @@ class UserFactory extends Factory
return $this->appendPermission(['manufacturers.delete' => '1']); return $this->appendPermission(['manufacturers.delete' => '1']);
} }
public function deletePredefinedKits()
{
return $this->appendPermission(['kits.delete' => '1']);
}
private function appendPermission(array $permission) private function appendPermission(array $permission)
{ {
return $this->state(function ($currentState) use ($permission) { return $this->state(function ($currentState) use ($permission) {

View file

@ -0,0 +1,57 @@
<?php
namespace Tests\Feature\PredefinedKits\Api;
use App\Models\PredefinedKit;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Tests\Concerns\TestsPermissionsRequirement;
use Tests\TestCase;
class DeletePredefinedKitTest extends TestCase implements TestsPermissionsRequirement
{
public function testRequiresPermission()
{
$predefinedKit = PredefinedKit::factory()->create();
$this->actingAsForApi(User::factory()->create())
->deleteJson(route('api.kits.destroy', $predefinedKit))
->assertForbidden();
}
public function testCanDeletePredefinedKits()
{
$predefinedKit = PredefinedKit::factory()->create();
$this->actingAsForApi(User::factory()->deletePredefinedKits()->create())
->deleteJson(route('api.kits.destroy', $predefinedKit))
->assertOk()
->assertStatusMessageIs('success');
$this->assertDatabaseMissing('kits', ['id' => $predefinedKit->id]);
}
public function testAssociatedDataDetachedWhenPredefinedKitDeleted()
{
$predefinedKit = PredefinedKit::factory()
->hasAccessories()
->hasConsumables()
->hasLicenses()
->hasModels()
->create();
$this->assertGreaterThan(0, $predefinedKit->accessories->count(), 'Precondition failed: PredefinedKit has no accessories');
$this->assertGreaterThan(0, $predefinedKit->consumables->count(), 'Precondition failed: PredefinedKit has no consumables');
$this->assertGreaterThan(0, $predefinedKit->licenses->count(), 'Precondition failed: PredefinedKit has no licenses');
$this->assertGreaterThan(0, $predefinedKit->models->count(), 'Precondition failed: PredefinedKit has no models');
$this->actingAsForApi(User::factory()->deletePredefinedKits()->create())
->deleteJson(route('api.kits.destroy', $predefinedKit))
->assertStatusMessageIs('success');
$this->assertEquals(0, DB::table('kits_accessories')->where('kit_id', $predefinedKit->id)->count());
$this->assertEquals(0, DB::table('kits_consumables')->where('kit_id', $predefinedKit->id)->count());
$this->assertEquals(0, DB::table('kits_licenses')->where('kit_id', $predefinedKit->id)->count());
$this->assertEquals(0, DB::table('kits_models')->where('kit_id', $predefinedKit->id)->count());
}
}