TenantAtlas/apps/platform/tests/Feature/Graph/GraphContractRegistryCoverageSpec095Test.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

75 lines
3.5 KiB
PHP

<?php
declare(strict_types=1);
use App\Services\Graph\GraphContractRegistry;
it('Spec095 keeps graph contract entries for governed deviceManagement resources', function (): void {
$requiredResources = [
'configurationPolicyTemplate' => 'deviceManagement/configurationPolicyTemplates',
'settingsCatalogDefinition' => 'deviceManagement/configurationSettings',
'settingsCatalogCategory' => 'deviceManagement/configurationCategories',
'rbacRoleAssignment' => 'deviceManagement/roleAssignments',
];
foreach ($requiredResources as $contractType => $resourcePath) {
$resource = config("graph_contracts.types.{$contractType}.resource");
expect($resource)
->toBeString("Spec095 missing graph contract resource for {$contractType}")
->toBe($resourcePath, "Spec095 graph contract resource mismatch for {$contractType}");
}
$settingTemplatesPath = config('graph_contracts.types.configurationPolicyTemplate.subresources.settingTemplates.path');
expect($settingTemplatesPath)
->toBeString('Spec095 missing settingTemplates subresource for configurationPolicyTemplate');
expect(str_contains((string) $settingTemplatesPath, '{id}'))
->toBeTrue('Spec095 settingTemplates subresource path must include the parent {id} placeholder');
});
it('Spec095 keeps registry path helpers for governed resources', function (): void {
$contracts = app(GraphContractRegistry::class);
expect($contracts->configurationPolicyTemplateListPath())
->toBe('/deviceManagement/configurationPolicyTemplates');
expect($contracts->configurationPolicyTemplateItemPath('template/abc'))
->toBe('/deviceManagement/configurationPolicyTemplates/template%2Fabc');
expect($contracts->configurationPolicyTemplateSettingTemplatesPath('template/abc'))
->toBe('/deviceManagement/configurationPolicyTemplates/template%2Fabc/settingTemplates');
expect($contracts->settingsCatalogDefinitionItemPath('definition/abc'))
->toBe('/deviceManagement/configurationSettings/definition%2Fabc');
expect($contracts->settingsCatalogCategoryItemPath('category/abc'))
->toBe('/deviceManagement/configurationCategories/category%2Fabc');
expect($contracts->rbacRoleAssignmentItemPath('assignment/abc'))
->toBe('/deviceManagement/roleAssignments/assignment%2Fabc');
});
it('Spec095 guards against hardcoded governed endpoint strings in scoped call sites', function (): void {
$scopedGuards = [
'app/Services/Intune/ConfigurationPolicyTemplateResolver.php' => ['deviceManagement/configurationPolicyTemplates'],
'app/Services/Intune/SettingsCatalogDefinitionResolver.php' => ['deviceManagement/configurationSettings'],
'app/Services/Intune/SettingsCatalogCategoryResolver.php' => ['deviceManagement/configurationCategories'],
'app/Services/Intune/RbacOnboardingService.php' => ['deviceManagement/roleAssignments'],
'app/Services/Intune/RbacHealthService.php' => ['deviceManagement/roleAssignments'],
];
foreach ($scopedGuards as $file => $forbiddenSubstrings) {
$contents = file_get_contents(base_path($file));
expect($contents)
->not->toBeFalse("Spec095 regression guard could not read {$file}");
foreach ($forbiddenSubstrings as $forbiddenSubstring) {
expect(str_contains((string) $contents, $forbiddenSubstring))
->toBeFalse("Spec095 regression guard found hardcoded '{$forbiddenSubstring}' in {$file}; use GraphContractRegistry helper paths instead.");
}
}
});