create([ 'status' => 'active', ]); $tenant->makeCurrent(); $policies = Policy::factory() ->count(3) ->create([ 'tenant_id' => $tenant->id, 'policy_type' => 'deviceConfiguration', 'platform' => 'windows10AndLater', 'last_synced_at' => null, 'ignored_at' => null, ]); app()->instance(GraphClientInterface::class, new class implements GraphClientInterface { public function listPolicies(string $policyType, array $options = []): GraphResponse { return new GraphResponse(true, []); } public function getPolicy(string $policyType, string $policyId, array $options = []): GraphResponse { return new GraphResponse(true, [ 'payload' => [ 'id' => $policyId, 'displayName' => "Synced {$policyId}", 'platform' => $options['platform'] ?? null, 'example' => 'value', ], ]); } public function getOrganization(array $options = []): GraphResponse { return new GraphResponse(true, []); } public function applyPolicy(string $policyType, string $policyId, array $payload, array $options = []): GraphResponse { return new GraphResponse(true, []); } public function getServicePrincipalPermissions(array $options = []): GraphResponse { return new GraphResponse(true, []); } public function request(string $method, string $path, array $options = []): GraphResponse { return new GraphResponse(true, []); } }); /** @var OperationRunService $runs */ $runs = app(OperationRunService::class); $selectedIds = $policies ->pluck('id') ->map(static fn ($id): int => (int) $id) ->sort() ->values() ->all(); $opRun = $runs->ensureRun( tenant: $tenant, type: 'policy.sync', inputs: [ 'scope' => 'subset', 'policy_ids' => $selectedIds, ], initiator: null, ); SyncPoliciesJob::dispatchSync( tenantId: (int) $tenant->getKey(), types: null, policyIds: $selectedIds, operationRun: $opRun, ); $opRun->refresh(); expect($opRun->status)->toBe('completed'); expect($opRun->outcome)->toBe('succeeded'); expect($opRun->summary_counts)->toMatchArray([ 'total' => 3, 'processed' => 3, 'succeeded' => 3, 'failed' => 0, 'skipped' => 0, ]); $policies->each(function (Policy $policy) { $policy->refresh(); expect($policy->last_synced_at)->not->toBeNull(); expect($policy->display_name)->toBe("Synced {$policy->external_id}"); expect($policy->metadata)->toMatchArray([ 'example' => 'value', ]); }); });