feat: unify doctor title handling and enhance specialty selection
- Implemented a helper function `displayDoctorName` to prepend "دکتر" to doctor names for consistent display across the application. - Updated various components (InviteDoctorModal, DashboardPage, DoctorDetailPage, DoctorsPage, etc.) to utilize the new helper for rendering doctor names. - Modified the DoctorFormPage to automatically add the "دکتر" title in the UI without requiring user input. - Fixed the EditSpecialtyPicker component to allow multiple specialty selections, resolving a UI bug where only one specialty could be selected at a time. - Ensured that the backend strips the "دکتر" title from the name during pre-registration and doctor creation processes. - Added tests for the new functionality, including checks for title handling and specialty selection logic. - Updated API documentation to reflect changes in name handling and display logic.
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tests\Auth;
|
||||
|
||||
use App\Auth\Entity\PreRegistration;
|
||||
use App\Tests\ApiTestCase;
|
||||
|
||||
/**
|
||||
* نام ثبتشده در پیشثبتنام هرگز نباید عنوان «دکتر» را در خود نگه دارد — وگرنه پس از
|
||||
* تأیید، پزشک/کلینیک/realName ساختهشده «دکتر دکتر …» نمایش داده میشوند. عنوان فقط در
|
||||
* لایهٔ نمایش افزوده میشود (displayDoctorName سمت فرانت).
|
||||
*/
|
||||
class PreRegistrationNameTitleTest extends ApiTestCase
|
||||
{
|
||||
private function freshMobile(): string
|
||||
{
|
||||
return '09' . str_pad((string) random_int(0, 999_999_999), 9, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
private function submit(string $name, string $mobile): array
|
||||
{
|
||||
$this->client->request(
|
||||
'POST',
|
||||
'/api/v1/pre-registration',
|
||||
server: ['CONTENT_TYPE' => 'application/json'],
|
||||
content: json_encode(['type' => 'independent_doctor', 'name' => $name, 'mobile' => $mobile]),
|
||||
);
|
||||
|
||||
return json_decode($this->client->getResponse()->getContent(), true) ?? [];
|
||||
}
|
||||
|
||||
private function storedName(string $mobile): ?string
|
||||
{
|
||||
$this->em->clear();
|
||||
$preReg = $this->em->getRepository(PreRegistration::class)->findOneBy(['mobile' => $mobile]);
|
||||
|
||||
return $preReg?->getName();
|
||||
}
|
||||
|
||||
public function testTitleIsStrippedOnSubmit(): void
|
||||
{
|
||||
$mobile = $this->freshMobile();
|
||||
$this->submit('دکتر حامد حسینی', $mobile);
|
||||
|
||||
self::assertSame(201, $this->responseCode());
|
||||
self::assertSame('حامد حسینی', $this->storedName($mobile));
|
||||
}
|
||||
|
||||
public function testPlainNameIsLeftAlone(): void
|
||||
{
|
||||
$mobile = $this->freshMobile();
|
||||
$this->submit('حامد حسینی', $mobile);
|
||||
|
||||
self::assertSame(201, $this->responseCode());
|
||||
self::assertSame('حامد حسینی', $this->storedName($mobile));
|
||||
}
|
||||
|
||||
public function testRepeatedTitlePrefixIsCollapsed(): void
|
||||
{
|
||||
$mobile = $this->freshMobile();
|
||||
$this->submit('دکتر دکتر حامد حسینی', $mobile);
|
||||
|
||||
self::assertSame(201, $this->responseCode());
|
||||
self::assertSame('حامد حسینی', $this->storedName($mobile));
|
||||
}
|
||||
}
|
||||
@@ -38,4 +38,16 @@ class PersianTextTest extends TestCase
|
||||
{
|
||||
$this->assertFalse(PersianText::sameName('علی اکبری', 'ولی اکبری'));
|
||||
}
|
||||
|
||||
public function testWithDoctorTitlePrependsExactlyOnce(): void
|
||||
{
|
||||
$this->assertSame('دکتر فرخنده حسینی', PersianText::withDoctorTitle('فرخنده حسینی'));
|
||||
// نامِ از پیش عنواندار «دکتر دکتر …» نمیشود
|
||||
$this->assertSame('دکتر فرخنده حسینی', PersianText::withDoctorTitle('دکتر فرخنده حسینی'));
|
||||
$this->assertSame('دکتر فرخنده حسینی', PersianText::withDoctorTitle('دکتر دکتر فرخنده حسینی'));
|
||||
// خالی/نال → رشتهٔ خالی (نه «دکتر» تنها)
|
||||
$this->assertSame('', PersianText::withDoctorTitle(''));
|
||||
$this->assertSame('', PersianText::withDoctorTitle(null));
|
||||
$this->assertSame('', PersianText::withDoctorTitle(' '));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user