Skip to content

Commit 41b6fce

Browse files
committed
Altera sanitização do UUID para permitir prefixos dinâmicos
1 parent 3f46874 commit 41b6fce

File tree

2 files changed

+55
-10
lines changed

2 files changed

+55
-10
lines changed

src/Support/Uri.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public static function sanitize(string $uri, array $uriMask = []): string
2727
'/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i',
2828
'/\/(?<=\/)\d+(?=\/)?/',
2929
'/\/(?<=\/)R[RN]\d{16}[A-Za-z0-9]{11}/',
30-
'/\/(?<=\/)BILL-([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i',
30+
'/\/(?<=\/)([A-Z]+(?:-[A-Z]+)*)-([0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12})(?=\/|$)/i',
3131
],
3232
),
3333
array_merge(
@@ -40,7 +40,7 @@ public static function sanitize(string $uri, array $uriMask = []): string
4040
'/<OID>',
4141
'/<NUMBER>',
4242
'/<EXTERNAL-ID>',
43-
'/<BILL-UUID>',
43+
'/<PREFIXED-UUID>',
4444
],
4545
),
4646
'/' . ltrim($uri, '/'),

tests/Cases/UriTest.php

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,17 +162,62 @@ public function testClearUriExternalIds(): void
162162
self::assertSame('/v9/test/<EXTERNAL-ID>/bar/<NUMBER>', Uri::sanitize('/v9/test/RR2101818220123720H9KJTERfw1a/bar/12345'));
163163
}
164164

165-
public function testClearUriBillUuid(): void
165+
public function testClearUriPrefixedUuid(): void
166166
{
167+
// Gera prefixos aleatórios para tornar o teste mais robusto
168+
$prefixes = ['BILL', 'USER', 'ADMIN', 'CLIENT', 'ORDER', 'PAYMENT', 'COMPANY-ADMIN', 'SUB-TENANT', 'API-KEY'];
169+
$randomPrefix = $prefixes[array_rand($prefixes)];
170+
171+
// Gera UUIDs aleatórios (incluindo caracteres não-hexadecimais para testar a regex)
172+
$uuidChars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
173+
$randomUuid = sprintf(
174+
'%s-%s-%s-%s-%s',
175+
substr(str_shuffle($uuidChars), 0, 8),
176+
substr(str_shuffle($uuidChars), 0, 4),
177+
substr(str_shuffle($uuidChars), 0, 4),
178+
substr(str_shuffle($uuidChars), 0, 4),
179+
substr(str_shuffle($uuidChars), 0, 12)
180+
);
181+
182+
$prefixedUuid = "{$randomPrefix}-{$randomUuid}";
183+
184+
// Casos de teste estático para garantir consistência
167185
$billUuid = 'BILL-123e4567-e89b-12d3-a456-426614174000';
186+
$userUuid = 'USER-abc1234d-e56f-78g9-h012-345678901234';
187+
$companyUuid = 'COMPANY-ADMIN-456e7890-f12a-34b5-c678-901234567890';
168188

189+
// Testes básicos
169190
self::assertSame('/v1/test', Uri::sanitize('/v1/test'));
170-
self::assertSame('/v2/test/<BILL-UUID>', Uri::sanitize("/v2/test/{$billUuid}"));
171-
self::assertSame('/v3/test/<BILL-UUID>/bar', Uri::sanitize("/v3/test/{$billUuid}/bar"));
172-
self::assertSame('/v4/test/<BILL-UUID>/bar/<BILL-UUID>/', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/"));
173-
self::assertSame('/v5/test/<BILL-UUID>/<BILL-UUID>', Uri::sanitize("/v5/test/{$billUuid}/{$billUuid}"));
174-
self::assertSame('/v6/test/<BILL-UUID>/<BILL-UUID>/', Uri::sanitize("/v6/test/{$billUuid}/{$billUuid}/"));
175-
self::assertSame('/v7/test/<BILL-UUID>/<BILL-UUID>/<BILL-UUID>', Uri::sanitize("/v7/test/{$billUuid}/{$billUuid}/{$billUuid}"));
176-
self::assertSame('/v8/test/<BILL-UUID>/<BILL-UUID>/<BILL-UUID>/', Uri::sanitize("/v8/test/{$billUuid}/{$billUuid}/{$billUuid}/"));
191+
192+
// Testes com prefixo randômico
193+
self::assertSame('/v2/test/<PREFIXED-UUID>', Uri::sanitize("/v2/test/{$prefixedUuid}"));
194+
self::assertSame('/v3/test/<PREFIXED-UUID>/bar', Uri::sanitize("/v3/test/{$prefixedUuid}/bar"));
195+
self::assertSame('/v4/test/<PREFIXED-UUID>/bar/<PREFIXED-UUID>/', Uri::sanitize("/v4/test/{$prefixedUuid}/bar/{$prefixedUuid}/"));
196+
197+
// Testes com casos estáticos conhecidos
198+
self::assertSame('/v2/test/<PREFIXED-UUID>', Uri::sanitize("/v2/test/{$billUuid}"));
199+
self::assertSame('/v3/test/<PREFIXED-UUID>/bar', Uri::sanitize("/v3/test/{$billUuid}/bar"));
200+
self::assertSame('/v4/test/<PREFIXED-UUID>/bar/<PREFIXED-UUID>/', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/"));
201+
202+
// Testes com UUID não-hexadecimal
203+
self::assertSame('/v2/test/<PREFIXED-UUID>', Uri::sanitize("/v2/test/{$userUuid}"));
204+
self::assertSame('/v3/test/<PREFIXED-UUID>/bar', Uri::sanitize("/v3/test/{$userUuid}/bar"));
205+
206+
// Testes com prefixo composto
207+
self::assertSame('/v2/test/<PREFIXED-UUID>', Uri::sanitize("/v2/test/{$companyUuid}"));
208+
self::assertSame('/v3/test/<PREFIXED-UUID>/bar', Uri::sanitize("/v3/test/{$companyUuid}/bar"));
209+
210+
// Testes com múltiplos UUIDs (randômico + estático)
211+
self::assertSame('/v5/test/<PREFIXED-UUID>/<PREFIXED-UUID>', Uri::sanitize("/v5/test/{$prefixedUuid}/{$billUuid}"));
212+
self::assertSame('/v6/test/<PREFIXED-UUID>/<PREFIXED-UUID>/', Uri::sanitize("/v6/test/{$billUuid}/{$prefixedUuid}/"));
213+
self::assertSame('/v7/test/<PREFIXED-UUID>/<PREFIXED-UUID>/<PREFIXED-UUID>', Uri::sanitize("/v7/test/{$prefixedUuid}/{$billUuid}/{$userUuid}"));
214+
self::assertSame('/v8/test/<PREFIXED-UUID>/<PREFIXED-UUID>/<PREFIXED-UUID>/', Uri::sanitize("/v8/test/{$billUuid}/{$userUuid}/{$prefixedUuid}/"));
215+
216+
// Casos edge: diferentes contextos de API
217+
self::assertSame('/users/<PREFIXED-UUID>/profile', Uri::sanitize("/users/{$prefixedUuid}/profile"));
218+
self::assertSame('/api/v1/bills/<PREFIXED-UUID>/details', Uri::sanitize("/api/v1/bills/{$billUuid}/details"));
219+
220+
// Teste sem barra final
221+
self::assertSame('/test/<PREFIXED-UUID>', Uri::sanitize("/test/{$prefixedUuid}"));
177222
}
178223
}

0 commit comments

Comments
 (0)