create(['status' => BookingStatus::PendingPayment]); $cancelled = (new CancelBookingAction)->handle($booking); expect($cancelled->status)->toBe(BookingStatus::Cancelled) ->and($booking->refresh()->status)->toBe(BookingStatus::Cancelled); }); test('it guards against cancelling a confirmed booking', function () { $booking = Booking::factory()->create(['status' => BookingStatus::Confirmed]); expect(fn () => (new CancelBookingAction)->handle($booking)) ->toThrow(BookingCannotBeCancelledException::class); expect($booking->refresh()->status)->toBe(BookingStatus::Confirmed); }); test('it guards against cancelling an already cancelled booking', function () { $booking = Booking::factory()->create(['status' => BookingStatus::Cancelled]); expect(fn () => (new CancelBookingAction)->handle($booking)) ->toThrow(BookingCannotBeCancelledException::class); }); test('it guards against cancelling an expired booking', function () { $booking = Booking::factory()->create(['status' => BookingStatus::Expired]); expect(fn () => (new CancelBookingAction)->handle($booking)) ->toThrow(BookingCannotBeCancelledException::class); });