From 63cd003425255d7746af4c1e931b5088707177c0 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 18 Mar 2026 01:11:16 +0700 Subject: [PATCH] feat: Add comprehensive feature tests for Filament CategoryResource covering CRUD operations, status toggling, and permissions. --- .../Categories/CategoryResourceTest.php | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 tests/Feature/Filament/Resources/Master/Categories/CategoryResourceTest.php diff --git a/tests/Feature/Filament/Resources/Master/Categories/CategoryResourceTest.php b/tests/Feature/Filament/Resources/Master/Categories/CategoryResourceTest.php new file mode 100644 index 0000000..175fc9b --- /dev/null +++ b/tests/Feature/Filament/Resources/Master/Categories/CategoryResourceTest.php @@ -0,0 +1,167 @@ +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]); +});