Skip to content
Snippets Groups Projects
Unverified Commit 02280173 authored by Thomas Flori's avatar Thomas Flori
Browse files

test view helpers

parent 87ff4a31
No related branches found
No related tags found
No related merge requests found
......@@ -2,7 +2,7 @@
namespace Syna;
use Syna\ViewHelper\CallableHelper;
use Syna\ViewHelper\CallableViewHelper;
class HelperLocator
{
......@@ -86,12 +86,7 @@ class HelperLocator
*/
public function add(string $name, $helper)
{
if (is_callable($helper)) {
$this->map[$name] = $helper;
return $this;
}
if (is_string($helper) && class_exists($helper)) {
if (is_callable($helper) || is_string($helper) && class_exists($helper)) {
$this->map[$name] = $helper;
return $this;
}
......@@ -129,7 +124,7 @@ class HelperLocator
/**
* Get a helper for $name
*
* Creates CallableHelper for callback helpers and instantiates classes.
* Creates CallableViewHelper for callback helpers and instantiates classes.
*
* @param string $name
* @return ViewHelperInterface
......@@ -144,7 +139,7 @@ class HelperLocator
$found = !isset($this->map[$name]);
$helper = $this->map[$name] ?? $this->found[$name];
if (is_callable($helper) && !$helper instanceof ViewHelperInterface) {
$helper = new CallableHelper($this->map[$name]);
$helper = new CallableViewHelper($this->map[$name]);
$found ? $this->found[$name] = $helper : $this->map[$name] = $helper;
} elseif (is_string($helper)) {
$helper = call_user_func($this->resolver, $helper);
......
......@@ -3,21 +3,20 @@
namespace Syna\ViewHelper;
/**
* Class CallableHelper
* Class CallableViewHelper
*
* @package Syna\ViewHelper
* @author Thomas Flori <thflori@gmail.com>
* @codeCoverageIgnore Just a wrapper
*/
class CallableHelper extends AbstractViewHelper
class CallableViewHelper extends AbstractViewHelper
{
/** @var callable */
protected $callable;
public function __construct(callable $callable)
public function __construct(callable $callable, bool $bind = true)
{
$this->callable = $callable;
if ($callable instanceof \Closure) {
if ($bind && $callable instanceof \Closure) {
$this->callable = \Closure::bind($callable, $this, self::class);
}
}
......
......@@ -26,7 +26,7 @@ class Element extends AbstractViewHelper
if (count($attributes)) {
$renderedAttributes = [];
foreach ($attributes as $attribute => $value) {
$renderedAttributes[] = $attribute . '="' . $this->view->escape($value) . '"';
$renderedAttributes[] = $attribute . '="' . $this->escape($value) . '"';
}
$tagContent = ' ' . implode(' ', $renderedAttributes);
}
......
......@@ -7,7 +7,7 @@ use Mockery as m;
use Syna\HelperLocator;
use Syna\NotFound;
use Syna\View;
use Syna\ViewHelper\CallableHelper;
use Syna\ViewHelper\CallableViewHelper;
use Syna\ViewLocator;
/**
......@@ -101,7 +101,7 @@ class FactoryTest extends TestCase
$helperLocator->shouldReceive('has')->with('helperName')
->once()->ordered()->andReturn(true);
$helperLocator->shouldReceive('getHelper')->with('helperName')
->once()->ordered()->andReturn(new CallableHelper('strtoupper'));
->once()->ordered()->andReturn(new CallableViewHelper('strtoupper'));
$result = $factory->helper($view, 'helperName', 'argument1');
......
......@@ -7,7 +7,7 @@ use Syna\NotFound;
use Syna\Test\Examples;
use Syna\Test\Examples\DateTimeFormat;
use Syna\Test\TestCase;
use Syna\ViewHelper\CallableHelper;
use Syna\ViewHelper\CallableViewHelper;
use Syna\ViewHelper\Element;
use Syna\ViewHelperInterface;
......@@ -47,14 +47,14 @@ class LocatingHelpersTest extends TestCase
$locator->add('lower', 'strtolower');
self::assertInstanceOf(CallableHelper::class, $locator->getHelper('lower'));
self::assertInstanceOf(CallableViewHelper::class, $locator->getHelper('lower'));
}
/** @test */
public function defineViewHelperInstancesAsHelper()
{
$locator = new HelperLocator();
$helper = new CallableHelper(function ($format, $dateTime) {
$helper = new CallableViewHelper(function ($format, $dateTime) {
return $dateTime instanceof \DateTime ? $dateTime->format($format) : date($format, strtotime($dateTime));
});
......
......@@ -3,6 +3,8 @@
namespace Syna\Test;
use Mockery\Adapter\Phpunit\MockeryTestCase;
use Syna\Factory;
use Syna\ViewLocator;
class TestCase extends MockeryTestCase
{
......@@ -17,6 +19,13 @@ class TestCase extends MockeryTestCase
mkdir($this->templatePath);
}
protected function createView(string $name = 'test', string $content = '')
{
$this->createTemplate($name . '.php', $content);
$factory = new Factory(new ViewLocator($this->templatePath));
return $factory->view($name);
}
protected function createTemplate(string $path, string $content): string
{
$path = $this->templatePath . DIRECTORY_SEPARATOR . $path;
......
<?php
namespace Syna\Test\ViewHelper;
use Syna\Test\TestCase;
use Syna\ViewHelper\CallableViewHelper;
use Mockery as m;
class CallableViewHelperTest extends TestCase
{
/** @test */
public function executesTheCallableWithAllArguments()
{
$spy = m::mock(new m\ClosureWrapper(function () {
}));
$viewHelper = new CallableViewHelper($spy);
$viewHelper('a', 'b', 'c');
$spy->shouldHaveBeenCalled()->with('a', 'b', 'c')->once();
}
/** @test */
public function bindsClosures()
{
$viewHelper = new CallableViewHelper(function () {
return get_class($this);
});
$result = $viewHelper();
self::assertSame(CallableViewHelper::class, $result);
}
/** @test */
public function avoidBindingWithOptionalArgument()
{
$viewHelper = new CallableViewHelper(function () {
return get_class($this);
}, false);
$result = $viewHelper();
self::assertSame(self::class, $result);
}
}
<?php
namespace Syna\Test\ViewHelper;
use Syna\Factory;
use Syna\Test\TestCase;
use Syna\View;
use Syna\ViewHelper\Element;
use Syna\ViewLocator;
class ElementTest extends TestCase
{
/** @test */
public function createsEmptyElement()
{
$viewHelper = new Element();
$element = $viewHelper('br');
self::assertSame('<br />', $element);
}
/** @test */
public function addsAttributesToElements()
{
$viewHelper = new Element();
$viewHelper->setView($this->createView());
$element = $viewHelper('input', [
'name' => 'test',
'value' => 'foo bar'
]);
self::assertSame('<input name="test" value="foo bar" />', $element);
}
/** @test */
public function escapesContentByDefault()
{
$viewHelper = new Element();
$viewHelper->setView($this->createView());
$element = $viewHelper('textarea', [], '<!DOCTYPE html>');
self::assertSame('<textarea>&lt;!DOCTYPE html&gt;</textarea>', $element);
}
}
<?php
namespace Syna\Test\ViewHelper;
use Syna\Test\TestCase;
use Syna\ViewHelper\VarDump;
class VarDumpTest extends TestCase
{
/** @test */
public function usesVarExportToDumpVariables()
{
$viewHelper = new VarDump();
$var = ['foo' => 'bar'];
$result = $viewHelper($var, false);
self::assertContains(var_export($var, true), $result);
}
/** @test */
public function highlightsUsingHighlightString()
{
$viewHelper = new VarDump();
$var = ['foo' => 'bar'];
$result = $viewHelper($var, true);
self::assertContains('<code><span style="color: #000000">', $result);
self::assertContains('</span>' . PHP_EOL . '</code>', $result);
}
/** @test */
public function surroundsOutputWithPre()
{
$viewHelper = new VarDump();
$var = ['foo' => 'bar'];
$result = $viewHelper($var, false);
self::assertStringStartsWith('<pre>', $result);
self::assertStringEndsWith('</pre>', $result);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment