Commit 4b70fb1a authored by Fabien Potencier's avatar Fabien Potencier

fixed session service provider for functional tests

parent ca497490
......@@ -10,51 +10,51 @@
{
"package": "pimple/pimple",
"version": "dev-master",
"source-reference": "5bd96492f13a09210b3f62a8c2c5179716033e2c"
"source-reference": "694448bdd2b7d802517104bdafe1a6f2591506c8"
},
{
"package": "symfony/event-dispatcher",
"version": "dev-master",
"source-reference": "30d3f5da80c2aeab15bcdb5a7d448d15bc294b23"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/event-dispatcher",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "30d3f5da80c2aeab15bcdb5a7d448d15bc294b23"
},
{
"package": "symfony/http-foundation",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "526d5d663f0b3170a91f916f912075609120e09a"
},
{
"package": "symfony/http-foundation",
"version": "dev-master",
"source-reference": "68bd51cef7cdba65948fbbfd7d9b26b14cc5c620"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/http-kernel",
"version": "dev-master",
"source-reference": "8a76f48ba97922bf17fdedf35f05ec061e82c352"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/http-kernel",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "8a76f48ba97922bf17fdedf35f05ec061e82c352"
},
{
"package": "symfony/routing",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "4eef37eee0961782dfe66a23df4fc280ff1a9e44"
},
{
"package": "symfony/routing",
"version": "dev-master",
"source-reference": "4eef37eee0961782dfe66a23df4fc280ff1a9e44"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
}
],
"packages-dev": [
......@@ -103,13 +103,13 @@
{
"package": "symfony/css-selector",
"version": "dev-master",
"source-reference": "d0a98b37fbb57188766fd7c7d757354397ee6ead"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/css-selector",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "d0a98b37fbb57188766fd7c7d757354397ee6ead"
},
{
"package": "symfony/dom-crawler",
......@@ -136,13 +136,13 @@
{
"package": "symfony/form",
"version": "dev-master",
"source-reference": "e9068070fab8919f63e1a4e6313325082f4a1aa2"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/form",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "e9068070fab8919f63e1a4e6313325082f4a1aa2"
},
{
"package": "symfony/locale",
......@@ -169,8 +169,7 @@
{
"package": "symfony/options-resolver",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "201aceefc43f75e974c37be8d671f9f3e387847f"
},
{
"package": "symfony/options-resolver",
......@@ -178,11 +177,6 @@
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/options-resolver",
"version": "dev-master",
"source-reference": "201aceefc43f75e974c37be8d671f9f3e387847f"
},
{
"package": "symfony/process",
"version": "dev-master",
......@@ -197,13 +191,13 @@
{
"package": "symfony/translation",
"version": "dev-master",
"source-reference": "db3e85934353a130d743b2ddd53dd678c8ebca12"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/translation",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "db3e85934353a130d743b2ddd53dd678c8ebca12"
},
{
"package": "symfony/twig-bridge",
......@@ -230,13 +224,13 @@
{
"package": "twig/twig",
"version": "dev-master",
"alias-pretty-version": "1.8.x-dev",
"alias-version": "1.8.9999999.9999999-dev"
"source-reference": "d4511d02b45725a56c8cc49127244bca640c9d13"
},
{
"package": "twig/twig",
"version": "dev-master",
"source-reference": "d4511d02b45725a56c8cc49127244bca640c9d13"
"alias-pretty-version": "1.8.x-dev",
"alias-version": "1.8.9999999.9999999-dev"
}
],
"aliases": [
......
......@@ -27,6 +27,9 @@ Parameters
However, all of these are optional. Sessions last as long as the browser is
open. To override this, set the ``lifetime`` option.
* **session.test**: Whether to simulate sessions or not (useful when writing
functional tests).
Services
--------
......@@ -34,7 +37,7 @@ Services
<http://api.symfony.com/master/Symfony/Component/HttpFoundation/Session/Session.html>`_.
* **session.storage**: A service that is used for persistence of the session
data. Defaults to a ``NativeSessionStorage``.
data.
* **session.storage.handler**: A service that is used by the
``session.storage`` for data access. Defaults to a
......
......@@ -106,19 +106,15 @@ executed before every test.
.. tip::
If your application use sessions, you have to use ``FilesystemSessionStorage``
to store sessions::
// ...
use Symfony\Component\HttpFoundation\SessionStorage\FilesystemSessionStorage;
// ...
If your application use sessions, set ``session.test`` to ``true`` to
simulate sessions::
public function createApplication()
{
// ...
$this->app['session.storage'] = $this->app->share(function() {
return new FilesystemSessionStorage(sys_get_temp_dir());
});
$this->app['session.test'] = true;
// ...
}
......
......@@ -16,8 +16,13 @@ use Silex\ServiceProviderInterface;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\FileSessionHandler;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
/**
* Symfony HttpFoundation component Provider for sessions.
......@@ -32,7 +37,19 @@ class SessionServiceProvider implements ServiceProviderInterface
{
$this->app = $app;
if (!isset($app['session.test'])) {
$app['session.test'] = false;
}
$app['session'] = $app->share(function () use ($app) {
if (!isset($app['session.storage'])) {
if ($app['session.test']) {
$app['session.storage'] = $app['session.storage.test'];
} else {
$app['session.storage'] = $app['session.storage.native'];
}
}
return new Session($app['session.storage']);
});
......@@ -42,13 +59,17 @@ class SessionServiceProvider implements ServiceProviderInterface
);
});
$app['session.storage'] = $app->share(function () use ($app) {
$app['session.storage.native'] = $app->share(function () use ($app) {
return new NativeSessionStorage(
$app['session.storage.options'],
$app['session.storage.handler']
);
});
$app['session.storage.test'] = $app->share(function() {
return new MockFileSessionStorage();
});
if (!isset($app['session.storage.options'])) {
$app['session.storage.options'] = array();
}
......@@ -58,7 +79,7 @@ class SessionServiceProvider implements ServiceProviderInterface
}
}
public function onKernelRequest($event)
public function onEarlyKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$request->setSession($this->app['session']);
......@@ -69,8 +90,49 @@ class SessionServiceProvider implements ServiceProviderInterface
}
}
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
// bootstrap the session
if (!isset($this->app['session'])) {
return;
}
$session = $this->app['session'];
$cookies = $event->getRequest()->cookies;
if ($cookies->has($session->getName())) {
$session->setId($cookies->get($session->getName()));
} else {
$session->migrate(false);
}
}
public function onKernelResponse(FilterResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
if ($session = $event->getRequest()->getSession()) {
$session->save();
$params = session_get_cookie_params();
$event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), 0 === $params['lifetime'] ? 0 : time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly']));
}
}
public function boot(Application $app)
{
$app['dispatcher']->addListener(KernelEvents::REQUEST, array($this, 'onKernelRequest'), 128);
$app['dispatcher']->addListener(KernelEvents::REQUEST, array($this, 'onEarlyKernelRequest'), 128);
if ($app['session.test']) {
$app['dispatcher']->addListener(KernelEvents::REQUEST, array($this, 'onKernelRequest'), 192);
$app['dispatcher']->addListener(KernelEvents::RESPONSE, array($this, 'onKernelResponse'), -128);
}
}
}
......@@ -12,6 +12,7 @@
namespace Silex\Tests\Provider;
use Silex\Application;
use Silex\WebTestCase;
use Silex\Provider\SessionServiceProvider;
use Symfony\Component\HttpFoundation\Request;
......@@ -21,23 +22,39 @@ use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
* SessionProvider test cases.
*
* @author Igor Wiedler <igor@wiedler.ch>
* @author Fabien Potencier <fabien@symfony.com>
*/
class SessionServiceProviderTest extends \PHPUnit_Framework_TestCase
class SessionServiceProviderTest extends WebTestCase
{
public function testRegister()
{
$app = new Application();
$app->register(new SessionServiceProvider());
/**
* Smoke test
*/
$defaultStorage = $app['session.storage'];
$defaultStorage = $this->app['session.storage.native'];
$app['session.storage'] = $app->share(function () use ($app) {
return new MockArraySessionStorage();
});
$client = $this->createClient();
$client->request('get', '/login');
$this->assertEquals('Logged in successfully.', $client->getResponse()->getContent());
$client->request('get', '/account');
$this->assertEquals('This is your account.', $client->getResponse()->getContent());
$client->request('get', '/logout');
$this->assertEquals('Logged out successfully.', $client->getResponse()->getContent());
$client->request('get', '/account');
$this->assertEquals('You are not logged in.', $client->getResponse()->getContent());
}
public function createApplication()
{
$app = new Application();
$app->register(new SessionServiceProvider(), array(
'session.test' => true,
));
$app->get('/login', function () use ($app) {
$app['session']->set('logged_in', true);
......@@ -53,12 +70,12 @@ class SessionServiceProviderTest extends \PHPUnit_Framework_TestCase
return 'This is your account.';
});
$request = Request::create('/login');
$response = $app->handle($request);
$this->assertEquals('Logged in successfully.', $response->getContent());
$app->get('/logout', function () use ($app) {
$app['session']->invalidate();
return 'Logged out successfully.';
});
$request = Request::create('/account');
$response = $app->handle($request);
$this->assertEquals('This is your account.', $response->getContent());
return $app;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment