readProjectFile('templates/default.phtml'); $this->assertStringContainsString("\$viewAuth['layout']", $defaultTemplate); $this->assertStringNotContainsString('UiAccessService::class', $defaultTemplate); $aside = $this->readProjectFile('templates/partials/app-main-aside.phtml'); $this->assertStringContainsString("\$viewAuth['layout']", $aside); $this->assertStringContainsString('layoutHasAdminPanel(', $aside); $this->assertStringContainsString('$layoutNav', $aside); $iconBar = $this->readProjectFile('templates/partials/app-main-aside-icon-bar.phtml'); $this->assertStringContainsString("\$viewAuth['layout']", $iconBar); $this->assertStringContainsString('layoutHasAdminPanel(', $iconBar); } public function testAsideTemplateDoesNotReadRequestOrResolveServicesDirectly(): void { $aside = $this->readProjectFile('templates/partials/app-main-aside.phtml'); $this->assertStringNotContainsString('$_GET', $aside); $this->assertStringNotContainsString('$_SESSION', $aside); $this->assertStringNotContainsString('TenantAvatarService', $aside); $this->assertStringNotContainsString('app(', $aside); } public function testUiAccessServiceUsesCentralLayoutMapDefinition(): void { $content = $this->readProjectFile('lib/Service/Access/UiAccessService.php'); $this->assertStringContainsString('UiCapabilityMap::LAYOUT', $content); } public function testCoreCapabilityMapDoesNotHardcodeAuditCapabilities(): void { $content = $this->readProjectFile('lib/Service/Access/UiCapabilityMap.php'); $this->assertStringNotContainsString('can_view_system_audit', $content); $this->assertStringNotContainsString('can_view_api_audit', $content); $this->assertStringNotContainsString('can_view_user_lifecycle_audit', $content); $this->assertStringNotContainsString('can_view_imports_audit', $content); } }