active()->create([ 'workspace_id' => (int) $tenant->workspace_id, ]); $scopeKey = 'baseline_profile:'.$profile->getKey(); $run = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'baseline_compare', ]); $observedAt = CarbonImmutable::parse('2026-02-25T00:00:00Z'); CarbonImmutable::setTestNow($observedAt); $staleFinding = Finding::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'finding_type' => Finding::FINDING_TYPE_DRIFT, 'source' => 'baseline.compare', 'scope_key' => $scopeKey, 'fingerprint' => 'drift-stale', 'recurrence_key' => 'drift-stale', 'status' => Finding::STATUS_NEW, 'resolved_at' => null, 'resolved_reason' => null, ]); $seenFinding = Finding::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'finding_type' => Finding::FINDING_TYPE_DRIFT, 'source' => 'baseline.compare', 'scope_key' => $scopeKey, 'fingerprint' => 'drift-seen', 'recurrence_key' => 'drift-seen', 'status' => Finding::STATUS_NEW, ]); $resolvedCount = app(BaselineAutoCloseService::class)->resolveStaleFindings( tenant: $tenant, baselineProfileId: (int) $profile->getKey(), seenFingerprints: ['drift-seen'], currentOperationRunId: (int) $run->getKey(), ); expect($resolvedCount)->toBe(1); $staleFinding->refresh(); $seenFinding->refresh(); expect($staleFinding->status)->toBe(Finding::STATUS_RESOLVED) ->and($staleFinding->resolved_reason)->toBe('no_longer_drifting') ->and($staleFinding->resolved_at?->toIso8601String())->toBe($observedAt->toIso8601String()) ->and((int) $staleFinding->current_operation_run_id)->toBe((int) $run->getKey()); expect($seenFinding->status)->toBe(Finding::STATUS_NEW); }); it('auto-resolves stale intune role definition drift findings with the shared baseline auto-close flow', function (): void { [, $tenant] = createUserWithTenant(role: 'manager'); $profile = BaselineProfile::factory()->active()->create([ 'workspace_id' => (int) $tenant->workspace_id, ]); $scopeKey = 'baseline_profile:'.$profile->getKey(); $run = OperationRun::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'workspace_id' => (int) $tenant->workspace_id, 'type' => 'baseline_compare', ]); $observedAt = CarbonImmutable::parse('2026-02-26T00:00:00Z'); CarbonImmutable::setTestNow($observedAt); $staleFinding = Finding::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'finding_type' => Finding::FINDING_TYPE_DRIFT, 'source' => 'baseline.compare', 'scope_key' => $scopeKey, 'fingerprint' => 'rbac-stale', 'recurrence_key' => 'rbac-stale', 'status' => Finding::STATUS_NEW, 'severity' => Finding::SEVERITY_HIGH, 'subject_type' => 'policy', 'subject_external_id' => 'rbac-role-stale', 'evidence_jsonb' => [ 'change_type' => 'missing_policy', 'policy_type' => 'intuneRoleDefinition', 'subject_key' => 'rbac-role-stale', 'summary' => [ 'kind' => 'rbac_role_definition', ], ], ]); $resolvedCount = app(BaselineAutoCloseService::class)->resolveStaleFindings( tenant: $tenant, baselineProfileId: (int) $profile->getKey(), seenFingerprints: [], currentOperationRunId: (int) $run->getKey(), ); expect($resolvedCount)->toBe(1); $staleFinding->refresh(); expect($staleFinding->status)->toBe(Finding::STATUS_RESOLVED) ->and($staleFinding->resolved_reason)->toBe('no_longer_drifting') ->and($staleFinding->resolved_at?->toIso8601String())->toBe($observedAt->toIso8601String()); });