Files
reservas/tests/Feature/ReservationExpirationTest.php

54 lines
2.0 KiB
PHP

<?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,
]);
});