summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Scheller <igor.scheller@igorshp.de>2017-11-01 14:47:09 +0100
committerIgor Scheller <igor.scheller@igorshp.de>2017-11-01 16:12:01 +0100
commitad948bdd3201e922b626a736b0122533bdd37cae (patch)
tree9011a160f3d6f9cae37fc02836e7d6e8c25242ca
parente727b367cc77452b58bc2d9360bcde97b7572288 (diff)
Added RequestServiceProvider and SessionServiceProvider
-rw-r--r--config/app.php2
-rw-r--r--includes/engelsystem.php34
-rw-r--r--src/Http/RequestServiceProvider.php14
-rw-r--r--src/Http/SessionServiceProvider.php52
-rw-r--r--tests/Unit/Database/DbTest.php2
-rw-r--r--tests/Unit/Http/RequestServiceProviderTest.php29
-rw-r--r--tests/Unit/Http/SessionServiceProviderTest.php126
7 files changed, 233 insertions, 26 deletions
diff --git a/config/app.php b/config/app.php
index 8037479b..74eb2991 100644
--- a/config/app.php
+++ b/config/app.php
@@ -11,5 +11,7 @@ return [
\Engelsystem\Routing\RoutingServiceProvider::class,
\Engelsystem\Renderer\RendererServiceProvider::class,
\Engelsystem\Database\DatabaseServiceProvider::class,
+ \Engelsystem\Http\RequestServiceProvider::class,
+ \Engelsystem\Http\SessionServiceProvider::class,
],
];
diff --git a/includes/engelsystem.php b/includes/engelsystem.php
index f9535847..97076895 100644
--- a/includes/engelsystem.php
+++ b/includes/engelsystem.php
@@ -3,10 +3,6 @@
use Engelsystem\Application;
use Engelsystem\Config\Config;
use Engelsystem\Exceptions\Handler as ExceptionHandler;
-use Engelsystem\Http\Request;
-use Symfony\Component\HttpFoundation\Session\Session;
-use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
-use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
/**
* This file includes all needed functions, connects to the db etc.
@@ -15,6 +11,12 @@ require_once __DIR__ . '/autoload.php';
/**
+ * Include legacy code
+ */
+require __DIR__ . '/includes.php';
+
+
+/**
* Initialize and bootstrap the application
*/
$app = new Application(realpath(__DIR__ . DIRECTORY_SEPARATOR . '..'));
@@ -48,30 +50,12 @@ if ($app->get('config')->get('maintenance')) {
/**
- * Initialize Request
- *
- * @var Request $request
+ * Init translations
*/
-$request = Request::createFromGlobals();
-$app->instance('request', $request);
-
-
-/**
- * Include legacy code
- */
-require __DIR__ . '/includes.php';
+gettext_init();
/**
- * Init application
+ * Init authorization
*/
-$sessionStorage = (PHP_SAPI != 'cli' ? new NativeSessionStorage(['cookie_httponly' => true]) : new MockArraySessionStorage());
-$session = new Session($sessionStorage);
-$app->instance('session', $session);
-$session->start();
-$request->setSession($session);
-
-
-gettext_init();
-
load_auth();
diff --git a/src/Http/RequestServiceProvider.php b/src/Http/RequestServiceProvider.php
new file mode 100644
index 00000000..077e9ecc
--- /dev/null
+++ b/src/Http/RequestServiceProvider.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Engelsystem\Http;
+
+use Engelsystem\Container\ServiceProvider;
+
+class RequestServiceProvider extends ServiceProvider
+{
+ public function register()
+ {
+ $request = $this->app->call([Request::class, 'createFromGlobals']);
+ $this->app->instance('request', $request);
+ }
+}
diff --git a/src/Http/SessionServiceProvider.php b/src/Http/SessionServiceProvider.php
new file mode 100644
index 00000000..55e3f48b
--- /dev/null
+++ b/src/Http/SessionServiceProvider.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Engelsystem\Http;
+
+use Engelsystem\Container\ServiceProvider;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
+use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
+use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface;
+
+class SessionServiceProvider extends ServiceProvider
+{
+ public function register()
+ {
+ $sessionStorage = $this->getSessionStorage();
+ $this->app->instance('session.storage', $sessionStorage);
+ $this->app->bind(SessionStorageInterface::class, 'session.storage');
+
+ $session = $this->app->make(Session::class);
+ $this->app->instance('session', $session);
+
+ /** @var Request $request */
+ $request = $this->app->get('request');
+ $request->setSession($session);
+
+ $session->start();
+ }
+
+ /**
+ * Returns the session storage
+ *
+ * @return SessionStorageInterface
+ */
+ protected function getSessionStorage()
+ {
+ if ($this->isCli()) {
+ return $this->app->make(MockArraySessionStorage::class);
+ }
+
+ return $this->app->make(NativeSessionStorage::class, ['options' => ['cookie_httponly' => true]]);
+ }
+
+ /**
+ * Test if is called from cli
+ *
+ * @return bool
+ */
+ protected function isCli()
+ {
+ return PHP_SAPI == 'cli';
+ }
+}
diff --git a/tests/Unit/Database/DbTest.php b/tests/Unit/Database/DbTest.php
index 4529cd6b..63607cad 100644
--- a/tests/Unit/Database/DbTest.php
+++ b/tests/Unit/Database/DbTest.php
@@ -19,7 +19,7 @@ class DbTest extends TestCase
$result = Db::connect('mysql:host=localhost;dbname=someTestDatabaseThatDoesNotExist;charset=utf8');
$this->assertFalse($result);
- $result = Db::connect('sqlite::memory');
+ $result = Db::connect('sqlite::memory:');
$this->assertTrue($result);
}
diff --git a/tests/Unit/Http/RequestServiceProviderTest.php b/tests/Unit/Http/RequestServiceProviderTest.php
new file mode 100644
index 00000000..a137b0ac
--- /dev/null
+++ b/tests/Unit/Http/RequestServiceProviderTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Http;
+
+use Engelsystem\Http\Request;
+use Engelsystem\Http\RequestServiceProvider;
+use Engelsystem\Test\Unit\ServiceProviderTest;
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+
+class RequestServiceProviderTest extends ServiceProviderTest
+{
+ /**
+ * @covers \Engelsystem\Http\RequestServiceProvider::register()
+ */
+ public function testRegister()
+ {
+ /** @var MockObject|Request $request */
+ $request = $this->getMockBuilder(Request::class)
+ ->getMock();
+
+ $app = $this->getApp(['call', 'instance']);
+
+ $this->setExpects($app, 'call', [[Request::class, 'createFromGlobals']], $request);
+ $this->setExpects($app, 'instance', ['request', $request]);
+
+ $serviceProvider = new RequestServiceProvider($app);
+ $serviceProvider->register();
+ }
+}
diff --git a/tests/Unit/Http/SessionServiceProviderTest.php b/tests/Unit/Http/SessionServiceProviderTest.php
new file mode 100644
index 00000000..0f17a1af
--- /dev/null
+++ b/tests/Unit/Http/SessionServiceProviderTest.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Http;
+
+use Engelsystem\Http\Request;
+use Engelsystem\Http\SessionServiceProvider;
+use Engelsystem\Test\Unit\ServiceProviderTest;
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
+use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
+use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface as StorageInterface;
+
+class SessionServiceProviderTest extends ServiceProviderTest
+{
+ /**
+ * @covers \Engelsystem\Http\SessionServiceProvider::register()
+ * @covers \Engelsystem\Http\SessionServiceProvider::getSessionStorage()
+ */
+ public function testRegister()
+ {
+ $app = $this->getApp(['make', 'instance', 'bind', 'get']);
+
+ $sessionStorage = $this->getMockForAbstractClass(StorageInterface::class);
+ $sessionStorage2 = $this->getMockForAbstractClass(StorageInterface::class);
+
+ $session = $this->getSessionMock();
+ $request = $this->getRequestMock();
+
+ /** @var MockObject|SessionServiceProvider $serviceProvider */
+ $serviceProvider = $this->getMockBuilder(SessionServiceProvider::class)
+ ->setConstructorArgs([$app])
+ ->setMethods(['isCli'])
+ ->getMock();
+ $serviceProvider->expects($this->exactly(2))
+ ->method('isCli')
+ ->willReturnOnConsecutiveCalls(true, false);
+
+ $app->expects($this->exactly(4))
+ ->method('make')
+ ->withConsecutive(
+ [MockArraySessionStorage::class],
+ [Session::class],
+ [NativeSessionStorage::class, ['options' => ['cookie_httponly' => true]]],
+ [Session::class]
+ )
+ ->willReturnOnConsecutiveCalls(
+ $sessionStorage,
+ $session,
+ $sessionStorage2,
+ $session
+ );
+ $app->expects($this->atLeastOnce())
+ ->method('instance')
+ ->withConsecutive(
+ ['session.storage', $sessionStorage],
+ ['session', $session]
+ );
+
+ $this->setExpects($app, 'bind', [StorageInterface::class, 'session.storage'], null, $this->atLeastOnce());
+ $this->setExpects($app, 'get', ['request'], $request, $this->atLeastOnce());
+ $this->setExpects($request, 'setSession', [$session], null, $this->atLeastOnce());
+ $this->setExpects($session, 'start', null, null, $this->atLeastOnce());
+
+ $serviceProvider->register();
+ $serviceProvider->register();
+ }
+
+ /**
+ * @covers \Engelsystem\Http\SessionServiceProvider::isCli()
+ */
+ public function testIsCli()
+ {
+ $app = $this->getApp(['make', 'instance', 'bind', 'get']);
+
+ $sessionStorage = $this->getMockForAbstractClass(StorageInterface::class);
+
+ $session = $this->getSessionMock();
+ $request = $this->getRequestMock();
+
+ $app->expects($this->exactly(2))
+ ->method('make')
+ ->withConsecutive(
+ [MockArraySessionStorage::class],
+ [Session::class]
+ )
+ ->willReturnOnConsecutiveCalls(
+ $sessionStorage,
+ $session
+ );
+ $app->expects($this->exactly(2))
+ ->method('instance')
+ ->withConsecutive(
+ ['session.storage', $sessionStorage],
+ ['session', $session]
+ );
+
+ $this->setExpects($app, 'bind', [StorageInterface::class, 'session.storage']);
+ $this->setExpects($app, 'get', ['request'], $request);
+ $this->setExpects($request, 'setSession', [$session]);
+ $this->setExpects($session, 'start');
+
+ $serviceProvider = new SessionServiceProvider($app);
+ $serviceProvider->register();
+ }
+
+ /**
+ * @return MockObject
+ */
+ private function getSessionMock()
+ {
+ return $this->getMockBuilder(Session::class)
+ ->setMethods(['start'])
+ ->getMock();
+ }
+
+ /**
+ * @return MockObject
+ */
+ private function getRequestMock()
+ {
+ return $this->getMockBuilder(Request::class)
+ ->setMethods(['setSession'])
+ ->getMock();
+ }
+}