create(); $coupon = Coupon::factory()->create(); StartSmsCampaignJob::dispatch( adminId: $admin->id, message: 'Hello', sendToAll: false, selectedIds: [$coupon->id], excludedIds: [], ); Queue::assertPushed(StartSmsCampaignJob::class, function (StartSmsCampaignJob $job) use ($admin, $coupon): bool { return $job->adminId === $admin->id && $job->message === 'Hello' && $job->sendToAll === false && $job->selectedIds === [$coupon->id] && $job->excludedIds === []; }); } public function test_handle_starts_campaign_and_chains_send_jobs(): void { Bus::fake(); $admin = User::factory()->create(); $coupons = Coupon::factory()->count(2)->create(); $job = new StartSmsCampaignJob( adminId: $admin->id, message: 'Test broadcast', sendToAll: false, selectedIds: $coupons->pluck('id')->all(), ); $job->handle(app(SmsBroadcastService::class)); Bus::assertChained([ SendSmsToCouponJob::class, SendSmsToCouponJob::class, ]); } }