Skip to content

Commit

Permalink
DataHandler validators, code coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
TomK committed Jan 31, 2019
1 parent c6fc190 commit 4d21d0c
Show file tree
Hide file tree
Showing 10 changed files with 105 additions and 42 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"require": {
"php": ">=7.1",
"packaged/glimpse": "^2.2",
"packaged/ui": "^0.1"
"packaged/ui": "^0.1",
"packaged/validate": "^2.0"
},
"require-dev": {
"phpunit/phpunit": "7.5.*"
Expand Down
4 changes: 3 additions & 1 deletion src/Csrf/CsrfDataHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
namespace PackagedUi\Form\Csrf;

use Packaged\Glimpse\Tags\Form\Input;
use Packaged\Validate\ValidationException;
use PackagedUi\Form\DataHandlers\AbstractDataHandler;
use PackagedUi\Form\Decorators\InputDecorator;
use PackagedUi\Form\Decorators\Interfaces\DataHandlerDecorator;
Expand Down Expand Up @@ -82,8 +83,9 @@ public function validateValue($value)
{
if(!password_verify($this->_generatePassword(), $value))
{
throw new \InvalidArgumentException(self::ERR_INVALID);
throw new ValidationException(self::ERR_INVALID);
}
parent::validateValue($value);
}

protected function _defaultDecorator(): DataHandlerDecorator
Expand Down
75 changes: 62 additions & 13 deletions src/DataHandlers/AbstractDataHandler.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php
namespace PackagedUi\Form\DataHandlers;

use Packaged\Validate\IValidator;
use PackagedUi\Form\DataHandlers\Interfaces\DataHandler;
use PackagedUi\Form\Decorators\InputDecorator;
use PackagedUi\Form\Decorators\Interfaces\DataHandlerDecorator;
Expand All @@ -9,13 +10,24 @@ abstract class AbstractDataHandler implements DataHandler
{
protected $_name;
protected $_value;
/** @var DataHandlerDecorator */
protected $_decorator;

protected $_label;
protected $_placeholder;
protected $_defaultValue;

/** @var DataHandlerDecorator */
protected $_decorator;

/**
* @var IValidator[]
*/
protected $_validators = [];

private $_isValidatorSetUp = false;

protected function _setupValidator()
{
}

/**
* @return string
*/
Expand Down Expand Up @@ -66,6 +78,34 @@ public function setValueFormatted($value)
return $this;
}

/**
* @param IValidator $validator
*
* @return $this
*/
public function addValidator(IValidator $validator)
{
$this->_validators[] = $validator;
return $this;
}

public function clearValidators()
{
$this->_validators = [];
$this->_setupValidator();
return $this;
}

/**
* Validate the currently set value
*
* @return bool
*/
public function isValid(): bool
{
return $this->isValidValue($this->getValue());
}

/**
* Validate a value against the current data handler
*
Expand All @@ -86,23 +126,32 @@ public function isValidValue($value): bool
return true;
}

/**
* Validate the currently set value
*
* @return bool
*/
public function isValid(): bool
{
return $this->isValidValue($this->getValue());
}

public function validate()
{
$this->validateValue($this->getValue());
}

/**
* Validate the data, throwing an exception with the error
*
* @param $value
*
* @throws \Exception
*/
public function validateValue($value)
{
if(!$this->_isValidatorSetUp)
{
$this->_setupValidator();
}

if($this->_validators)
{
foreach($this->_validators as $validator)
{
$validator->assert($value);
}
}
}

public function formatValue($value)
Expand Down
7 changes: 0 additions & 7 deletions src/Decorators/AbstractDataHandlerDecorator.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,13 @@ abstract class AbstractDataHandlerDecorator extends AbstractDecorator implements
* @var DataHandler
*/
protected $_handler;
protected $_options;

public function setHandler(DataHandler $handler)
{
$this->_handler = $handler;
return $this;
}

public function setOptions(array $options)
{
$this->_options = $options;
return $this;
}

abstract protected function _getInput(): HtmlTag;

protected function _getLabel(): ?HtmlTag
Expand Down
4 changes: 2 additions & 2 deletions src/Decorators/AbstractDecorator.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ public function getId(): ?string
*/
public function setId($id)
{
$this->setAttribute('id', $id);
$this->addAttribute('id', $id);
return $this;
}

public function setAttribute($name, $value)
public function addAttribute($name, $value)
{
$this->_attributes[$name] = $value;
return $this;
Expand Down
7 changes: 0 additions & 7 deletions src/Decorators/Interfaces/DataHandlerDecorator.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,4 @@ interface DataHandlerDecorator extends Decorator
* @return $this
*/
public function setHandler(DataHandler $handler);

/**
* @param array $options
*
* @return $this
*/
public function setOptions(array $options);
}
2 changes: 1 addition & 1 deletion src/Decorators/Interfaces/Decorator.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function setId($id);
*
* @return $this
*/
public function setAttribute($name, $value);
public function addAttribute($name, $value);

/**
* @param string $name
Expand Down
2 changes: 1 addition & 1 deletion tests/Csrf/CsrfFormTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public function testCsrfToken()

$form = new CsrfForm($secret);
$form->csrfToken->setValue('invalidToken');
$this->assertNotTrue($form->csrfToken->isValid());
$this->assertFalse($form->csrfToken->isValid());
}

public function testRender()
Expand Down
31 changes: 27 additions & 4 deletions tests/FormTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

namespace PackagedUi\Tests\Form;

use Packaged\Validate\Validators\StringValidator;
use PackagedUi\Form\DataHandlers\TextDataHandler;
use PackagedUi\Tests\Form\Supporting\DataHandlers\TestIntegerDataHandler;
use PackagedUi\Tests\Form\Supporting\TestForm;
use PHPUnit\Framework\TestCase;

Expand All @@ -30,7 +30,13 @@ public function testProperties()
$this->assertIsArray($form->getErrors());
$this->assertArrayHasKey('number', $form->getErrors());

$this->expectExceptionMessage(TestIntegerDataHandler::ERR_INVALID_NUMBER);
$form->number->setValue(1);
$form->number->addValidator(new StringValidator(3, 10));
$this->assertFalse($form->isValid());

$form->number->setValue('abcd');
$form->number->clearValidators();
$this->expectExceptionMessage('must be a number');
$form->validate();
}

Expand All @@ -47,12 +53,20 @@ public function testHydrate()
$result = $form->hydrate(['text' => 'abc', 'number' => 'invalid']);
$this->assertCount(1, $result);
$this->assertArrayHasKey('number', $result);
$this->assertEquals(TestIntegerDataHandler::ERR_INVALID_NUMBER, $result['number']);
$this->assertEquals('must be a number', $result['number']);
$this->assertEquals(null, $form->number->getValue());

$this->assertEquals('abc', $form->text->getValue());
$this->assertNull($form->number->getValue());
}

public function testHydrateInvalid()
{
$form = new TestForm();
$form->hydrate(['text' => 'abc', 'number' => 'invalid'], true);
$this->assertEquals('invalid', $form->number->getValue());
}

public function testRender()
{
$form = new TestForm();
Expand All @@ -70,9 +84,18 @@ public function testRender()
);

$form->text->getDecorator()->setId('myInput');
$form->getDecorator()->setId('abc')->addAttribute('data-test', true);
$this->assertRegExp(
'/<form id="abc" data-test method="POST" action="\/test"><div class="form-group"><label for="myInput">Text<\/label><input type="text" id="myInput" name="text" value="abc" \/><\/div><div class="form-group"><label for="number-(...)">Number<\/label><input type="number" name="number" value="4" id="number-\1" \/><\/div><\/form>/',
$form->render()
);
$this->assertTrue($form->getDecorator()->hasAttribute('data-test'));

$form->getDecorator()->setId('abc')->removeAttribute('data-test');
$this->assertRegExp(
'/<form id="vbn" method="POST" action="\/test"><div class="form-group"><label for="myInput">Text<\/label><input type="text" id="myInput" name="text" value="abc" \/><\/div><div class="form-group"><label for="number-(...)">Number<\/label><input type="number" name="number" value="4" id="number-\1" \/><\/div><\/form>/',
'/<form id="abc" method="POST" action="\/test"><div class="form-group"><label for="myInput">Text<\/label><input type="text" id="myInput" name="text" value="abc" \/><\/div><div class="form-group"><label for="number-(...)">Number<\/label><input type="number" name="number" value="4" id="number-\1" \/><\/div><\/form>/',
$form->render()
);
$this->assertfalse($form->getDecorator()->hasAttribute('data-test'));
}
}
12 changes: 7 additions & 5 deletions tests/Supporting/DataHandlers/TestIntegerDataHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,22 @@
namespace PackagedUi\Tests\Form\Supporting\DataHandlers;

use Packaged\Glimpse\Tags\Form\Input;
use Packaged\Validate\Validators\IntegerValidator;
use Packaged\Validate\Validators\NullableValidator;
use PackagedUi\Form\DataHandlers\AbstractDataHandler;
use PackagedUi\Form\Decorators\InputDecorator;
use PackagedUi\Form\Decorators\Interfaces\DataHandlerDecorator;

class TestIntegerDataHandler extends AbstractDataHandler
{
const ERR_INVALID_NUMBER = "Invalid numeric value";
protected function _setupValidator()
{
$this->addValidator(new NullableValidator(new IntegerValidator()));
}

public function validateValue($value)
{
if($value !== null && !is_int($value))
{
throw new \UnexpectedValueException(self::ERR_INVALID_NUMBER);
}
parent::validateValue($value);
}

protected function _defaultDecorator(): DataHandlerDecorator
Expand Down

0 comments on commit 4d21d0c

Please sign in to comment.