Files
ladill-care/tests/Feature/CareMyShiftsAndNavPermissionsTest.php
T
isaaccladandCursor 7c32b34715
Deploy Ladill Care / deploy (push) Successful in 52s
Gate ward admin nav to nursing roles and add My shifts for staff.
Ambulance and other non-nursing vitals roles no longer see Care units / Nursing Services; staff get a personal duty roster view of assigned shifts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-20 11:26:52 +00:00

171 lines
5.4 KiB
PHP

<?php
namespace Tests\Feature;
use App\Http\Middleware\EnsurePlatformSession;
use App\Models\Branch;
use App\Models\CareUnit;
use App\Models\Department;
use App\Models\Member;
use App\Models\Organization;
use App\Models\User;
use App\Services\Care\CarePermissions;
use App\Services\Care\RosterService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class CareMyShiftsAndNavPermissionsTest extends TestCase
{
use RefreshDatabase;
protected User $owner;
protected Organization $organization;
protected Branch $branch;
protected CareUnit $unit;
protected function setUp(): void
{
parent::setUp();
$this->withoutMiddleware(EnsurePlatformSession::class);
$this->owner = User::create([
'public_id' => 'my-shifts-owner',
'name' => 'Owner',
'email' => 'my-shifts-owner@example.com',
]);
$this->organization = Organization::create([
'owner_ref' => $this->owner->public_id,
'name' => 'Shifts Clinic',
'slug' => 'shifts-clinic',
'settings' => [
'onboarded' => true,
'facility_type' => 'hospital',
'plan' => 'pro',
'plan_expires_at' => now()->addMonth()->toIso8601String(),
],
]);
Member::create([
'owner_ref' => $this->owner->public_id,
'organization_id' => $this->organization->id,
'user_ref' => $this->owner->public_id,
'role' => 'hospital_admin',
]);
$this->branch = Branch::create([
'owner_ref' => $this->owner->public_id,
'organization_id' => $this->organization->id,
'name' => 'Main',
'is_active' => true,
]);
$department = Department::create([
'owner_ref' => $this->owner->public_id,
'branch_id' => $this->branch->id,
'name' => 'Medicine',
'type' => 'general',
'is_active' => true,
]);
$this->unit = CareUnit::create([
'owner_ref' => $this->owner->public_id,
'organization_id' => $this->organization->id,
'department_id' => $department->id,
'name' => 'Medical Ward',
'kind' => 'inpatient',
'is_active' => true,
]);
}
public function test_ambulance_staff_cannot_access_care_units_or_nursing_services_hub(): void
{
$user = User::create([
'public_id' => 'amb-staff',
'name' => 'Ambulance',
'email' => 'amb@example.com',
]);
$member = Member::create([
'owner_ref' => $this->owner->public_id,
'organization_id' => $this->organization->id,
'user_ref' => $user->public_id,
'role' => 'ambulance_staff',
'branch_id' => $this->branch->id,
]);
$permissions = app(CarePermissions::class);
$this->assertFalse($permissions->can($member, 'nursing.services.view'));
$this->assertFalse($permissions->can($member, 'inpatient.placement.view'));
$this->assertFalse($permissions->can($member, 'admin.departments.view'));
$this->assertTrue($permissions->can($member, 'nursing.my_shifts.view'));
$this->actingAs($user)
->get(route('care.care-units.index'))
->assertForbidden();
$this->actingAs($user)
->get(route('care.nursing.services'))
->assertForbidden();
$this->actingAs($user)
->get(route('care.dashboard'))
->assertOk()
->assertDontSee('>Care units<', false)
->assertDontSee('>Nursing Services<', false)
->assertSee('My shifts', false);
}
public function test_staff_see_their_assigned_shifts(): void
{
$user = User::create([
'public_id' => 'nurse-shifts',
'name' => 'Nurse Ama',
'email' => 'nurse-shifts@example.com',
]);
$member = Member::create([
'owner_ref' => $this->owner->public_id,
'organization_id' => $this->organization->id,
'user_ref' => $user->public_id,
'role' => 'nurse',
'branch_id' => $this->branch->id,
]);
$roster = app(RosterService::class);
$shifts = $roster->ensureDefaultShifts($this->organization, $this->owner->public_id);
$day = $shifts->firstWhere('code', 'day');
$roster->assign(
$this->unit,
$day,
$member,
now()->toDateString(),
$this->owner->public_id,
$this->owner->public_id,
);
$this->actingAs($user)
->get(route('care.my-shifts'))
->assertOk()
->assertSee('My shifts')
->assertSee('Medical Ward')
->assertSee('Day shift');
}
public function test_nurse_still_gets_nursing_services_access(): void
{
$member = Member::create([
'owner_ref' => $this->owner->public_id,
'organization_id' => $this->organization->id,
'user_ref' => 'nurse-hub',
'role' => 'nurse',
]);
$permissions = app(CarePermissions::class);
$this->assertTrue($permissions->can($member, 'nursing.services.view'));
$this->assertTrue($permissions->can($member, 'inpatient.placement.view'));
}
}