825320a117
It was ShouldQueue, so on QUEUE_CONNECTION=database with no worker running (or just queue lag), a booking stayed Confirmed in the UI until a worker processed the job — refund actions in Filament looked like they hadn't taken effect without a page reload. A refund is always initiated from a request already waiting on it (the Filament action or the API endpoint), so there's no reason to defer the status flip.
41 lines
2.0 KiB
PHP
41 lines
2.0 KiB
PHP
<?php
|
|
|
|
use Modules\Booking\Enums\BookingStatus;
|
|
use Modules\Booking\Models\Booking;
|
|
use Modules\Payment\Enums\PaymentMethod;
|
|
use Modules\Payment\Enums\RefundStatus;
|
|
use Modules\Payment\Events\RefundProcessed;
|
|
use Modules\Payment\Listeners\MarkBookingRefunded;
|
|
use Modules\Payment\Models\Payment;
|
|
use Modules\Payment\Models\Refund;
|
|
|
|
test('flips a confirmed booking to cancelled', function () {
|
|
$booking = Booking::factory()->create(['status' => BookingStatus::Confirmed]);
|
|
$payment = Payment::factory()->completed()->create(['booking_id' => $booking->id, 'gateway' => PaymentMethod::KbzMiniApp]);
|
|
$refund = Refund::factory()->create(['payment_id' => $payment->id, 'status' => RefundStatus::Completed]);
|
|
|
|
(new MarkBookingRefunded)->handle(new RefundProcessed($refund));
|
|
|
|
expect($booking->refresh()->status)->toBe(BookingStatus::Cancelled);
|
|
});
|
|
|
|
test('does not touch a booking that already moved on for another reason', function () {
|
|
$booking = Booking::factory()->create(['status' => BookingStatus::Cancelled]);
|
|
$payment = Payment::factory()->completed()->create(['booking_id' => $booking->id, 'gateway' => PaymentMethod::KbzMiniApp]);
|
|
$refund = Refund::factory()->create(['payment_id' => $payment->id, 'status' => RefundStatus::Completed]);
|
|
|
|
(new MarkBookingRefunded)->handle(new RefundProcessed($refund));
|
|
|
|
expect($booking->refresh()->status)->toBe(BookingStatus::Cancelled);
|
|
});
|
|
|
|
test('does not crash if the booking was soft-deleted before this listener ran', function () {
|
|
$booking = Booking::factory()->create(['status' => BookingStatus::Confirmed]);
|
|
$payment = Payment::factory()->completed()->create(['booking_id' => $booking->id, 'gateway' => PaymentMethod::KbzMiniApp]);
|
|
$refund = Refund::factory()->create(['payment_id' => $payment->id, 'status' => RefundStatus::Completed]);
|
|
$booking->delete();
|
|
|
|
expect(fn () => (new MarkBookingRefunded)->handle(new RefundProcessed($refund->fresh())))
|
|
->not->toThrow(Throwable::class);
|
|
});
|