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

fixed session service provider for functional tests

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