create([ 'tenant_id' => (int) $tenant->getKey(), 'policy_type' => 'settingsCatalogPolicy', 'platform' => 'windows10', ]); /** @var VersionService $service */ $service = app(VersionService::class); $version1 = $service->captureVersion( policy: $policy, payload: [ 'wifi' => [ 'ssid' => 'Corp', 'password' => 'super-secret-1', ], 'settings' => [ 'example' => true, ], ], createdBy: $user->email, ); $version2 = $service->captureVersion( policy: $policy, payload: [ 'wifi' => [ 'ssid' => 'Corp', 'password' => 'super-secret-2', ], 'settings' => [ 'example' => true, ], ], createdBy: $user->email, ); $fresh1 = PolicyVersion::query()->findOrFail((int) $version1->getKey()); $fresh2 = PolicyVersion::query()->findOrFail((int) $version2->getKey()); expect($fresh1->snapshot['wifi']['password'])->toBe('[REDACTED]'); expect($fresh2->snapshot['wifi']['password'])->toBe('[REDACTED]'); expect($fresh1->snapshot['wifi']['ssid'])->toBe('Corp'); expect($fresh2->snapshot['wifi']['ssid'])->toBe('Corp'); $settingsNormalizer = app(SettingsNormalizer::class); $assignmentsNormalizer = app(AssignmentsNormalizer::class); $scopeTagsNormalizer = app(ScopeTagsNormalizer::class); $hasher = app(DriftHasher::class); $hash1 = $hasher->hashNormalized([ 'settings' => $settingsNormalizer->normalizeForDiff( snapshot: $fresh1->snapshot, policyType: (string) $fresh1->policy_type, platform: is_string($fresh1->platform) ? (string) $fresh1->platform : null, ), 'assignments' => $assignmentsNormalizer->normalizeForDiff($fresh1->assignments ?? []), 'scope_tag_ids' => $scopeTagsNormalizer->normalizeIds($fresh1->scope_tags ?? []), ]); $hash2 = $hasher->hashNormalized([ 'settings' => $settingsNormalizer->normalizeForDiff( snapshot: $fresh2->snapshot, policyType: (string) $fresh2->policy_type, platform: is_string($fresh2->platform) ? (string) $fresh2->platform : null, ), 'assignments' => $assignmentsNormalizer->normalizeForDiff($fresh2->assignments ?? []), 'scope_tag_ids' => $scopeTagsNormalizer->normalizeIds($fresh2->scope_tags ?? []), ]); expect($hash1)->toBe($hash2); });