feat(scanner): refactor ticket scanning endpoint to accept UUID in request body and add validation

This commit is contained in:
2026-09-07 16:18:16 -03:00
parent e9521e65d0
commit b607c1b673
7 changed files with 74 additions and 15 deletions

View File

@@ -203,7 +203,7 @@ class ScannerTicketControllerTest extends TestCase
$ticket = $this->createTicket('77777777-7777-4777-8777-777777777777');
Sanctum::actingAs($this->scanner);
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket])
->assertOk()
->assertJsonPath('data.ticket', $ticket->ticket)
->assertJsonPath('data.scanner_user_id', $this->scanner->id)
@@ -217,11 +217,26 @@ class ScannerTicketControllerTest extends TestCase
$this->assertNotNull($ticket->fresh()->used_at);
}
public function test_scan_requires_a_uuid_in_the_data_field(): void
{
Sanctum::actingAs($this->scanner);
$this->postJson('/api/v1/scanner/tickets/scan')
->assertUnprocessable()
->assertJsonPath('message', 'El QR proporcionado es inválido.')
->assertJsonPath('errors.data.0', 'El QR proporcionado es inválido.');
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => 'not-a-uuid'])
->assertUnprocessable()
->assertJsonPath('message', 'El QR proporcionado es inválido.')
->assertJsonPath('errors.data.0', 'El QR proporcionado es inválido.');
}
public function test_ticket_cannot_be_scanned_twice(): void
{
$ticket = $this->createTicket('88888888-8888-4888-8888-888888888888');
Sanctum::actingAs($this->scanner);
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")->assertOk();
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket])->assertOk();
$otherScanner = User::factory()->create([
'rol_codigo' => RoleCode::Scanner->value,
@@ -230,7 +245,7 @@ class ScannerTicketControllerTest extends TestCase
$otherScanner->scanCategories()->attach($this->category);
Sanctum::actingAs($otherScanner);
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket])
->assertUnprocessable()
->assertJsonValidationErrors('ticket');
$this->assertSame($this->scanner->id, $ticket->fresh()->scanner_user_id);
@@ -249,7 +264,7 @@ class ScannerTicketControllerTest extends TestCase
);
Sanctum::actingAs($this->scanner);
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket])
->assertUnprocessable()
->assertJsonValidationErrors('ticket');
$this->assertNull($ticket->fresh()->used_at);
@@ -274,7 +289,7 @@ class ScannerTicketControllerTest extends TestCase
->assertOk()
->assertJsonPath('data.id', $ticket->id);
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket])
->assertOk()
->assertJsonPath('data.scanner_user_id', $this->scanner->id);
}
@@ -297,7 +312,7 @@ class ScannerTicketControllerTest extends TestCase
$this->getJson("/api/v1/scanner/tickets/{$foreignTicket->ticket}")
->assertNotFound();
$this->postJson("/api/v1/scanner/tickets/{$foreignTicket->ticket}/scan")
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => $foreignTicket->ticket])
->assertNotFound();
}
@@ -313,7 +328,7 @@ class ScannerTicketControllerTest extends TestCase
$this->getJson('/api/v1/scanner/tickets')->assertForbidden();
$this->getJson("/api/v1/scanner/tickets/{$ticket->ticket}")->assertForbidden();
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")->assertForbidden();
$this->postJson('/api/v1/scanner/tickets/scan', ['data' => $ticket->ticket])->assertForbidden();
$this->assertNull($ticket->fresh()->used_at);
}