Add feature tests for Doctor-related functionalities

This commit is contained in:
2026-09-21 05:41:06 +03:30
parent e987a528ef
commit 6e92ebaada
29 changed files with 2634 additions and 29 deletions
@@ -0,0 +1,99 @@
<?php
namespace Tests\Feature\Http\Admin\Role;
use App\Models\Permission;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Inertia\Testing\AssertableInertia as Assert;
use Maatwebsite\Excel\Facades\Excel;
use Tests\Concerns\InteractsWithAdmin;
use Tests\TestCase;
class PermissionControllerTest extends TestCase
{
use InteractsWithAdmin, RefreshDatabase;
public function test_guest_is_redirected(): void
{
$this->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');
}
}
@@ -0,0 +1,103 @@
<?php
namespace Tests\Feature\Http\Admin\Role;
use App\Models\Permission;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Inertia\Testing\AssertableInertia as Assert;
use Maatwebsite\Excel\Facades\Excel;
use Spatie\Permission\Models\Role;
use Tests\Concerns\InteractsWithAdmin;
use Tests\TestCase;
class RoleControllerTest extends TestCase
{
use InteractsWithAdmin, RefreshDatabase;
public function test_guest_is_redirected(): void
{
$this->get(route('admin.roles.index'))->assertRedirect(route('login'));
}
public function test_admin_without_permission_is_forbidden(): void
{
$admin = $this->adminWithoutPermissions();
$this->actingAs($admin)->get(route('admin.roles.index'))->assertForbidden();
$this->actingAs($admin)->post(route('admin.roles.store'), ['name' => 'x', 'label' => 'y'])->assertForbidden();
$this->actingAs($admin)->post('/admin/roles-bulk-delete', ['ids' => []])->assertForbidden();
}
public function test_index_renders_with_search(): void
{
$admin = $this->adminWithAllPermissions();
Role::create(['name' => 'editor', 'label' => 'ویرایشگر']);
$this->actingAs($admin)->get(route('admin.roles.index'))->assertOk()->assertInertia(fn (Assert $page) => $page->component('Roles/index')->has('roles.data', 2));
$this->actingAs($admin)->get(route('admin.roles.index', ['search' => 'edit']))->assertInertia(fn (Assert $page) => $page->has('roles.data', 1));
}
public function test_create_and_edit_pages_render_with_grouped_permissions(): void
{
$admin = $this->adminWithAllPermissions();
$role = Role::where('name', 'admin')->first();
$parent = Permission::where('name', 'users')->first();
$this->actingAs($admin)->get(route('admin.roles.create'))->assertInertia(fn (Assert $page) => $page->component('Roles/create_and_edit')->has('permissions'));
$this->actingAs($admin)->get(route('admin.roles.edit', $role))->assertInertia(fn (Assert $page) => $page
->component('Roles/create_and_edit')
->where('is_edit', true)
->where('role.id', $role->id)
->has("role.permissions.{$parent->id}"));
}
public function test_store_creates_role_with_permissions(): void
{
$admin = $this->adminWithAllPermissions();
$permissionIds = Permission::where('name', 'like', 'users.%')->pluck('id')->all();
$this->actingAs($admin)->post(route('admin.roles.store'), ['name' => 'editor', 'label' => 'ویرایشگر', 'selectedPermissionIds' => [$permissionIds]])->assertCreated()->assertSessionHas('success');
$role = Role::where('name', 'editor')->first();
$this->assertNotNull($role);
$this->assertEqualsCanonicalizing($permissionIds, $role->permissions->pluck('id')->all());
}
public function test_store_validates_input(): void
{
$this->actingAs($this->adminWithAllPermissions())->postJson(route('admin.roles.store'), [])->assertUnprocessable()->assertJsonValidationErrors(['name', 'label']);
}
public function test_update_changes_role_and_permissions(): void
{
$admin = $this->adminWithAllPermissions();
$role = Role::create(['name' => 'editor', 'label' => 'x']);
$permission = Permission::where('name', 'pets.index')->first();
$this->actingAs($admin)->put(route('admin.roles.update', $role), ['name' => 'editor2', 'label' => 'y', 'selectedPermissionIds' => [[$permission->id]]])->assertOk();
$role->refresh();
$this->assertSame('editor2', $role->name);
$this->assertTrue($role->hasPermissionTo($permission));
}
public function test_destroy_and_bulk_delete_remove_roles(): void
{
$admin = $this->adminWithAllPermissions();
$roles = collect(['a', 'b', 'c'])->map(fn ($name) => Role::create(['name' => $name, 'label' => $name]));
$this->actingAs($admin)->delete(route('admin.roles.destroy', $roles[0]))->assertOk();
$this->actingAs($admin)->post('/admin/roles-bulk-delete', ['ids' => [$roles[1]->id, $roles[2]->id]])->assertOk();
$this->assertSame(1, Role::count());
}
public function test_export_data_downloads_excel(): void
{
Excel::fake();
$this->actingAs($this->adminWithAllPermissions())->get('/admin/roles-export-data')->assertOk();
Excel::assertDownloaded('roles.xlsx');
}
}