Přihlášený uživatel pro testování presenteru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
TomasHalasz
Bronze Partner | 79
+
0
-

Ahoj,

prosím o radu. Začínám testovat, ale celkem se v tom plácám :-)
Chci otestovat funkci z presenteru, to bych zvládl, ale presenter pracuje pouze tehdy pokud je přihlášený uživatel. Uživatele v testu dokážu přihlásit:

		$authenticator = $this->container->getByType('App\Model\UserManager');
		$user = $authenticator->authenticate(array("username", 'password'));

Presenter pro testy si pak vytvořím takto:

		$presenterFactory = $this->container->getByType('Nette\Application\IPresenterFactory');
		$presenter = $presenterFactory->createPresenter('Application:Helpdesk');
		Assert::same('bc', $presenter->getCategory());

Bohužel funkce getCategory() nemá žádnou informaci o přihlášeném uživateli. Nedaří se mi přijít na to jak uživatele přihlásit aby ho viděl i ten presenter… Mám takové tušení, že bych ho měl uložit ještě do nějaké session? Nebo nějak jinak ?

díky moc

CZechBoY
Člen | 3608
+
0
-

Tak po autentizaci se ti vrati IIdentity, kterou pouzijes pro vytvoreni uzivatele.
Budes pak muset zavolat injectPrimary a vyplnis asi jen uzivatele…

TomasHalasz
Bronze Partner | 79
+
0
-

Zkusil jsem to jak píšeš, ale nevím si rady s injectPrimary. Našel jsem na fóru jak připravit vše pro injectPrimary a mám to nyní takto:

		$authenticator = $this->container->getByType('App\Model\UserManager');
		$user = $authenticator->authenticate(array("name", 'password'));
		$iuserStorage =  $this->container->getByType('Nette\Security\IUserStorage');
		$iuserStorage->setIdentity($user);
		$iuserStorage->setAuthenticated(TRUE);

		$presenterFactory = $this->container->getByType('Nette\Application\IPresenterFactory');
		$presenter = $presenterFactory->createPresenter('Application:Helpdesk');
		$presenter->autoCanonicalize = FALSE;

$request = new \Nette\Http\Request(new \Nette\Http\UrlScript);
$response = new \Nette\Http\Response();
$session = new \Nette\Http\Session($request, $response);
$user = new \Nette\Security\User(new \Nette\Http\UserStorage($session));
$presenter->injectPrimary(NULL, NULL, NULL, $request, $response, $session, $user);

		Assert::same('bc', $presenter->getCategory());

Bohužel dostanu chybu:

Nette\InvalidStateException: Method Nette\Application\UI\Presenter::injectPrimary is intended for initialization and should not be called more than once.

A s tím si nevím rady…

mrtnzlml
Člen | 140
+
+1
-

Testbench si s tímto problémem umí poradit: Testing restricted areas

Pro takto jednoduché účely je to dostatečně dobré. :) Beru však na vědomí, že bys musel použít celý tento nástroj (což ostatně doporučuji, protože jsem ho přesně z těchto důvodů stavěl) Můžeš se však inspirovat vnitřní implementací. Následně lze otestovat presenter pomocí checkAction (nebo jen check) a případně získat presenter pomocí getPresenter. :)