Files
michaelschiemer/tests/debug/test-template-exception-handling.php
Michael Schiemer 5050c7d73a docs: consolidate documentation into organized structure
- Move 12 markdown files from root to docs/ subdirectories
- Organize documentation by category:
  • docs/troubleshooting/ (1 file)  - Technical troubleshooting guides
  • docs/deployment/      (4 files) - Deployment and security documentation
  • docs/guides/          (3 files) - Feature-specific guides
  • docs/planning/        (4 files) - Planning and improvement proposals

Root directory cleanup:
- Reduced from 16 to 4 markdown files in root
- Only essential project files remain:
  • CLAUDE.md (AI instructions)
  • README.md (Main project readme)
  • CLEANUP_PLAN.md (Current cleanup plan)
  • SRC_STRUCTURE_IMPROVEMENTS.md (Structure improvements)

This improves:
 Documentation discoverability
 Logical organization by purpose
 Clean root directory
 Better maintainability
2025-10-05 11:05:04 +02:00

158 lines
7.2 KiB
PHP

<?php
declare(strict_types=1);
/**
* Test für Framework-konforme Template Exception Handling
*/
require_once __DIR__ . '/../bootstrap.php';
use App\Framework\Exception\ErrorCode;
use App\Framework\Exception\FrameworkException;
use App\Framework\View\Exceptions\TemplateCacheException;
use App\Framework\View\Exceptions\TemplateNotFoundException;
use App\Framework\View\Exceptions\TemplateProcessorException;
use App\Framework\View\Exceptions\TemplateRenderingException;
try {
echo "🧪 Testing Template Exception Handling Framework Integration\n";
echo "=" . str_repeat("=", 60) . "\n\n";
// Test 1: TemplateNotFoundException Factory Methods
echo "🔍 Test 1: TemplateNotFoundException Factory Methods\n";
echo "-" . str_repeat("-", 45) . "\n";
$exception = TemplateNotFoundException::forTemplate(
'user/profile',
'/app/templates',
['/app/templates', '/app/views']
);
echo "Exception Class: " . get_class($exception) . "\n";
echo "Error Code: " . $exception->getErrorCode()->value . " (" . $exception->getErrorCode()->getDescription() . ")\n";
echo "Message: " . $exception->getMessage() . "\n";
echo "Operation: " . $exception->getContext()->operation . "\n";
echo "Component: " . $exception->getContext()->component . "\n";
echo "Template: " . $exception->getContext()->data['template'] . "\n";
echo "Suggestions: " . json_encode($exception->getContext()->metadata['suggestions']) . "\n";
echo "Template Type: " . $exception->getContext()->metadata['template_type'] . "\n\n";
// Test 2: TemplateCacheException
echo "🔍 Test 2: TemplateCacheException Error Codes\n";
echo "-" . str_repeat("-", 45) . "\n";
$cacheException = TemplateCacheException::cacheWriteFailed(
'template_user_profile_123',
'/tmp/cache/templates/user_profile_123.cache'
);
echo "Exception Class: " . get_class($cacheException) . "\n";
echo "Error Code: " . $cacheException->getErrorCode()->value . "\n";
echo "Description: " . $cacheException->getErrorCode()->getDescription() . "\n";
echo "Recovery Hint: " . $cacheException->getErrorCode()->getRecoveryHint() . "\n";
echo "Is Recoverable: " . ($cacheException->getErrorCode()->isRecoverable() ? 'Yes' : 'No') . "\n";
echo "Retry After: " . ($cacheException->getErrorCode()->getRetryAfterSeconds() ?? 'N/A') . " seconds\n";
echo "Recovery Strategy: " . $cacheException->getContext()->metadata['recovery_strategy'] . "\n\n";
// Test 3: TemplateRenderingException Variable Resolution
echo "🔍 Test 3: TemplateRenderingException Variable Resolution\n";
echo "-" . str_repeat("-", 45) . "\n";
$renderingException = TemplateRenderingException::variableNotFound(
'user/dashboard',
'userName',
['user' => ['id' => 1], 'userProfile' => ['name' => 'John'], 'userSettings' => []]
);
echo "Exception Class: " . get_class($renderingException) . "\n";
echo "Error Code: " . $renderingException->getErrorCode()->value . "\n";
echo "Missing Variable: " . $renderingException->getContext()->data['missing_variable'] . "\n";
echo "Available Variables: " . json_encode($renderingException->getContext()->data['available_variables']) . "\n";
echo "Suggestions: " . json_encode($renderingException->getContext()->metadata['suggestions']) . "\n\n";
// Test 4: TemplateProcessorException Chain Failure
echo "🔍 Test 4: TemplateProcessorException Chain Failure\n";
echo "-" . str_repeat("-", 45) . "\n";
$processorException = TemplateProcessorException::processorChainFailed(
['AssetInjector', 'FormProcessor', 'LayoutProcessor', 'ComponentProcessor'],
'FormProcessor'
);
echo "Exception Class: " . get_class($processorException) . "\n";
echo "Error Code: " . $processorException->getErrorCode()->value . "\n";
echo "Failed Processor: " . $processorException->getContext()->data['failed_processor'] . "\n";
echo "Chain Position: " . $processorException->getContext()->data['chain_position'] . "\n";
echo "Recovery Strategy: " . $processorException->getContext()->metadata['recovery_strategy'] . "\n\n";
// Test 5: ErrorCode Template Categories
echo "🔍 Test 5: ErrorCode Template Categories\n";
echo "-" . str_repeat("-", 45) . "\n";
$templateErrorCodes = [
ErrorCode::TPL_TEMPLATE_NOT_FOUND,
ErrorCode::TPL_SYNTAX_ERROR,
ErrorCode::TPL_VARIABLE_NOT_FOUND,
ErrorCode::TPL_COMPILATION_FAILED,
ErrorCode::TPL_RENDERING_FAILED,
ErrorCode::TPL_CACHE_FAILED,
ErrorCode::TPL_CONTENT_LOADING_FAILED,
ErrorCode::TPL_PROCESSOR_FAILED,
ErrorCode::TPL_ASSET_NOT_FOUND,
ErrorCode::TPL_INVALID_TEMPLATE_TYPE,
];
foreach ($templateErrorCodes as $errorCode) {
$category = $errorCode->getCategory();
$isRecoverable = $errorCode->isRecoverable() ? 'Yes' : 'No';
$retryAfter = $errorCode->getRetryAfterSeconds() ?? 'N/A';
echo " {$errorCode->value}: {$errorCode->getDescription()}\n";
echo " Category: $category | Recoverable: $isRecoverable | Retry: $retryAfter\n";
}
echo "\n";
// Test 6: Framework Exception Hierarchy Compliance
echo "🔍 Test 6: Framework Exception Hierarchy Compliance\n";
echo "-" . str_repeat("-", 45) . "\n";
$exceptions = [
'TemplateNotFoundException' => TemplateNotFoundException::forTemplate('test'),
'TemplateCacheException' => TemplateCacheException::cacheReadFailed('test', '/tmp/test'),
'TemplateRenderingException' => TemplateRenderingException::renderingFailed('test', 'processing'),
'TemplateProcessorException' => TemplateProcessorException::processorFailed('TestProcessor', 'test', 'operation'),
];
foreach ($exceptions as $name => $exception) {
$isFrameworkException = $exception instanceof FrameworkException;
$hasErrorCode = $exception->getErrorCode() !== null;
$hasContext = $exception->getContext() !== null;
$isFinal = (new ReflectionClass($exception))->isFinal();
echo " $name:\n";
echo " ✅ Framework Exception: " . ($isFrameworkException ? 'Yes' : 'No') . "\n";
echo " ✅ Has ErrorCode: " . ($hasErrorCode ? 'Yes' : 'No') . "\n";
echo " ✅ Has Context: " . ($hasContext ? 'Yes' : 'No') . "\n";
echo " ✅ Is Final: " . ($isFinal ? 'Yes' : 'No') . "\n";
}
echo "\n🎉 All Template Exception Handling Tests completed successfully!\n\n";
echo "📋 Summary of Framework Integration:\n";
echo " ✅ Modern FrameworkException mit ErrorCode Integration\n";
echo " ✅ Rich Exception Context mit Operation/Component Tracking\n";
echo " ✅ Factory Methods für konsistente Exception Creation\n";
echo " ✅ Recovery Hints und Retry Strategies\n";
echo " ✅ Template-spezifische Error Codes (TPL001-TPL010)\n";
echo " ✅ Intelligent Error Suggestions und Metadata\n";
echo " ✅ Framework-konforme final readonly Classes\n";
echo " ✅ Backward Compatible Legacy Support\n";
} catch (Exception $e) {
echo "❌ Test failed with error: " . $e->getMessage() . "\n";
echo "Exception: " . get_class($e) . "\n";
echo "Stack trace:\n" . $e->getTraceAsString() . "\n";
exit(1);
}