diff --git a/app/tests/Feature/Supplier/CsvReconcileJobTest.php b/app/tests/Feature/Supplier/CsvReconcileJobTest.php index 4b07d775..d5c3c964 100644 --- a/app/tests/Feature/Supplier/CsvReconcileJobTest.php +++ b/app/tests/Feature/Supplier/CsvReconcileJobTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); use App\Exceptions\Supplier\SupplierTransientException; use App\Jobs\RouteSupplierLeadJob; use App\Jobs\Supplier\CsvReconcileJob; +use App\Jobs\Supplier\RefreshSupplierSessionJob; use App\Mail\CsvDriftAlertMail; use App\Models\SupplierLead; use App\Models\SupplierProject; @@ -47,7 +48,18 @@ function putSupplierSession(): void beforeEach(function () { Mail::fake(); - Bus::fake(); + // Partial fake: only RouteSupplierLeadJob is intercepted (what we assert on). + // RefreshSupplierSessionJob must NOT be faked — it must run our mock below + // so that loadSession() can recover if a concurrent afterEach wipes the session. + Bus::fake([RouteSupplierLeadJob::class]); + // Bind a mock that re-puts the session when dispatch_sync triggers it during a race. + app()->bind(RefreshSupplierSessionJob::class, fn () => new class + { + public function handle(): void + { + putSupplierSession(); + } + }); // NB: NOT Cache::store('redis')->flush() — flush wipes session keys belonging to // OTHER parallel tests (cross-pollution). Just forget our reserved keys + re-put. Cache::store('redis')->forget('supplier:csv_reconcile');