diff options
Diffstat (limited to 'tests/Unit/Renderer')
-rw-r--r-- | tests/Unit/Renderer/RendererServiceProviderTest.php | 4 | ||||
-rw-r--r-- | tests/Unit/Renderer/Twig/Extensions/ConfigTest.php | 25 | ||||
-rw-r--r-- | tests/Unit/Renderer/Twig/Extensions/ExtensionTest.php | 84 | ||||
-rw-r--r-- | tests/Unit/Renderer/Twig/Extensions/GlobalsTest.php | 25 | ||||
-rw-r--r-- | tests/Unit/Renderer/Twig/Extensions/SessionTest.php | 25 | ||||
-rw-r--r-- | tests/Unit/Renderer/Twig/Extensions/TranslationTest.php | 60 | ||||
-rw-r--r-- | tests/Unit/Renderer/Twig/Extensions/UrlTest.php | 64 | ||||
-rw-r--r-- | tests/Unit/Renderer/TwigEngineTest.php | 60 | ||||
-rw-r--r-- | tests/Unit/Renderer/TwigLoaderTest.php | 31 | ||||
-rw-r--r-- | tests/Unit/Renderer/TwigServiceProviderTest.php | 155 |
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); + } +} |