54 lines
2.0 KiB
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,
|
|
]);
|
|
});
|