engelsystem/tests/Unit/Renderer/TwigServiceProviderTest.php

204 lines
6.9 KiB
PHP
Raw Permalink Normal View History

<?php
declare(strict_types=1);
namespace Engelsystem\Test\Unit\Renderer;
2018-09-02 02:09:56 +02:00
use Engelsystem\Config\Config;
use Engelsystem\Renderer\Twig\Extensions\Develop;
use Engelsystem\Renderer\TwigEngine;
use Engelsystem\Renderer\TwigLoader;
use Engelsystem\Renderer\TwigServiceProvider;
use Engelsystem\Test\Unit\ServiceProviderTest;
use PHPUnit\Framework\MockObject\MockObject;
2018-08-26 12:23:47 +02:00
use ReflectionClass as Reflection;
use ReflectionException;
2018-08-26 12:23:47 +02:00
use stdClass;
use Symfony\Component\VarDumper\VarDumper;
use Twig\Environment as Twig;
use Twig\Extension\AbstractExtension;
use Twig\Extension\CoreExtension as TwigCore;
use Twig\Extension\ExtensionInterface as ExtensionInterface;
use Twig\Loader\LoaderInterface as TwigLoaderInterface;
class TwigServiceProviderTest extends ServiceProviderTest
{
/**
* @covers \Engelsystem\Renderer\TwigServiceProvider::register
2018-08-26 12:23:47 +02:00
* @covers \Engelsystem\Renderer\TwigServiceProvider::registerTwigExtensions
*/
public function testRegister(): void
2018-08-26 12:23:47 +02:00
{
$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])
->onlyMethods(['registerTwigEngine'])
2018-08-26 12:23:47 +02:00
->getMock();
$serviceProvider->expects($this->once())
->method('registerTwigEngine');
$this->setExtensionsTo($serviceProvider, ['foo' => 'Foo\Bar\Class']);
$serviceProvider->register();
}
/**
* @covers \Engelsystem\Renderer\TwigServiceProvider::boot
*/
public function testBoot(): void
2018-08-26 12:23:47 +02:00
{
/** @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);
/** @var Develop|MockObject $devExtension */
$devExtension = $this->createMock(Develop::class);
/** @var VarDumper|MockObject $dumper */
$dumper = $this->createMock(VarDumper::class);
2018-08-26 12:23:47 +02:00
$app = $this->getApp(['get', 'tagged', 'make']);
2018-08-26 12:23:47 +02:00
$app->expects($this->exactly(2))
2018-08-26 12:23:47 +02:00
->method('get')
->withConsecutive(['twig.environment'], ['twig.extension.develop'])
->willReturnOnConsecutiveCalls($twig, $devExtension);
2018-08-26 12:23:47 +02:00
$app->expects($this->once())
->method('tagged')
->with('twig.extension')
->willReturn([$firsExtension, $secondExtension]);
$app->expects($this->once())
->method('make')
->with(VarDumper::class)
->willReturn($dumper);
2018-08-26 12:23:47 +02:00
$twig->expects($this->exactly(2))
->method('addExtension')
2019-09-17 22:16:53 +02:00
->withConsecutive([$firsExtension], [$secondExtension]);
2018-08-26 12:23:47 +02:00
$devExtension->expects($this->once())
->method('setDumper')
->with($dumper);
2018-08-26 12:23:47 +02:00
$serviceProvider = new TwigServiceProvider($app);
$serviceProvider->boot();
}
/**
* @covers \Engelsystem\Renderer\TwigServiceProvider::registerTwigEngine
*/
public function testRegisterTwigEngine(): void
{
/** @var TwigEngine|MockObject $twigEngine */
$twigEngine = $this->createMock(TwigEngine::class);
/** @var TwigLoader|MockObject $twigLoader */
$twigLoader = $this->createMock(TwigLoader::class);
/** @var Twig|MockObject $twig */
$twig = $this->createMock(Twig::class);
2018-09-02 02:09:56 +02:00
/** @var Config|MockObject $config */
$config = $this->createMock(Config::class);
/** @var TwigCore|MockObject $twigCore */
$twigCore = $this->getMockForAbstractClass(
AbstractExtension::class,
[],
'',
true,
true,
true,
['setTimezone']
);
$app = $this->getApp(['make', 'instance', 'tag', 'get']);
$viewsPath = __DIR__ . '/Stub';
$app->expects($this->exactly(3))
->method('make')
->withConsecutive(
[TwigLoader::class, ['paths' => $viewsPath]],
2023-01-18 13:02:11 +01:00
[Twig::class, ['options' => [
'cache' => false,
'auto_reload' => true,
'strict_variables' => true,
'debug' => true,
]]],
[TwigEngine::class]
)->willReturnOnConsecutiveCalls(
$twigLoader,
$twig,
$twigEngine
);
2018-08-26 12:23:47 +02:00
$app->expects($this->exactly(6))
->method('instance')
->withConsecutive(
[TwigLoader::class, $twigLoader],
[TwigLoaderInterface::class, $twigLoader],
2018-08-26 12:23:47 +02:00
['twig.loader', $twigLoader],
[Twig::class, $twig],
2018-08-26 12:23:47 +02:00
['twig.environment', $twig],
['renderer.twigEngine', $twigEngine]
);
$app->expects($this->exactly(3))
->method('get')
->withConsecutive(['path.views'], ['config'], ['path.cache.views'])
->willReturnOnConsecutiveCalls($viewsPath, $config, 'cache/views');
$this->setExpects($app, 'tag', ['renderer.twigEngine', ['renderer.engine']]);
2023-01-18 13:02:11 +01:00
$config->expects($this->exactly(2))
2018-09-02 02:09:56 +02:00
->method('get')
2023-01-18 13:02:11 +01:00
->withConsecutive(['environment'], ['timezone'])
->willReturnOnConsecutiveCalls('development', 'The/World');
2018-09-02 02:09:56 +02:00
$twig->expects($this->once())
->method('getExtension')
->with(TwigCore::class)
->willReturn($twigCore);
$twigCore->expects($this->once())
->method('setTimezone')
->with('The/World');
$serviceProvider = new TwigServiceProvider($app);
2018-08-26 12:23:47 +02:00
$this->setExtensionsTo($serviceProvider, []);
$serviceProvider->register();
}
2018-08-26 12:23:47 +02:00
/**
* @throws ReflectionException
2018-08-26 12:23:47 +02:00
*/
protected function setExtensionsTo(TwigServiceProvider $serviceProvider, array $extensions): void
2018-08-26 12:23:47 +02:00
{
$reflection = new Reflection(get_class($serviceProvider));
$property = $reflection->getProperty('extensions');
$property->setValue($serviceProvider, $extensions);
}
}