Files
urlshort-qr-gen/tests/UserAgentParserTest.php
florian.wilde 8a7939bee2 test: Testsuite fuer Kernlogik, QR-Codes, Domains und Sicherheit
232 Tests, unter anderem:
- Slug-Erzeugung, Kollisionsbehandlung und Validierung
- URL-Validierung inklusive IDN, Prozentkodierung und abgelehnter
  Protokolle; Punycode gegengeprueft gegen idn_to_ascii
- QR-Erzeugung in allen Groessen, mit Logo und Level-H-Automatik
- Weiterleitung gegen eine echte SQLite-Datenbank samt Domain-
  Aufloesung ueber den Host-Header
- Update einer bestehenden Installation auf mehrere Domains
- Angriffsseitig: gefaelschte Proxy-Header, Host-Header-Injektion,
  SVG mit Skripten, XXE und externen Referenzen
2026-08-03 18:11:40 +02:00

87 lines
3.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests;
use App\Support\UserAgentParser;
use PHPUnit\Framework\TestCase;
final class UserAgentParserTest extends TestCase
{
/**
* @return array<string,array{0:string,1:string,2:string,3:string}>
*/
public static function agentProvider(): array
{
return [
'Windows Chrome' => [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'desktop', 'Chrome', 'Windows',
],
'macOS Safari' => [
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15',
'desktop', 'Safari', 'macOS',
],
'iPhone Safari' => [
'Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1',
'mobile', 'Safari', 'iOS',
],
'Android Handy' => [
'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36',
'mobile', 'Chrome', 'Android',
],
'Android Tablet' => [
'Mozilla/5.0 (Linux; Android 13; SM-X200) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'tablet', 'Chrome', 'Android',
],
'iPad' => [
'Mozilla/5.0 (iPad; CPU OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/604.1',
'tablet', 'Safari', 'iOS',
],
'Firefox Linux' => [
'Mozilla/5.0 (X11; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0',
'desktop', 'Firefox', 'Linux',
],
'Edge' => [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
'desktop', 'Edge', 'Windows',
],
'Googlebot' => [
'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
'bot', 'Bot', 'unknown',
],
'curl' => ['curl/8.4.0', 'bot', 'Bot', 'unknown'],
];
}
/**
* @dataProvider agentProvider
*/
public function testParse(string $userAgent, string $device, string $browser, string $platform): void
{
$result = UserAgentParser::parse($userAgent);
self::assertSame($device, $result['device']);
self::assertSame($browser, $result['browser']);
self::assertSame($platform, $result['platform']);
}
public function testEmptyUserAgentIsUnknown(): void
{
$result = UserAgentParser::parse('');
self::assertSame('unknown', $result['device']);
self::assertSame('unknown', $result['browser']);
self::assertSame('unknown', $result['platform']);
}
public function testDeviceLabelsAreGerman(): void
{
self::assertSame('Mobil', UserAgentParser::deviceLabel('mobile'));
self::assertSame('Desktop', UserAgentParser::deviceLabel('desktop'));
self::assertSame('Tablet', UserAgentParser::deviceLabel('tablet'));
self::assertSame('Unbekannt', UserAgentParser::deviceLabel('unknown'));
}
}