summaryrefslogtreecommitdiff
path: root/tests/Unit/Renderer
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Unit/Renderer')
-rw-r--r--tests/Unit/Renderer/RendererServiceProviderTest.php4
-rw-r--r--tests/Unit/Renderer/Twig/Extensions/ConfigTest.php25
-rw-r--r--tests/Unit/Renderer/Twig/Extensions/ExtensionTest.php84
-rw-r--r--tests/Unit/Renderer/Twig/Extensions/GlobalsTest.php25
-rw-r--r--tests/Unit/Renderer/Twig/Extensions/SessionTest.php25
-rw-r--r--tests/Unit/Renderer/Twig/Extensions/TranslationTest.php60
-rw-r--r--tests/Unit/Renderer/Twig/Extensions/UrlTest.php64
-rw-r--r--tests/Unit/Renderer/TwigEngineTest.php60
-rw-r--r--tests/Unit/Renderer/TwigLoaderTest.php31
-rw-r--r--tests/Unit/Renderer/TwigServiceProviderTest.php155
10 files changed, 532 insertions, 1 deletions
diff --git a/tests/Unit/Renderer/RendererServiceProviderTest.php b/tests/Unit/Renderer/RendererServiceProviderTest.php
index 3826da7e..6cdf4363 100644
--- a/tests/Unit/Renderer/RendererServiceProviderTest.php
+++ b/tests/Unit/Renderer/RendererServiceProviderTest.php
@@ -37,10 +37,12 @@ class RendererServiceProviderTest extends ServiceProviderTest
$htmlEngine
);
- $app->expects($this->exactly(2))
+ $app->expects($this->exactly(4))
->method('instance')
->withConsecutive(
+ [Renderer::class, $renderer],
['renderer', $renderer],
+ [HtmlEngine::class, $htmlEngine],
['renderer.htmlEngine', $htmlEngine]
);
diff --git a/tests/Unit/Renderer/Twig/Extensions/ConfigTest.php b/tests/Unit/Renderer/Twig/Extensions/ConfigTest.php
new file mode 100644
index 00000000..6a9cb78a
--- /dev/null
+++ b/tests/Unit/Renderer/Twig/Extensions/ConfigTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
+
+use Engelsystem\Config\Config as EngelsystemConfig;
+use Engelsystem\Renderer\Twig\Extensions\Config;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class ConfigTest extends ExtensionTest
+{
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Config::__construct
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Config::getFunctions
+ */
+ public function testGetFunctions()
+ {
+ /** @var EngelsystemConfig|MockObject $config */
+ $config = $this->createMock(EngelsystemConfig::class);
+
+ $extension = new Config($config);
+ $functions = $extension->getFunctions();
+
+ $this->assertExtensionExists('config', [$config, 'get'], $functions);
+ }
+}
diff --git a/tests/Unit/Renderer/Twig/Extensions/ExtensionTest.php b/tests/Unit/Renderer/Twig/Extensions/ExtensionTest.php
new file mode 100644
index 00000000..e1c5a378
--- /dev/null
+++ b/tests/Unit/Renderer/Twig/Extensions/ExtensionTest.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
+
+use PHPUnit\Framework\TestCase;
+use Twig_Function as TwigFunction;
+
+abstract class ExtensionTest extends TestCase
+{
+ /**
+ * Assert that a twig filter was registered
+ *
+ * @param string $name
+ * @param callable $callback
+ * @param TwigFunction[] $functions
+ */
+ protected function assertFilterExists($name, $callback, $functions)
+ {
+ foreach ($functions as $function) {
+ if ($function->getName() != $name) {
+ continue;
+ }
+
+ $this->assertEquals($callback, $function->getCallable());
+ return;
+ }
+
+ $this->fail(sprintf('Filter %s not found', $name));
+ }
+
+ /**
+ * Assert that a twig function was registered
+ *
+ * @param string $name
+ * @param callable $callback
+ * @param TwigFunction[] $functions
+ */
+ protected function assertExtensionExists($name, $callback, $functions)
+ {
+ foreach ($functions as $function) {
+ if ($function->getName() != $name) {
+ continue;
+ }
+
+ $this->assertEquals($callback, $function->getCallable());
+ return;
+ }
+
+ $this->fail(sprintf('Function %s not found', $name));
+ }
+
+ /**
+ * Assert that a global exists
+ *
+ * @param string $name
+ * @param mixed $value
+ * @param mixed[] $globals
+ */
+ protected function assertGlobalsExists($name, $value, $globals)
+ {
+ if (isset($globals[$name])) {
+ $this->assertArraySubset([$name => $value], $globals);
+
+ return;
+ }
+
+ $this->fail(sprintf('Global %s not found', $name));
+ }
+
+ /**
+ * Assert that a token parser was set
+ *
+ * @param $tokenParser
+ * @param $tokenParsers
+ */
+ protected function assertTokenParserExists($tokenParser, $tokenParsers)
+ {
+ $this->assertArraySubset(
+ [$tokenParser],
+ $tokenParsers,
+ sprintf('Token parser %s not found', get_class($tokenParser))
+ );
+ }
+}
diff --git a/tests/Unit/Renderer/Twig/Extensions/GlobalsTest.php b/tests/Unit/Renderer/Twig/Extensions/GlobalsTest.php
new file mode 100644
index 00000000..6cc3a4da
--- /dev/null
+++ b/tests/Unit/Renderer/Twig/Extensions/GlobalsTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
+
+use Engelsystem\Renderer\Twig\Extensions\Globals;
+
+class GlobalsTest extends ExtensionTest
+{
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Globals::getGlobals
+ */
+ public function testGetGlobals()
+ {
+ $extension = new Globals();
+ $globals = $extension->getGlobals();
+
+ $this->assertGlobalsExists('user', [], $globals);
+
+ global $user;
+ $user['foo'] = 'bar';
+
+ $globals = $extension->getGlobals();
+ $this->assertGlobalsExists('user', ['foo' => 'bar'], $globals);
+ }
+}
diff --git a/tests/Unit/Renderer/Twig/Extensions/SessionTest.php b/tests/Unit/Renderer/Twig/Extensions/SessionTest.php
new file mode 100644
index 00000000..7ce4dc3a
--- /dev/null
+++ b/tests/Unit/Renderer/Twig/Extensions/SessionTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
+
+use Engelsystem\Renderer\Twig\Extensions\Session;
+use PHPUnit\Framework\MockObject\MockObject;
+use Symfony\Component\HttpFoundation\Session\Session as SymfonySession;
+
+class SessionTest extends ExtensionTest
+{
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Session::__construct
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Session::getFunctions
+ */
+ public function testGetGlobals()
+ {
+ /** @var SymfonySession|MockObject $session */
+ $session = $this->createMock(SymfonySession::class);
+
+ $extension = new Session($session);
+ $functions = $extension->getFunctions();
+
+ $this->assertExtensionExists('session_get', [$session, 'get'], $functions);
+ }
+}
diff --git a/tests/Unit/Renderer/Twig/Extensions/TranslationTest.php b/tests/Unit/Renderer/Twig/Extensions/TranslationTest.php
new file mode 100644
index 00000000..f1548604
--- /dev/null
+++ b/tests/Unit/Renderer/Twig/Extensions/TranslationTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
+
+use Engelsystem\Helpers\Translator;
+use Engelsystem\Renderer\Twig\Extensions\Translation;
+use PHPUnit\Framework\MockObject\MockObject;
+use Twig_Extensions_TokenParser_Trans as TranslationTokenParser;
+
+class TranslationTest extends ExtensionTest
+{
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Translation::__construct
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Translation::getFilters
+ */
+ public function testGeFilters()
+ {
+ /** @var Translator|MockObject $translator */
+ $translator = $this->createMock(Translator::class);
+ /** @var TranslationTokenParser|MockObject $parser */
+ $parser = $this->createMock(TranslationTokenParser::class);
+
+ $extension = new Translation($translator, $parser);
+ $filters = $extension->getFilters();
+
+ $this->assertExtensionExists('trans', [$translator, 'translate'], $filters);
+ }
+
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Translation::getFunctions
+ */
+ public function testGetFunctions()
+ {
+ /** @var Translator|MockObject $translator */
+ $translator = $this->createMock(Translator::class);
+ /** @var TranslationTokenParser|MockObject $parser */
+ $parser = $this->createMock(TranslationTokenParser::class);
+
+ $extension = new Translation($translator, $parser);
+ $functions = $extension->getFunctions();
+
+ $this->assertExtensionExists('__', [$translator, 'translate'], $functions);
+ }
+
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Translation::getTokenParsers
+ */
+ public function testGetTokenParsers()
+ {
+ /** @var Translator|MockObject $translator */
+ $translator = $this->createMock(Translator::class);
+ /** @var TranslationTokenParser|MockObject $parser */
+ $parser = $this->createMock(TranslationTokenParser::class);
+
+ $extension = new Translation($translator, $parser);
+ $tokenParsers = $extension->getTokenParsers();
+
+ $this->assertTokenParserExists($parser, $tokenParsers);
+ }
+}
diff --git a/tests/Unit/Renderer/Twig/Extensions/UrlTest.php b/tests/Unit/Renderer/Twig/Extensions/UrlTest.php
new file mode 100644
index 00000000..c7e40bea
--- /dev/null
+++ b/tests/Unit/Renderer/Twig/Extensions/UrlTest.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
+
+use Engelsystem\Http\UrlGenerator;
+use Engelsystem\Renderer\Twig\Extensions\Url;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class UrlTest extends ExtensionTest
+{
+ /**
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Url::__construct
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Url::getFunctions
+ */
+ public function testGetGlobals()
+ {
+ /** @var UrlGenerator|MockObject $urlGenerator */
+ $urlGenerator = $this->createMock(UrlGenerator::class);
+
+ $extension = new Url($urlGenerator);
+ $functions = $extension->getFunctions();
+
+ $this->assertExtensionExists('url', [$extension, 'getUrl'], $functions);
+ }
+
+ /**
+ * @return string[][]
+ */
+ public function getUrls()
+ {
+ return [
+ ['/', '/', 'http://foo.bar/'],
+ ['/foo', '/foo', 'http://foo.bar/foo'],
+ ['foo_bar', 'foo-bar', 'http://foo.bar/foo-bar'],
+ ['dolor', 'dolor', 'http://foo.bar/dolor?lorem_ipsum=dolor', ['lorem_ipsum' => 'dolor']],
+ ];
+ }
+
+ /**
+ * @dataProvider getUrls
+ *
+ * @param string $url
+ * @param string $return
+ * @param string $urlTo
+ * @param array $parameters
+ *
+ * @covers \Engelsystem\Renderer\Twig\Extensions\Url::getUrl
+ */
+ public function testGetUrl($url, $urlTo, $return, $parameters = [])
+ {
+ /** @var UrlGenerator|MockObject $urlGenerator */
+ $urlGenerator = $this->createMock(UrlGenerator::class);
+
+ $urlGenerator->expects($this->once())
+ ->method('to')
+ ->with($urlTo, $parameters)
+ ->willReturn($return);
+
+ $extension = new Url($urlGenerator);
+ $generatedUrl = $extension->getUrl($url, $parameters);
+
+ $this->assertEquals($return, $generatedUrl);
+ }
+}
diff --git a/tests/Unit/Renderer/TwigEngineTest.php b/tests/Unit/Renderer/TwigEngineTest.php
new file mode 100644
index 00000000..9d0618f1
--- /dev/null
+++ b/tests/Unit/Renderer/TwigEngineTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer;
+
+use Engelsystem\Renderer\TwigEngine;
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
+use Twig_Environment as Twig;
+use Twig_LoaderInterface as LoaderInterface;
+
+class TwigEngineTest extends TestCase
+{
+ /**
+ * @covers \Engelsystem\Renderer\TwigEngine::__construct
+ * @covers \Engelsystem\Renderer\TwigEngine::get
+ */
+ public function testGet()
+ {
+ /** @var Twig|MockObject $twig */
+ $twig = $this->createMock(Twig::class);
+
+ $path = 'foo.twig';
+ $data = ['lorem' => 'ipsum'];
+
+ $twig->expects($this->once())
+ ->method('render')
+ ->with($path, $data)
+ ->willReturn('LoremIpsum!');
+
+ $engine = new TwigEngine($twig);
+ $return = $engine->get($path, $data);
+ $this->assertEquals('LoremIpsum!', $return);
+ }
+
+
+ /**
+ * @covers \Engelsystem\Renderer\TwigEngine::canRender
+ */
+ public function testCanRender()
+ {
+ /** @var Twig|MockObject $twig */
+ $twig = $this->createMock(Twig::class);
+ /** @var LoaderInterface|MockObject $loader */
+ $loader = $this->getMockForAbstractClass(LoaderInterface::class);
+
+ $path = 'foo.twig';
+
+ $twig->expects($this->once())
+ ->method('getLoader')
+ ->willReturn($loader);
+ $loader->expects($this->once())
+ ->method('exists')
+ ->with($path)
+ ->willReturn(true);
+
+ $engine = new TwigEngine($twig);
+ $return = $engine->canRender($path);
+ $this->assertTrue($return);
+ }
+}
diff --git a/tests/Unit/Renderer/TwigLoaderTest.php b/tests/Unit/Renderer/TwigLoaderTest.php
new file mode 100644
index 00000000..e6867643
--- /dev/null
+++ b/tests/Unit/Renderer/TwigLoaderTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer;
+
+use Engelsystem\Renderer\TwigLoader;
+use PHPUnit\Framework\TestCase;
+use ReflectionClass as Reflection;
+
+class TwigLoaderTest extends TestCase
+{
+ /**
+ * @covers \Engelsystem\Renderer\TwigLoader::findTemplate
+ */
+ public function testFindTemplate()
+ {
+ $loader = new TwigLoader();
+
+ $reflection = new Reflection(get_class($loader));
+ $property = $reflection->getProperty('cache');
+ $property->setAccessible(true);
+
+ $realPath = __DIR__ . '/Stub/foo.twig';
+ $property->setValue($loader, ['Stub/foo.twig' => $realPath]);
+
+ $return = $loader->findTemplate('Stub/foo.twig');
+ $this->assertEquals($realPath, $return);
+
+ $return = $loader->findTemplate('Stub/foo');
+ $this->assertEquals($realPath, $return);
+ }
+}
diff --git a/tests/Unit/Renderer/TwigServiceProviderTest.php b/tests/Unit/Renderer/TwigServiceProviderTest.php
new file mode 100644
index 00000000..3cd0da4d
--- /dev/null
+++ b/tests/Unit/Renderer/TwigServiceProviderTest.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace Engelsystem\Test\Unit\Renderer;
+
+use Engelsystem\Renderer\TwigEngine;
+use Engelsystem\Renderer\TwigLoader;
+use Engelsystem\Renderer\TwigServiceProvider;
+use Engelsystem\Test\Unit\ServiceProviderTest;
+use PHPUnit\Framework\MockObject\MockObject;
+use ReflectionClass as Reflection;
+use stdClass;
+use Twig_Environment as Twig;
+use Twig_ExtensionInterface as ExtensionInterface;
+use Twig_LoaderInterface as TwigLoaderInterface;
+
+class TwigServiceProviderTest extends ServiceProviderTest
+{
+ /**
+ * @covers \Engelsystem\Renderer\TwigServiceProvider::register
+ * @covers \Engelsystem\Renderer\TwigServiceProvider::registerTwigExtensions
+ */
+ public function testRegister()
+ {
+ $app = $this->getApp(['make', 'instance', 'tag']);
+ $class = $this->createMock(stdClass::class);
+
+ $className = 'Foo\Bar\Class';
+ $classAlias = 'twig.extension.foo';
+
+ $app->expects($this->once())
+ ->method('make')
+ ->with('Foo\Bar\Class')
+ ->willReturn($class);
+
+ $app->expects($this->exactly(2))
+ ->method('instance')
+ ->withConsecutive(
+ [$className, $class],
+ [$classAlias, $class]
+ );
+
+ $app->expects($this->once())
+ ->method('tag')
+ ->with($classAlias, ['twig.extension']);
+
+ /** @var TwigServiceProvider|MockObject $serviceProvider */
+ $serviceProvider = $this->getMockBuilder(TwigServiceProvider::class)
+ ->setConstructorArgs([$app])
+ ->setMethods(['registerTwigEngine'])
+ ->getMock();
+ $serviceProvider->expects($this->once())
+ ->method('registerTwigEngine');
+ $this->setExtensionsTo($serviceProvider, ['foo' => 'Foo\Bar\Class']);
+
+ $serviceProvider->register();
+ }
+
+ /**
+ * @covers \Engelsystem\Renderer\TwigServiceProvider::boot
+ */
+ public function testBoot()
+ {
+ /** @var Twig|MockObject $twig */
+ $twig = $this->createMock(Twig::class);
+ /** @var ExtensionInterface|MockObject $firsExtension */
+ $firsExtension = $this->getMockForAbstractClass(ExtensionInterface::class);
+ /** @var ExtensionInterface|MockObject $secondExtension */
+ $secondExtension = $this->getMockForAbstractClass(ExtensionInterface::class);
+
+ $app = $this->getApp(['get', 'tagged']);
+
+ $app->expects($this->once())
+ ->method('get')
+ ->with('twig.environment')
+ ->willReturn($twig);
+ $app->expects($this->once())
+ ->method('tagged')
+ ->with('twig.extension')
+ ->willReturn([$firsExtension, $secondExtension]);
+
+ $twig->expects($this->exactly(2))
+ ->method('addExtension')
+ ->withConsecutive($firsExtension, $secondExtension);
+
+ $serviceProvider = new TwigServiceProvider($app);
+ $serviceProvider->boot();
+ }
+
+ /**
+ * @covers \Engelsystem\Renderer\TwigServiceProvider::registerTwigEngine
+ */
+ public function testRegisterTWigEngine()
+ {
+ /** @var TwigEngine|MockObject $htmlEngine */
+ $twigEngine = $this->createMock(TwigEngine::class);
+ /** @var TwigLoader|MockObject $twigLoader */
+ $twigLoader = $this->createMock(TwigLoader::class);
+ /** @var Twig|MockObject $twig */
+ $twig = $this->createMock(Twig::class);
+
+ $app = $this->getApp(['make', 'instance', 'tag', 'get']);
+
+ $viewsPath = __DIR__ . '/Stub';
+
+ $app->expects($this->exactly(3))
+ ->method('make')
+ ->withConsecutive(
+ [TwigLoader::class, ['paths' => $viewsPath]],
+ [Twig::class],
+ [TwigEngine::class]
+ )->willReturnOnConsecutiveCalls(
+ $twigLoader,
+ $twig,
+ $twigEngine
+ );
+
+ $app->expects($this->exactly(6))
+ ->method('instance')
+ ->withConsecutive(
+ [TwigLoader::class, $twigLoader],
+ [TwigLoaderInterface::class, $twigLoader],
+ ['twig.loader', $twigLoader],
+ [Twig::class, $twig],
+ ['twig.environment', $twig],
+ ['renderer.twigEngine', $twigEngine]
+ );
+
+ $app->expects($this->once())
+ ->method('get')
+ ->with('path.views')
+ ->willReturn($viewsPath);
+
+ $this->setExpects($app, 'tag', ['renderer.twigEngine', ['renderer.engine']]);
+
+ $serviceProvider = new TwigServiceProvider($app);
+ $this->setExtensionsTo($serviceProvider, []);
+
+ $serviceProvider->register();
+ }
+
+ /**
+ * @param TwigServiceProvider $serviceProvider
+ * @param array $extensions
+ * @throws \ReflectionException
+ */
+ protected function setExtensionsTo($serviceProvider, $extensions)
+ {
+ $reflection = new Reflection(get_class($serviceProvider));
+
+ $property = $reflection->getProperty('extensions');
+ $property->setAccessible(true);
+
+ $property->setValue($serviceProvider, $extensions);
+ }
+}