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 testStatsPageCapabilityMapIncludesAuditCapabilities(): void { $content = $this->readProjectFile('lib/Service/Access/UiCapabilityMap.php'); $this->assertStringContainsString("'can_view_system_audit' => OperationsAuthorizationPolicy::ABILITY_ADMIN_SYSTEM_AUDIT_VIEW", $content); $this->assertStringContainsString("'can_view_user_lifecycle_audit' => OperationsAuthorizationPolicy::ABILITY_ADMIN_USER_LIFECYCLE_AUDIT_VIEW", $content); } }