create(); $user = User::factory()->create(); $policies = Policy::factory()->count(3)->create(['tenant_id' => $tenant->id]); $policyIds = $policies->pluck('id')->toArray(); $service = app(BulkOperationService::class); $run = $service->createRun($tenant, $user, 'policy', 'delete', $policyIds, 3); $job = new BulkPolicyDeleteJob($run->id); $job->handle($service); $run->refresh(); expect($run->status)->toBe('completed') ->and($run->processed_items)->toBe(3) ->and($run->succeeded)->toBe(3) ->and($run->failed)->toBe(0); $policies->each(function ($policy) { expect($policy->refresh()->ignored_at)->not->toBeNull(); }); }); test('job handles partial failures gracefully', function () { $tenant = Tenant::factory()->create(); $user = User::factory()->create(); $policies = Policy::factory()->count(2)->create(['tenant_id' => $tenant->id]); $policyIds = $policies->pluck('id')->toArray(); // Add a non-existent ID $policyIds[] = 99999; $service = app(BulkOperationService::class); $run = $service->createRun($tenant, $user, 'policy', 'delete', $policyIds, 3); $job = new BulkPolicyDeleteJob($run->id); $job->handle($service); $run->refresh(); expect($run->status)->toBe('completed_with_errors') ->and($run->processed_items)->toBe(3) ->and($run->succeeded)->toBe(2) ->and($run->failed)->toBe(1); expect($run->failures[0]['item_id'])->toBe('99999') ->and($run->failures[0]['reason'])->toContain('not found'); });