feat(search): enhance user search functionality to support Persian digits and user IDs

This commit is contained in:
hamed
2026-08-04 09:53:31 +03:30
parent cf0ca23f82
commit 654c1e8303
4 changed files with 341 additions and 3 deletions
+76
View File
@@ -0,0 +1,76 @@
<?php
namespace App\Tests\Admin;
use App\Tests\ApiTestCase;
/**
* GET /api/v1/admin/users?search=… — the search box must accept a numeric user id
* on top of name / mobile / email.
*/
class AdminUsersSearchTest extends ApiTestCase
{
private function idsOf(array $body): array
{
return array_map(static fn(array $u) => $u['id'], $body['data']);
}
public function testSearchByUserIdReturnsThatUserOnly(): void
{
$target = $this->createUser(['ROLE_USER']);
$other = $this->createUser(['ROLE_USER']);
$admin = $this->createUser(['ROLE_ADMIN']);
$body = $this->authJson('GET', '/api/v1/admin/users?search=' . $target->getId(), $admin);
self::assertSame(200, $this->responseCode());
self::assertTrue($body['success']);
self::assertContains($target->getId(), $this->idsOf($body));
self::assertNotContains($other->getId(), $this->idsOf($body));
}
public function testSearchByPersianDigitsMatchesUserId(): void
{
$target = $this->createUser(['ROLE_USER']);
$admin = $this->createUser(['ROLE_ADMIN']);
$persianId = strtr((string) $target->getId(), [
'0' => '۰', '1' => '۱', '2' => '۲', '3' => '۳', '4' => '۴',
'5' => '۵', '6' => '۶', '7' => '۷', '8' => '۸', '9' => '۹',
]);
$body = $this->authJson('GET', '/api/v1/admin/users?search=' . urlencode($persianId), $admin);
self::assertSame(200, $this->responseCode());
self::assertContains($target->getId(), $this->idsOf($body));
}
public function testSearchByMobileStillWorks(): void
{
$target = $this->createUser(['ROLE_USER']);
$admin = $this->createUser(['ROLE_ADMIN']);
$body = $this->authJson('GET', '/api/v1/admin/users?search=' . $target->getMobileNumber(), $admin);
self::assertSame(200, $this->responseCode());
self::assertContains($target->getId(), $this->idsOf($body));
}
public function testSearchByUnknownIdReturnsEmptyList(): void
{
$admin = $this->createUser(['ROLE_ADMIN']);
$body = $this->authJson('GET', '/api/v1/admin/users?search=999999999', $admin);
self::assertSame(200, $this->responseCode());
self::assertSame([], $body['data']);
self::assertSame(0, $body['meta']['totalRecords']);
}
public function testNonAdminForbidden(): void
{
$user = $this->createUser(['ROLE_USER']);
$this->authJson('GET', '/api/v1/admin/users?search=1', $user);
self::assertSame(403, $this->responseCode());
}
}