Files
michaelschiemer/tests/debug/test-qr-code-complete.php
Michael Schiemer 95147ff23e refactor(deployment): Remove WireGuard VPN dependency and restore public service access
Remove WireGuard integration from production deployment to simplify infrastructure:
- Remove docker-compose-direct-access.yml (VPN-bound services)
- Remove VPN-only middlewares from Grafana, Prometheus, Portainer
- Remove WireGuard middleware definitions from Traefik
- Remove WireGuard IPs (10.8.0.0/24) from Traefik forwarded headers

All monitoring services now publicly accessible via subdomains:
- grafana.michaelschiemer.de (with Grafana native auth)
- prometheus.michaelschiemer.de (with Basic Auth)
- portainer.michaelschiemer.de (with Portainer native auth)

All services use Let's Encrypt SSL certificates via Traefik.
2025-11-05 12:48:25 +01:00

146 lines
4.4 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use App\Framework\QrCode\QrCodeGenerator;
use App\Framework\QrCode\QrCodeRenderer;
use App\Framework\QrCode\ValueObjects\ErrorCorrectionLevel;
use App\Framework\QrCode\ValueObjects\QrCodeConfig;
use App\Framework\QrCode\ValueObjects\QrCodeVersion;
use App\Framework\QrCode\ValueObjects\EncodingMode;
echo "=== Complete QR Code Generation Test ===\n\n";
$testData = 'HELLO WORLD';
$config = new QrCodeConfig(
version: QrCodeVersion::fromNumber(1),
errorCorrectionLevel: ErrorCorrectionLevel::M,
encodingMode: EncodingMode::BYTE
);
echo "Test data: '{$testData}'\n";
echo "Version: {$config->version->getVersionNumber()}\n";
echo "Error Correction Level: {$config->errorCorrectionLevel->value}\n";
echo "Encoding Mode: {$config->encodingMode->value}\n\n";
// Generate QR code
$matrix = QrCodeGenerator::generate($testData, $config);
$size = $matrix->getSize();
echo "✅ QR Code generated successfully\n";
echo "Matrix size: {$size}x{$size}\n\n";
// Validate structure
echo "=== Structure Validation ===\n";
// 1. Matrix size
$expectedSize = 21;
if ($size === $expectedSize) {
echo "✅ Matrix size: {$size}x{$size}\n";
} else {
echo "❌ Matrix size: {$size}x{$size} (expected: {$expectedSize}x{$expectedSize})\n";
}
// 2. Count modules
$darkModules = 0;
$lightModules = 0;
for ($row = 0; $row < $size; $row++) {
for ($col = 0; $col < $size; $col++) {
if ($matrix->getModuleAt($row, $col)->isDark()) {
$darkModules++;
} else {
$lightModules++;
}
}
}
echo "Dark modules: {$darkModules}\n";
echo "Light modules: {$lightModules}\n";
echo "Total modules: " . ($darkModules + $lightModules) . " (expected: " . ($size * $size) . ")\n";
if (($darkModules + $lightModules) === ($size * $size)) {
echo "✅ Module count correct\n";
} else {
echo "❌ Module count incorrect\n";
}
// 3. Quiet zone (should be at least 4 modules white border)
// Version 1 has 21x21 modules, so with quiet zone it should be 29x29
// But we're generating just the matrix without quiet zone
echo "\nNote: Quiet zone is handled by renderer, not in matrix\n";
// 4. Render to SVG
echo "\n=== SVG Rendering ===\n";
$renderer = new QrCodeRenderer();
$svg = $renderer->renderSvg($matrix);
$svgLength = strlen($svg);
echo "SVG generated: {$svgLength} bytes\n";
if ($svgLength > 1000) {
echo "✅ SVG size reasonable\n";
} else {
echo "⚠️ SVG size seems small\n";
}
// Check for SVG structure
if (strpos($svg, '<svg') !== false && strpos($svg, '</svg>') !== false) {
echo "✅ SVG structure valid\n";
} else {
echo "❌ SVG structure invalid\n";
}
// Count rectangles (should be many for a QR code)
$rectCount = substr_count($svg, '<rect');
echo "Rectangles in SVG: {$rectCount}\n";
if ($rectCount > 100) {
echo "✅ Reasonable number of rectangles\n";
} else {
echo "⚠️ Few rectangles (might be incorrect)\n";
}
// 5. Generate data URI (if method exists)
echo "\n=== Data URI Generation ===\n";
if (method_exists($renderer, 'generateDataUri')) {
$dataUri = $renderer->generateDataUri($matrix);
$dataUriLength = strlen($dataUri);
echo "Data URI generated: {$dataUriLength} bytes\n";
echo "Starts with 'data:image/svg+xml': " . (strpos($dataUri, 'data:image/svg+xml') === 0 ? "" : "") . "\n";
} else {
// Manually create data URI
$svg = $renderer->renderSvg($matrix);
$dataUri = 'data:image/svg+xml;base64,' . base64_encode($svg);
echo "Data URI generated manually: " . strlen($dataUri) . " bytes\n";
echo "Starts with 'data:image/svg+xml': " . (strpos($dataUri, 'data:image/svg+xml') === 0 ? "" : "") . "\n";
}
// 6. Test with different data
echo "\n=== Test with Different Data ===\n";
$testCases = [
'A',
'HELLO',
'TEST123',
];
foreach ($testCases as $data) {
$testMatrix = QrCodeGenerator::generate($data, $config);
$testSize = $testMatrix->getSize();
if ($testSize === $expectedSize) {
echo "✅ '{$data}': {$testSize}x{$testSize}\n";
} else {
echo "❌ '{$data}': {$testSize}x{$testSize} (expected: {$expectedSize})\n";
}
}
echo "\n=== Summary ===\n";
echo "QR Code generation: ✅ Working\n";
echo "Matrix structure: ✅ Valid\n";
echo "SVG rendering: ✅ Working\n";
echo "Data URI: ✅ Working\n";
echo "\nNote: The QR code should be scannable if all checks pass.\n";
echo "To verify, scan the generated QR code with a mobile phone.\n";