Nette Tester: HTTP testování ještě nikdy nebylo tak jednoduché

včera od David Grudl  

Kdy jste naposledy změnili konfiguraci serveru, upravili .htaccess nebo přepsali nginx pravidla? A zkontrolovali jste, jestli se tím náhodou nerozbila přesměrování, nepřestal být dostupný robots.txt nebo se zpřístupnil skrytý adresář pro nepovolané? A kontrolujete to automatizovaně, nebo jen web ručně proklikáte a doufáte, že je vše v pořádku?

S novou třídou HttpAssert v Nette Tester 2.5.6 můžete všechny tyto kritické kontroly automatizovat a už nikdy se nemusíte bát, že vám nějaká změna konfigurace rozbije web.

Představte si, že po každé změně nginx konfigurace automaticky ověříte:

// Kritické cesty jsou stále přístupné
HttpAssert::fetch('https://example.com/robots.txt')
    ->expectCode(200)
    ->expectHeader('Content-Type', contains: 'text/plain');

// Admin sekce je správně chráněna
HttpAssert::fetch('https://example.com/admin')
    ->expectCode(403);

// API endpoint funguje
HttpAssert::fetch('https://example.com/api/health')
    ->expectCode(200)
    ->expectBody(contains: '"status":"ok"');

Všechny způsoby validace na jednom místě

HttpAssert umožňuje jednoduše provádět HTTP požadavky a ověřovat jejich stavové kódy, hlavičky i obsah odpovědi. Metoda fetch() vrátí instanci HttpAssert pro následné ověřování pomocí fluent interface. Můžete používat matches, které znáte z Assert::match().

HttpAssert::fetch('https://api.example.com/data')
    // Stavové kódy
    ->expectCode(200)                                   // přesný kód

    // Hlavičky všemi způsoby
    ->expectHeader('Content-Type')                      // hlavička musí existovat
    ->expectHeader('Content-Type', 'application/json')  // přesná hodnota
    ->expectHeader('Content-Type', contains: 'json')    // obsahuje text
    ->expectHeader('Server', matches: 'nginx %a%')      // pattern matching

    // Tělo odpovědi
    ->expectBody('OK')                                  // přesná hodnota
    ->expectBody(contains: '"success": true')           // obsahuje text
    ->expectBody(matches: '%A%"users":[%a%]%A%');       // odpovídá vzoru

K dispozici jsou i deny* metody podporují stejné možnosti jako jejich expect* protějšky:

HttpAssert::fetch('https://api.example.com/data')
    ->denyCode(200)                           // nesmí být 200
    ->denyHeader('Content-Type')                      // hlavička nesmí existovat
    ->denyHeader('Content-Type', contains: 'json')    // neobsahuje text
    ->denyHeader('Server', matches: 'nginx %a%')      // neodpovídá vzoru
    ->denyBody('OK')                                  // tělo nesmí mít hodnotu
    ->denyBody(contains: '"success": true')           // neobsahuje text
    ->denyBody(matches: '~exception|fatal~i');        // neodpovídá vzoru

Callback funkce pro pokročilé

Někdy potřebujete víc než jen jednoduchá porovnání. Proto HttpAssert podporuje callback funkce u všech ověřovacích metod. Můžete si napsat vlastní validační logiku a stále využívat elegantní API:

HttpAssert::fetch('https://api.example.com/data')
    ->expectCode(fn($code) => $code === 200 || $code === 201)
    ->expectHeader('Content-Length', fn($length) => $length > 1000)
    ->expectBody(fn($body) => json_decode($body) !== null);

Inteligentní práce s přesměrováními

Máte plnou kontrolu nad redirecty – můžete je sledovat nebo testovat samostatně:

// Testovat redirect bez následování
HttpAssert::fetch('https://example.com/old-blog', follow: false)
    ->expectCode(301)
    ->expectHeader('Location', 'https://example.com/blog');

// Sledovat redirecty až do konce
HttpAssert::fetch('https://example.com/old-blog', follow: true)
    ->expectCode(200)
    ->expectBody(contains: 'Welcome to our new blog');

Flexibilní konfigurace požadavků

Ať už testujete GET, POST, PUT, DELETE nebo jakoukoliv jinou HTTP metodu, HttpAssert si s tím poradí. A samozřejmě můžete posílat i tělo požadavku, hlavičky nebo cookies:

HttpAssert::fetch(
    'https://api.example.com/protected',
    method: 'POST',
    headers: [
        'Authorization' => 'Bearer ' . $token,  // asociativní pole
        'Accept: application/json',              // nebo jako string
    ],
    cookies: ['session' => $sessionId],
    body: json_encode($data)
)
    ->expectCode(201)
    ->expectBody(contains: 'created');

Srozumitelné chybové zprávy

Když test selže, HttpAssert vám řekne přesně, co se pokazilo:

Expected HTTP status code 200 but got 404
Header 'Content-Type' should contain 'json' but was 'text/html'
Body should contain 'success'

Co ještě nového v Tester 2.5.6?

Kromě HttpAssert přináší verze 2.5.6 také podporu pro nadcházející PHP 8.5, které vyjde na konci roku. Nette Tester tak zůstává vždy o krok napřed a připravený na nejnovější verze PHP.

Vyzkoušejte si HttpAssert a dejte nám vědět, jak se vám líbí!

David Grudl Zakladatel Uměligence a autor Nette Framework, populárního PHP frameworku. Od roku 2021 se naplno věnuje umělé inteligenci a učí lidi ji využívat v praxi. Spolu s kolegy z Tech Guys každý týden rozebírá tech novinky. Píše na phpFashion a La Trine. Věří, že AI není sci-fi, ale nástroj pro lepší život už dnes.