TenantAtlas/apps/platform/tests/Unit/GraphContractRegistrySettingsApplySanitizerTest.php
ahmido ce0615a9c1 Spec 182: relocate Laravel platform to apps/platform (#213)
## Summary
- move the Laravel application into `apps/platform` and keep the repository root for orchestration, docs, and tooling
- update the local command model, Sail/Docker wiring, runtime paths, and ignore rules around the new platform location
- add relocation quickstart/contracts plus focused smoke coverage for bootstrap, command model, routes, and runtime behavior

## Validation
- `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/PlatformRelocation`
- integrated browser smoke validated `/up`, `/`, `/admin`, `/admin/choose-workspace`, and tenant route semantics for `200`, `403`, and `404`

## Remaining Rollout Checks
- validate Dokploy build context and working-directory assumptions against the new `apps/platform` layout
- confirm web, queue, and scheduler processes all start from the expected working directory in staging/production
- verify no legacy volume mounts or asset-publish paths still point at the old root-level `public/` or `storage/` locations

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #213
2026-04-08 08:40:47 +00:00

65 lines
2.5 KiB
PHP

<?php
use App\Services\Graph\GraphContractRegistry;
beforeEach(function () {
config()->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();
});