* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use Fig\Link\Link; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\CsrfServiceProvider; use Silex\Provider\FormServiceProvider; use Silex\Provider\TwigServiceProvider; use Silex\Provider\AssetServiceProvider; use Symfony\Component\HttpFoundation\Request; /** * TwigProvider test cases. * * @author Igor Wiedler */ class TwigServiceProviderTest extends TestCase { public function testRegisterAndRender() { $app = new Application(); $app->register(new TwigServiceProvider(), [ 'twig.templates' => ['hello' => 'Hello {{ name }}!'], ]); $app->get('/hello/{name}', function ($name) use ($app) { return $app['twig']->render('hello', ['name' => $name]); }); $request = Request::create('/hello/john'); $response = $app->handle($request); $this->assertEquals('Hello john!', $response->getContent()); } public function testLoaderPriority() { $app = new Application(); $app->register(new TwigServiceProvider(), [ 'twig.templates' => ['foo' => 'foo'], ]); $loader = $this->getMockBuilder('\Twig_LoaderInterface')->getMock(); if (method_exists('\Twig_LoaderInterface', 'getSourceContext')) { $loader->expects($this->never())->method('getSourceContext'); } $app['twig.loader.filesystem'] = function ($app) use ($loader) { return $loader; }; $this->assertEquals('foo', $app['twig.loader']->getSourceContext('foo')->getCode()); } public function testHttpFoundationIntegration() { $app = new Application(); $app['request_stack']->push(Request::create('/dir1/dir2/file')); $app->register(new TwigServiceProvider(), [ 'twig.templates' => [ 'absolute' => '{{ absolute_url("foo.css") }}', 'relative' => '{{ relative_path("/dir1/foo.css") }}', ], ]); $this->assertEquals('http://localhost/dir1/dir2/foo.css', $app['twig']->render('absolute')); $this->assertEquals('../foo.css', $app['twig']->render('relative')); } public function testAssetIntegration() { $app = new Application(); $app->register(new TwigServiceProvider(), [ 'twig.templates' => ['hello' => '{{ asset("/foo.css") }}'], ]); $app->register(new AssetServiceProvider(), [ 'assets.version' => 1, ]); $this->assertEquals('/foo.css?1', $app['twig']->render('hello')); } public function testGlobalVariable() { $app = new Application(); $app['request_stack']->push(Request::create('/?name=Fabien')); $app->register(new TwigServiceProvider(), [ 'twig.templates' => ['hello' => '{{ global.request.get("name") }}'], ]); $this->assertEquals('Fabien', $app['twig']->render('hello')); } public function testFormFactory() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new CsrfServiceProvider()); $app->register(new TwigServiceProvider()); $this->assertInstanceOf('\Twig\Environment', $app['twig']); $this->assertInstanceOf('Symfony\Bridge\Twig\Form\TwigRendererEngine', $app['twig.form.engine']); $this->assertInstanceOf('Symfony\Component\Form\FormRenderer', $app['twig.form.renderer']); } public function testFormWithoutCsrf() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new TwigServiceProvider()); $this->assertInstanceOf('\Twig\Environment', $app['twig']); } public function testFormatParameters() { $app = new Application(); $timezone = new \DateTimeZone('Europe/Paris'); $app->register(new TwigServiceProvider(), [ 'twig.date.format' => 'Y-m-d', 'twig.date.interval_format' => '%h hours', 'twig.date.timezone' => $timezone, 'twig.number_format.decimals' => 2, 'twig.number_format.decimal_point' => ',', 'twig.number_format.thousands_separator' => ' ', ]); $twig = $app['twig']; $this->assertSame(['Y-m-d', '%h hours'], $twig->getExtension('Twig_Extension_Core')->getDateFormat()); $this->assertSame($timezone, $twig->getExtension('Twig_Extension_Core')->getTimezone()); $this->assertSame([2, ',', ' '], $twig->getExtension('Twig_Extension_Core')->getNumberFormat()); } public function testWebLinkIntegration() { $app = new Application(); $app['request_stack']->push($request = Request::create('/')); $app->register(new TwigServiceProvider(), [ 'twig.templates' => [ 'preload' => '{{ preload("/foo.css") }}', ], ]); $this->assertEquals('/foo.css', $app['twig']->render('preload')); $link = new Link('preload', '/foo.css'); $this->assertEquals([$link], array_values($request->attributes->get('_links')->getLinks())); } }