for($tenant)->create([ 'selection_hash' => $scopeKey, 'selection_payload' => ['policy_types' => ['settingsCatalogPolicy']], 'status' => InventorySyncRun::STATUS_SUCCESS, 'finished_at' => now()->subDays(2), ]); $current = InventorySyncRun::factory()->for($tenant)->create([ 'selection_hash' => $scopeKey, 'selection_payload' => ['policy_types' => ['settingsCatalogPolicy']], 'status' => InventorySyncRun::STATUS_SUCCESS, 'finished_at' => now()->subDay(), ]); $policy = Policy::factory()->for($tenant)->create([ 'policy_type' => 'settingsCatalogPolicy', ]); $baselineAssignments = [ ['target' => ['@odata.type' => '#microsoft.graph.groupAssignmentTarget', 'groupId' => 'group-a']], ['target' => ['@odata.type' => '#microsoft.graph.groupAssignmentTarget', 'groupId' => 'group-b']], ]; $currentAssignments = [ ['target' => ['@odata.type' => '#microsoft.graph.groupAssignmentTarget', 'groupId' => 'group-c']], ]; PolicyVersion::factory()->for($tenant)->for($policy)->create([ 'version_number' => 1, 'policy_type' => $policy->policy_type, 'captured_at' => $baseline->finished_at->copy()->subMinute(), 'assignments' => $baselineAssignments, ]); PolicyVersion::factory()->for($tenant)->for($policy)->create([ 'version_number' => 2, 'policy_type' => $policy->policy_type, 'captured_at' => $current->finished_at->copy()->subMinute(), 'assignments' => $currentAssignments, ]); $generator = app(DriftFindingGenerator::class); $created1 = $generator->generate($tenant, $baseline, $current, $scopeKey); $fingerprints1 = Finding::query() ->where('tenant_id', $tenant->getKey()) ->pluck('fingerprint') ->sort() ->values() ->all(); $created2 = $generator->generate($tenant, $baseline, $current, $scopeKey); $fingerprints2 = Finding::query() ->where('tenant_id', $tenant->getKey()) ->pluck('fingerprint') ->sort() ->values() ->all(); expect($created1)->toBeGreaterThan(0); expect($created2)->toBe(0); expect($fingerprints2)->toBe($fingerprints1); });