get(route('admin.permissions.index'))->assertRedirect(route('login')); } public function test_admin_without_permission_is_forbidden(): void { $admin = $this->adminWithoutPermissions(); $this->actingAs($admin)->get(route('admin.permissions.index'))->assertForbidden(); $this->actingAs($admin)->post(route('admin.permissions.store'), ['name' => 'x', 'label' => 'y'])->assertForbidden(); $this->actingAs($admin)->post('/admin/permissions-bulk-delete', ['ids' => []])->assertForbidden(); } public function test_index_renders_with_search(): void { $admin = $this->adminWithAllPermissions(); $this->actingAs($admin)->get(route('admin.permissions.index'))->assertOk()->assertInertia(fn (Assert $page) => $page->component('Permissions/index')->has('permissions.data', 20)); $this->actingAs($admin)->get(route('admin.permissions.index', ['search' => 'withdrawals']))->assertInertia(fn (Assert $page) => $page->has('permissions.data', 2)); } public function test_create_and_edit_pages_render_with_parent_permissions(): void { $admin = $this->adminWithAllPermissions(); $child = Permission::where('name', 'users.index')->first(); $parents = Permission::where('parent_id', 0)->count(); $this->actingAs($admin)->get(route('admin.permissions.create'))->assertInertia(fn (Assert $page) => $page->component('Permissions/create_and_edit')->has('permissions.data', $parents)); $this->actingAs($admin)->get(route('admin.permissions.edit', $child))->assertInertia(fn (Assert $page) => $page->where('is_edit', true)->where('permission.id', $child->id)->where('permission.parent_id', $child->parent_id)); } public function test_store_creates_permission_with_parent(): void { $admin = $this->adminWithAllPermissions(); $parent = Permission::where('name', 'users')->first(); $this->actingAs($admin)->post(route('admin.permissions.store'), ['name' => 'users.export', 'label' => 'خروجی', 'parent_id' => $parent->id])->assertCreated()->assertSessionHas('success'); $this->assertDatabaseHas('permissions', ['name' => 'users.export', 'label' => 'خروجی', 'parent_id' => $parent->id]); } public function test_store_defaults_parent_to_zero_and_validates(): void { $admin = $this->adminWithAllPermissions(); $this->actingAs($admin)->post(route('admin.permissions.store'), ['name' => 'reports2', 'label' => 'x'])->assertCreated(); $this->assertDatabaseHas('permissions', ['name' => 'reports2', 'parent_id' => 0]); $this->actingAs($admin)->postJson(route('admin.permissions.store'), [])->assertUnprocessable()->assertJsonValidationErrors(['name', 'label']); } public function test_update_changes_permission(): void { $admin = $this->adminWithAllPermissions(); $permission = Permission::where('name', 'users.index')->first(); $this->actingAs($admin)->put(route('admin.permissions.update', $permission), ['name' => 'users.list', 'label' => 'لیست'])->assertOk(); $this->assertDatabaseHas('permissions', ['id' => $permission->id, 'name' => 'users.list', 'label' => 'لیست', 'parent_id' => 0]); } public function test_destroy_and_bulk_delete_remove_permissions(): void { $admin = $this->adminWithAllPermissions(); $targets = Permission::where('name', 'like', 'pets.%')->take(3)->get(); $this->actingAs($admin)->delete(route('admin.permissions.destroy', $targets[0]))->assertOk(); $this->actingAs($admin)->post('/admin/permissions-bulk-delete', ['ids' => [$targets[1]->id, $targets[2]->id]])->assertOk(); foreach ($targets as $permission) { $this->assertDatabaseMissing('permissions', ['id' => $permission->id]); } } public function test_export_data_downloads_excel(): void { Excel::fake(); $this->actingAs($this->adminWithAllPermissions())->get('/admin/permissions-export-data')->assertOk(); Excel::assertDownloaded('permissions.xlsx'); } }