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