feat: complete reservation lifecycle
This commit is contained in:
53
tests/Feature/ReservationExpirationTest.php
Normal file
53
tests/Feature/ReservationExpirationTest.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
use App\Domain\Inventory\Models\SnipeAsset;
|
||||
use App\Domain\Reservations\Enums\ReservationItemStatus;
|
||||
use App\Domain\Reservations\Enums\ReservationStatus;
|
||||
use App\Domain\Reservations\Models\Reservation;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
uses(RefreshDatabase::class);
|
||||
|
||||
it('expira apenas pré-reservas cujo prazo terminou e liberta os equipamentos', function () {
|
||||
$user = User::factory()->create();
|
||||
$due = Reservation::create([
|
||||
'reference' => 'REQ-EXPIRE-001',
|
||||
'requester_id' => $user->id,
|
||||
'purpose' => 'Pedido sem decisão dentro do prazo previsto.',
|
||||
'usage_location' => 'Auditório',
|
||||
'starts_at' => now()->addDays(2),
|
||||
'ends_at' => now()->addDays(2)->addHours(2),
|
||||
'status' => ReservationStatus::PendingApproval,
|
||||
'approval_deadline' => now()->subMinute(),
|
||||
]);
|
||||
$dueItem = $due->items()->create([
|
||||
'snipe_asset_id' => SnipeAsset::factory()->create()->id,
|
||||
'starts_at' => $due->starts_at,
|
||||
'ends_at' => $due->ends_at,
|
||||
'status' => ReservationItemStatus::Held,
|
||||
]);
|
||||
$future = Reservation::create([
|
||||
'reference' => 'REQ-EXPIRE-002',
|
||||
'requester_id' => $user->id,
|
||||
'purpose' => 'Pedido ainda dentro do prazo de decisão definido.',
|
||||
'usage_location' => 'Estúdio',
|
||||
'starts_at' => now()->addDays(4),
|
||||
'ends_at' => now()->addDays(4)->addHour(),
|
||||
'status' => ReservationStatus::AwaitingInformation,
|
||||
'approval_deadline' => now()->addHour(),
|
||||
]);
|
||||
|
||||
$this->artisan('reservations:expire')
|
||||
->expectsOutput('1 pré-reserva(s) expirada(s).')
|
||||
->assertSuccessful();
|
||||
|
||||
expect($due->fresh()->status)->toBe(ReservationStatus::Expired)
|
||||
->and($dueItem->fresh()->status)->toBe(ReservationItemStatus::Cancelled)
|
||||
->and($future->fresh()->status)->toBe(ReservationStatus::AwaitingInformation);
|
||||
$this->assertDatabaseHas('audit_logs', [
|
||||
'event' => 'reservation.expired',
|
||||
'actor_id' => null,
|
||||
'auditable_id' => $due->id,
|
||||
]);
|
||||
});
|
||||
Reference in New Issue
Block a user