set('graph_contracts.types.settingsCatalogPolicy', [ 'resource' => 'deviceManagement/configurationPolicies', 'allowed_select' => ['id'], 'allowed_expand' => [], 'type_family' => ['#microsoft.graph.deviceManagementConfigurationPolicy'], ]); $this->registry = app(GraphContractRegistry::class); }); it('preserves @odata.type in settingInstance and strips ids', function () { $settings = [ [ 'id' => 's-1', 'displayName' => 'Setting A', 'settingInstance' => [ '@odata.type' => '#microsoft.management.configuration.deviceManagementConfigurationSimpleSettingInstance', 'simpleSettingValue' => ['value' => 10], 'id' => 'si-1', ], ], [ 'displayName' => 'Setting B', 'settingInstance' => [ '@odata.type' => '#microsoft.management.configuration.deviceManagementConfigurationChoiceSettingInstance', 'choiceSettingValue' => ['value' => 'opt1'], 'children' => [ [ 'id' => 'c-1', '@odata.type' => '#child.type', 'someValue' => true, ], ], ], ], ]; $sanitized = $this->registry->sanitizeSettingsApplyPayload('settingsCatalogPolicy', $settings); expect($sanitized)->toBeArray(); expect(count($sanitized))->toBe(2); // Top-level ids stripped expect(array_key_exists('id', $sanitized[0]))->toBeFalse(); // Top-level @odata.type should be added if missing expect(isset($sanitized[0]['@odata.type']))->toBeTrue(); expect($sanitized[0]['@odata.type'])->toBe('#microsoft.graph.deviceManagementConfigurationSetting'); expect(isset($sanitized[1]['@odata.type']))->toBeTrue(); expect($sanitized[1]['@odata.type'])->toBe('#microsoft.graph.deviceManagementConfigurationSetting'); // @odata.type preserved at settingInstance expect(isset($sanitized[0]['settingInstance']['@odata.type']))->toBeTrue(); expect(isset($sanitized[1]['settingInstance']['@odata.type']))->toBeTrue(); // nested child keeps its @odata.type and stripped id expect(isset($sanitized[1]['settingInstance']['children'][0]['@odata.type']))->toBeTrue(); expect(array_key_exists('id', $sanitized[1]['settingInstance']['children'][0]))->toBeFalse(); });