Test formuláře s CSRF protection

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
zimmi
Člen | 94
+
+4
-

Mám jednoduchý test založený na Tester\TestCase s následující metodou:

function testAddFormSent()
    {
        $request = new \Nette\Application\Request('Module:Presenter', 'POST', array(
            'action' => 'add',
            'do' => 'addForm-form-submit',
            ), array(
            'param1' => 'test',
            'param2' => 'test',
            'param3' => 'test',
            '_submit' => 'Odeslat',
            'do' => 'addForm-form-submit'
            )
        );
        $response = $this->presenter->run($request);
        Assert::true( $response instanceof Nette\Application\Responses\RedirectResponse );

    }

Testuje to odeslání formuláře a když u něj nechám zapnutý řádek s CSRF ochranou, vždycky skončí failem a v seznamu chyb formuláře vidím právě zprávu CSRF ochrany.

$form->addProtection('Vypršel časový limit, odešlete formulář znovu');

Když tenhle řádek vypnu, test funguje a proběhne v pořádku. V setUp() metodě testu si přihlásím uživatele:

function setUp()
    {
        $user = $this->container->getByType('Nette\Security\User');
        $auth = $this->container->getByType('App\Admin\Model\Authenticator');

        $this->presenter->user->storage->setNamespace('admin');
        $auth->login(array('admin', 'admin'));
    }

Tohle je jediný rozdíl proti jiným testům, které rovněž testují odeslání dat přes formulář s CSRF ochranou a které fungují – u přihlašovacích formulářů je uživatel anonymní, takže soudím, že by to s tím mohlo nějak souviset.

Jakým způsobem tedy otestovat takový formulář?

mkoubik
Člen | 728
+
+1
-

Teď jsem to taky řešil – použil jsem kdyby/fake-session.

Nastav si $session->setFakeId(...) na nejaky konstantni retezec a $session->getSection(CsrfProtection::class)->token = ... zase na jiny.

V CsrfProtection::validateCsrf() si pak dumpni co za token to z toho generuje a ten si dej napevno do toho testu (posli jako _token_ ve formulari).