feat: Add comprehensive feature tests for Filament CategoryResource covering CRUD operations, status toggling, and permissions.
This commit is contained in:
parent
0e53ef8cc7
commit
63cd003425
@ -0,0 +1,167 @@
|
||||
<?php
|
||||
|
||||
use App\Enums\IsActive;
|
||||
use App\Enums\RoleEnum;
|
||||
use App\Filament\Resources\Master\Categories\Pages\ManageCategories;
|
||||
use App\Models\Category;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
use Spatie\Permission\Models\Role;
|
||||
|
||||
uses(RefreshDatabase::class);
|
||||
|
||||
beforeEach(function () {
|
||||
$this->user = User::factory()->create(['is_active' => IsActive::ACTIVE]);
|
||||
|
||||
// Setup Permissions
|
||||
$permissions = [
|
||||
'ViewAny:Category',
|
||||
'Create:Category',
|
||||
'Update:Category',
|
||||
'Delete:Category',
|
||||
'Restore:Category',
|
||||
'ForceDelete:Category',
|
||||
];
|
||||
|
||||
foreach ($permissions as $permission) {
|
||||
Permission::firstOrCreate(['name' => $permission, 'guard_name' => 'web']);
|
||||
}
|
||||
|
||||
$this->user->givePermissionTo($permissions);
|
||||
});
|
||||
|
||||
test('can render category list page', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->assertSuccessful();
|
||||
});
|
||||
|
||||
test('can list categories', function () {
|
||||
$categories = Category::factory()->count(5)->create();
|
||||
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->call('loadTable')
|
||||
->assertCanSeeTableRecords($categories);
|
||||
});
|
||||
|
||||
test('can create category', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->mountAction('create')
|
||||
->setActionData([
|
||||
'name' => 'Kategori Baru',
|
||||
])
|
||||
->callMountedAction()
|
||||
->assertHasNoActionErrors();
|
||||
|
||||
$this->assertDatabaseHas('categories', [
|
||||
'name' => 'Kategori Baru',
|
||||
'is_active' => IsActive::ACTIVE->value,
|
||||
]);
|
||||
});
|
||||
|
||||
test('cannot create category with empty name', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->mountAction('create')
|
||||
->setActionData(['name' => ''])
|
||||
->callMountedAction()
|
||||
->assertHasActionErrors(['name' => 'required']);
|
||||
});
|
||||
|
||||
test('cannot create category with name exceeding 50 characters', function () {
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->mountAction('create')
|
||||
->setActionData(['name' => str_repeat('a', 51)])
|
||||
->callMountedAction()
|
||||
->assertHasActionErrors(['name' => 'max']);
|
||||
});
|
||||
|
||||
test('can edit category', function () {
|
||||
$category = Category::factory()->create();
|
||||
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->mountTableAction('edit', $category)
|
||||
->setActionData([
|
||||
'name' => 'Kategori Updated',
|
||||
])
|
||||
->callMountedTableAction()
|
||||
->assertHasNoActionErrors();
|
||||
|
||||
expect($category->refresh()->name)->toBe('Kategori Updated');
|
||||
});
|
||||
|
||||
test('can toggle is_active status', function () {
|
||||
$category = Category::factory()->create(['is_active' => IsActive::INACTIVE]);
|
||||
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->call('updateTableColumnState', 'is_active', $category->getKey(), true);
|
||||
|
||||
expect($category->refresh()->is_active)->toBe(IsActive::ACTIVE);
|
||||
});
|
||||
|
||||
test('unauthorized user cannot render category page', function () {
|
||||
$unauthorizedUser = User::factory()->create(['is_active' => IsActive::ACTIVE]);
|
||||
|
||||
$this->actingAs($unauthorizedUser);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->assertForbidden();
|
||||
});
|
||||
|
||||
test('can delete category', function () {
|
||||
$category = Category::factory()->create();
|
||||
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->callTableAction('delete', $category);
|
||||
|
||||
$this->assertSoftDeleted($category);
|
||||
});
|
||||
|
||||
test('can restore deleted category', function () {
|
||||
$roleDev = Role::firstOrCreate(['name' => RoleEnum::DEVELOPER->value, 'guard_name' => 'web']);
|
||||
$this->user->assignRole($roleDev);
|
||||
|
||||
$category = Category::factory()->create(['deleted_at' => now()]);
|
||||
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->filterTable('trashed', 'with')
|
||||
->callTableAction('restore', $category);
|
||||
|
||||
$this->assertDatabaseHas('categories', [
|
||||
'id' => $category->id,
|
||||
'deleted_at' => null,
|
||||
]);
|
||||
});
|
||||
|
||||
test('can force delete category', function () {
|
||||
$roleDev = Role::firstOrCreate(['name' => RoleEnum::DEVELOPER->value, 'guard_name' => 'web']);
|
||||
$this->user->assignRole($roleDev);
|
||||
|
||||
$category = Category::factory()->create(['deleted_at' => now()]);
|
||||
|
||||
$this->actingAs($this->user);
|
||||
|
||||
Livewire::test(ManageCategories::class)
|
||||
->filterTable('trashed', 'only')
|
||||
->callTableAction('forceDelete', $category);
|
||||
|
||||
$this->assertDatabaseMissing('categories', ['id' => $category->id]);
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user