Skip to content

Commit 41c6495

Browse files
authored
upkeep: Atualiza regex para suportar IDs prefixados e ajusta testes de sanitização (#34)
1 parent 29c0d39 commit 41c6495

File tree

2 files changed

+36
-99
lines changed

2 files changed

+36
-99
lines changed

src/Support/Uri.php

Lines changed: 1 addition & 1 deletion
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-
'/\/(?<=\/)([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}|[A-Z]{3}-\d+(?:_\d{3})?|[A-Za-z0-9-_]+)(?=\/|$)/i',
30+
'/\/([A-Z]{3,}(?:-[A-Z]{3,})*)-([A-Z0-9]{3}-\d+(?:_\d{3})?|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[A-Za-z0-9]{8,})(?=\/|$)/i',
3131
],
3232
),
3333
array_merge(

tests/Cases/UriTest.php

Lines changed: 35 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -162,117 +162,54 @@ 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 testClearUriPrefixedUuid(): void
165+
public function testClearUriPrefixedId(): void
166166
{
167-
// Gera prefixos completamente aleatórios
168-
$generateRandomPrefix = function(): string {
169-
$wordCount = rand(1, 3); // 1 a 3 palavras no prefixo
170-
$words = [];
171-
172-
for ($i = 0; $i < $wordCount; $i++) {
173-
$wordLength = rand(3, 8); // palavras de 3 a 8 caracteres
174-
$word = '';
175-
for ($j = 0; $j < $wordLength; $j++) {
176-
$word .= chr(rand(65, 90)); // A-Z (65-90 na tabela ASCII)
177-
}
178-
$words[] = $word;
179-
}
180-
181-
return implode('-', $words);
182-
};
183-
184-
// Gera IDs do tipo ECOSYSTEM
185-
$generateEcosystemId = function(): string {
186-
$prefixes = ['ECOSYSTEM', 'PLATFORM', 'SERVICE', 'MODULE'];
187-
$codes = ['EPF', 'ABC', 'XYZ', 'DEF', 'GHI', 'ESF'];
188-
189-
$prefix = $prefixes[array_rand($prefixes)];
190-
$code = $codes[array_rand($codes)];
191-
$number = (string)rand(100000000, 9999999999); // 9-10 dígitos
192-
193-
// 50% de chance de ter sequência final
194-
if (rand(0, 1)) {
195-
$sequence = str_pad((string)rand(1, 999), 3, '0', STR_PAD_LEFT);
196-
return "{$prefix}-{$code}-{$number}_{$sequence}";
197-
}
198-
199-
return "{$prefix}-{$code}-{$number}";
200-
};
201-
202-
$randomPrefix = $generateRandomPrefix();
203-
204-
// Gera UUIDs aleatórios (incluindo caracteres não-hexadecimais para testar a regex)
205-
$uuidChars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
206-
$randomUuid = sprintf(
207-
'%s-%s-%s-%s-%s',
208-
substr(str_shuffle($uuidChars), 0, 8),
209-
substr(str_shuffle($uuidChars), 0, 4),
210-
substr(str_shuffle($uuidChars), 0, 4),
211-
substr(str_shuffle($uuidChars), 0, 4),
212-
substr(str_shuffle($uuidChars), 0, 12)
213-
);
214-
215-
$prefixedUuid = "{$randomPrefix}-{$randomUuid}";
216-
217-
// Casos de teste estático para garantir consistência
218-
$billUuid = 'BILL-123e4567-e89b-12d3-a456-426614174000';
219-
$userUuid = 'USER-abc1234d-e56f-78g9-h012-345678901234';
220-
$companyUuid = 'COMPANY-ADMIN-456e7890-f12a-34b5-c678-901234567890';
221-
222-
// IDs do tipo ECOSYSTEM (estáticos e aleatórios)
223-
$ecosystemId = 'ECOSYSTEM-EPF-0100290422_001';
224-
$ecosystemId2 = 'PLATFORM-ABC-1234567890_999';
225-
$randomEcosystemId = $generateEcosystemId();
226-
$randomEcosystemId2 = $generateEcosystemId();
227-
228-
// Gera mais alguns prefixos aleatórios para testes variados
229-
$randomPrefix2 = $generateRandomPrefix();
230-
$randomUuid2 = sprintf(
231-
'%s-%s-%s-%s-%s',
232-
substr(str_shuffle($uuidChars), 0, 8),
233-
substr(str_shuffle($uuidChars), 0, 4),
234-
substr(str_shuffle($uuidChars), 0, 4),
235-
substr(str_shuffle($uuidChars), 0, 4),
236-
substr(str_shuffle($uuidChars), 0, 12)
237-
);
238-
$prefixedUuid2 = "{$randomPrefix2}-{$randomUuid2}";
167+
// Casos de teste específicos solicitados
168+
$ecosystemId1 = 'ECOSYSTEM-PPF-0100206721_003';
169+
$ecosystemId2 = 'ECOSYSTEM-EPF-0100308183_001';
170+
$ecosystemId3 = 'ECOSYSTEM-ESF-105454545';
171+
$billUuid = 'BILL-1811cd92-ed15-4b8a-a571-6cfa44002703';
239172

240173
// Testes básicos
241174
self::assertSame('/v1/test', Uri::sanitize('/v1/test'));
242175

243-
// Testes com UUIDs prefixados randômicos
244-
self::assertSame('/v2/test/<PREFIXED-ID>', Uri::sanitize("/v2/test/{$prefixedUuid}"));
245-
self::assertSame('/v3/test/<PREFIXED-ID>/bar', Uri::sanitize("/v3/test/{$prefixedUuid}/bar"));
246-
self::assertSame('/v4/test/<PREFIXED-ID>/bar/<PREFIXED-ID>/', Uri::sanitize("/v4/test/{$prefixedUuid}/bar/{$prefixedUuid}/"));
176+
// Testes com ECOSYSTEM-PPF-0100206721_003
177+
self::assertSame('/v2/test/<PREFIXED-ID>', Uri::sanitize("/v2/test/{$ecosystemId1}"));
178+
self::assertSame('/v3/test/<PREFIXED-ID>/bar', Uri::sanitize("/v3/test/{$ecosystemId1}/bar"));
179+
self::assertSame('/v4/test/<PREFIXED-ID>/bar/<PREFIXED-ID>/', Uri::sanitize("/v4/test/{$ecosystemId1}/bar/{$ecosystemId1}/"));
247180

248-
// Testes com UUIDs prefixados estáticos
249-
self::assertSame('/v2/test/<PREFIXED-ID>', Uri::sanitize("/v2/test/{$billUuid}"));
250-
self::assertSame('/v3/test/<PREFIXED-ID>/bar', Uri::sanitize("/v3/test/{$billUuid}/bar"));
251-
self::assertSame('/v4/test/<PREFIXED-ID>/bar/<PREFIXED-ID>/', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/"));
181+
// Testes com ECOSYSTEM-EPF-0100308183_001
182+
self::assertSame('/v5/test/<PREFIXED-ID>', Uri::sanitize("/v5/test/{$ecosystemId2}"));
183+
self::assertSame('/v6/test/<PREFIXED-ID>/details', Uri::sanitize("/v6/test/{$ecosystemId2}/details"));
184+
self::assertSame('/v7/test/<PREFIXED-ID>/<PREFIXED-ID>', Uri::sanitize("/v7/test/{$ecosystemId2}/{$ecosystemId1}"));
252185

253-
// Testes com IDs ECOSYSTEM estáticos
254-
self::assertSame('/v5/test/<PREFIXED-ID>', Uri::sanitize("/v5/test/{$ecosystemId}"));
255-
self::assertSame('/v6/test/<PREFIXED-ID>/details', Uri::sanitize("/v6/test/{$ecosystemId}/details"));
256-
self::assertSame('/v7/test/<PREFIXED-ID>/<PREFIXED-ID>', Uri::sanitize("/v7/test/{$ecosystemId}/{$ecosystemId2}"));
186+
// Testes com ECOSYSTEM-ESF-105454545
187+
self::assertSame('/v8/test/<PREFIXED-ID>', Uri::sanitize("/v8/test/{$ecosystemId3}"));
188+
self::assertSame('/v9/test/<PREFIXED-ID>/config', Uri::sanitize("/v9/test/{$ecosystemId3}/config"));
257189

258-
// Testes com IDs ECOSYSTEM aleatórios
259-
self::assertSame('/v8/test/<PREFIXED-ID>', Uri::sanitize("/v8/test/{$randomEcosystemId}"));
260-
self::assertSame('/v9/test/<PREFIXED-ID>/config', Uri::sanitize("/v9/test/{$randomEcosystemId}/config"));
261-
self::assertSame('/v10/test/<PREFIXED-ID>/<PREFIXED-ID>', Uri::sanitize("/v10/test/{$randomEcosystemId}/{$randomEcosystemId2}"));
190+
// Testes com BILL-1811cd92-ed15-4b8a-a571-6cfa44002703
191+
self::assertSame('/v10/test/<PREFIXED-ID>', Uri::sanitize("/v10/test/{$billUuid}"));
192+
self::assertSame('/v11/test/<PREFIXED-ID>/profile', Uri::sanitize("/v11/test/{$billUuid}/profile"));
193+
self::assertSame('/v12/test/<PREFIXED-ID>/bar/<PREFIXED-ID>/', Uri::sanitize("/v12/test/{$billUuid}/bar/{$billUuid}/"));
262194

263-
// Testes mistos: UUIDs prefixados + IDs ECOSYSTEM
264-
self::assertSame('/v11/test/<PREFIXED-ID>/<PREFIXED-ID>', Uri::sanitize("/v11/test/{$prefixedUuid}/{$ecosystemId}"));
265-
self::assertSame('/v12/test/<PREFIXED-ID>/<PREFIXED-ID>/<PREFIXED-ID>', Uri::sanitize("/v12/test/{$billUuid}/{$randomEcosystemId}/{$userUuid}"));
266-
self::assertSame('/v13/test/<PREFIXED-ID>/<PREFIXED-ID>/<PREFIXED-ID>/', Uri::sanitize("/v13/test/{$ecosystemId}/{$prefixedUuid2}/{$randomEcosystemId2}/"));
195+
// Testes mistos entre os IDs
196+
self::assertSame('/v13/test/<PREFIXED-ID>/<PREFIXED-ID>', Uri::sanitize("/v13/test/{$billUuid}/{$ecosystemId3}"));
197+
self::assertSame('/v14/test/<PREFIXED-ID>/<PREFIXED-ID>/<PREFIXED-ID>', Uri::sanitize("/v14/test/{$ecosystemId1}/{$ecosystemId2}/{$billUuid}"));
198+
self::assertSame('/v15/test/<PREFIXED-ID>/<PREFIXED-ID>/<PREFIXED-ID>/', Uri::sanitize("/v15/test/{$ecosystemId3}/{$billUuid}/{$ecosystemId1}/"));
267199

268200
// Casos edge: diferentes contextos de API
269-
self::assertSame('/users/<PREFIXED-ID>/profile', Uri::sanitize("/users/{$prefixedUuid}/profile"));
201+
self::assertSame('/users/<PREFIXED-ID>/profile', Uri::sanitize("/users/{$billUuid}/profile"));
270202
self::assertSame('/api/v1/bills/<PREFIXED-ID>/details', Uri::sanitize("/api/v1/bills/{$billUuid}/details"));
271-
self::assertSame('/ecosystems/<PREFIXED-ID>/platform/<PREFIXED-ID>', Uri::sanitize("/ecosystems/{$randomEcosystemId}/platform/{$randomEcosystemId2}"));
272-
self::assertSame('/companies/<PREFIXED-ID>/admin/<PREFIXED-ID>/settings', Uri::sanitize("/companies/{$prefixedUuid2}/admin/{$ecosystemId}/settings"));
203+
self::assertSame('/ecosystems/<PREFIXED-ID>/platform/<PREFIXED-ID>', Uri::sanitize("/ecosystems/{$ecosystemId1}/platform/{$ecosystemId2}"));
204+
self::assertSame('/companies/<PREFIXED-ID>/admin/<PREFIXED-ID>/settings', Uri::sanitize("/companies/{$billUuid}/admin/{$ecosystemId3}/settings"));
205+
206+
// Casos críticos: evitar falsos positivos
207+
self::assertSame('/pic-pay/entry/id/<PREFIXED-ID>', Uri::sanitize("/pic-pay/entry/id/{$ecosystemId3}"));
208+
self::assertSame('/api-gateway/service/<PREFIXED-ID>', Uri::sanitize("/api-gateway/service/{$ecosystemId2}"));
209+
self::assertSame('/health-check/status/<PREFIXED-ID>', Uri::sanitize("/health-check/status/{$billUuid}"));
273210

274211
// Teste sem barra final
275-
self::assertSame('/test/<PREFIXED-ID>', Uri::sanitize("/test/{$prefixedUuid}"));
276-
self::assertSame('/ecosystem/<PREFIXED-ID>', Uri::sanitize("/ecosystem/{$randomEcosystemId}"));
212+
self::assertSame('/test/<PREFIXED-ID>', Uri::sanitize("/test/{$billUuid}"));
213+
self::assertSame('/ecosystem/<PREFIXED-ID>', Uri::sanitize("/ecosystem/{$ecosystemId1}"));
277214
}
278215
}

0 commit comments

Comments
 (0)