Files
clinicpro/tests/Secretary/SecretaryFieldsTest.php
T
hamedandClaude Opus 4.8 89e23a2c0d feat: port secretaries tab from tauri to admin my-secretaries page
- Redesign MySecretariesPage pixel-perfect to clinic-pro-tauri (active/previous
  tabs, desktop table, mobile cards, add/edit/view modal with permission
  accordions, deactivate confirm)
- Permission sections based on existing admin pages (appointments, patients,
  payments, insurances, addresses, clinic_info)
- Extend DoctorSecretary with national_code + address columns (+migration);
  wire create/update in SecretaryController; add patients/payments to
  DEFAULT_PERMISSIONS
- Extend Secretary/SecretaryPermissions types; update admin SecretariesPage
- Backend + frontend tests; update docs/api/secretary.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 12:23:17 +03:30

110 lines
4.1 KiB
PHP

<?php
namespace App\Tests\Secretary;
use App\Doctor\Entity\Doctor;
use App\Tests\ApiTestCase;
/**
* Covers the national_code / address fields and the extended permission
* taxonomy (patients, payments) on the secretary create/update endpoints.
*/
class SecretaryFieldsTest extends ApiTestCase
{
/** @return array{0: \App\Auth\Entity\User, 1: Doctor} */
private function makeDoctor(): array
{
$owner = $this->createUser(['ROLE_DOCTOR']);
$doctor = new Doctor($owner, 'دکتر تست');
$this->em->persist($doctor);
$this->em->flush();
return [$owner, $doctor];
}
public function testCreatePersistsNationalCodeAddressAndExtendedPermissions(): void
{
[$owner, $doctor] = $this->makeDoctor();
$mobile = '09' . str_pad((string) random_int(0, 999_999_999), 9, '0', STR_PAD_LEFT);
$res = $this->authJson('POST', '/api/v1/secretary', $owner, [
'doctor_uuid' => $doctor->getUuid(),
'mobile_number' => $mobile,
'name' => 'سارا احمدی',
'national_code' => '1234567890',
'address' => 'یزد، خیابان تست',
'permissions' => [
'version' => 1,
'resources' => [
'patients' => ['view' => true, 'create' => true],
'payments' => ['view' => true],
],
],
]);
$this->assertSame(201, $this->responseCode());
$data = $res['data']['data'] ?? $res['data'];
$this->assertSame('1234567890', $data['national_code']);
$this->assertSame('یزد، خیابان تست', $data['address']);
$this->assertTrue($data['permissions']['patients']['view']);
$this->assertTrue($data['permissions']['patients']['create']);
$this->assertTrue($data['permissions']['payments']['view']);
}
public function testCreateWithoutOptionalFieldsPersistsNulls(): void
{
[$owner, $doctor] = $this->makeDoctor();
$mobile = '09' . str_pad((string) random_int(0, 999_999_999), 9, '0', STR_PAD_LEFT);
$res = $this->authJson('POST', '/api/v1/secretary', $owner, [
'doctor_uuid' => $doctor->getUuid(),
'mobile_number' => $mobile,
'name' => 'بدون کدملی',
]);
$this->assertSame(201, $this->responseCode());
$data = $res['data']['data'] ?? $res['data'];
$this->assertNull($data['national_code']);
$this->assertNull($data['address']);
}
public function testUpdateChangesNameNationalCodeAddressAndPermissions(): void
{
[$owner, $doctor] = $this->makeDoctor();
$mobile = '09' . str_pad((string) random_int(0, 999_999_999), 9, '0', STR_PAD_LEFT);
$created = $this->authJson('POST', '/api/v1/secretary', $owner, [
'doctor_uuid' => $doctor->getUuid(),
'mobile_number' => $mobile,
'name' => 'نام اولیه',
]);
$uuid = ($created['data']['data'] ?? $created['data'])['uuid'];
$res = $this->authJson('PATCH', '/api/v1/secretary/' . $uuid, $owner, [
'name' => 'نام جدید',
'national_code' => '9999999999',
'address' => 'آدرس جدید',
'permissions' => [
'version' => 1,
'resources' => ['appointments' => ['create' => false]],
],
]);
$this->assertSame(200, $this->responseCode());
$data = $res['data']['data'] ?? $res['data'];
$this->assertSame('نام جدید', $data['user_name']);
$this->assertSame('9999999999', $data['national_code']);
$this->assertSame('آدرس جدید', $data['address']);
$this->assertFalse($data['permissions']['appointments']['create']);
}
public function testCreateRequiresDoctorUuidAndMobile(): void
{
[$owner] = $this->makeDoctor();
$this->authJson('POST', '/api/v1/secretary', $owner, ['name' => 'ناقص']);
$this->assertSame(422, $this->responseCode());
}
}