Skip to content

Commit

Permalink
allow only strings in form data; throw exception if integer is invali…
Browse files Browse the repository at this point in the history
…d; allow transformer instances
  • Loading branch information
Illia Somov committed Jun 3, 2019
1 parent c2474b7 commit 25d62be
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 14 deletions.
7 changes: 7 additions & 0 deletions src/Exception/UnexpectedValueException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php declare(strict_types = 1);

namespace Someniatko\FormTransformer\Exception;

final class UnexpectedValueException extends \UnexpectedValueException
{
}
2 changes: 1 addition & 1 deletion src/FieldTransformer/CallableTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public function __construct(callable $callback, $defaultValue = null)
$this->defaultValue = $defaultValue;
}

public function transformField($formFieldValue)
public function transformField(string $formFieldValue)
{
return ($this->callback)($formFieldValue);
}
Expand Down
4 changes: 1 addition & 3 deletions src/FieldTransformer/CheckboxField.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@

final class CheckboxField implements FieldTransformerInterface
{
public function transformField($formFieldValue)
public function transformField(string $formFieldValue)
{
\assert(is_string($formFieldValue));

return $formFieldValue !== '';
}

Expand Down
9 changes: 6 additions & 3 deletions src/FieldTransformer/IntegerField.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@

namespace Someniatko\FormTransformer\FieldTransformer;

use Someniatko\FormTransformer\Exception\UnexpectedValueException;
use Someniatko\FormTransformer\FieldTransformerInterface;

final class IntegerField implements FieldTransformerInterface
{
public function transformField($formFieldValue)
public function transformField(string $formFieldValue)
{
\assert(is_string($formFieldValue));
if ($formFieldValue === '') {
return null;
}

\assert(is_numeric($formFieldValue));
if (!is_numeric($formFieldValue)) {
throw new UnexpectedValueException;
}

return (int)$formFieldValue;
}

Expand Down
3 changes: 1 addition & 2 deletions src/FieldTransformer/StringField.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@

final class StringField implements FieldTransformerInterface
{
public function transformField($formFieldValue)
public function transformField(string $formFieldValue)
{
\assert(is_string($formFieldValue));
return $formFieldValue;
}

Expand Down
7 changes: 5 additions & 2 deletions src/FieldTransformerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

namespace Someniatko\FormTransformer;

use Someniatko\FormTransformer\Exception\UnexpectedValueException;

interface FieldTransformerInterface
{
/**
* Transforms form field value into normalized one
* @param mixed $formFieldValue
* @param string $formFieldValue
* @return mixed
* @throws UnexpectedValueException
*/
public function transformField($formFieldValue);
public function transformField(string $formFieldValue);

/**
* Returns default field normalized value if form data does not contains the field
Expand Down
4 changes: 4 additions & 0 deletions src/FormDataTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ private function createTransformer($configNode) :FieldTransformerInterface
{
\assert(!is_array($configNode));

if ($configNode instanceof FieldTransformerInterface) {
return $configNode;
}

return is_callable($configNode)
? new CallableTransformer($configNode)
: new $configNode;
Expand Down
3 changes: 3 additions & 0 deletions src/FormDataTransformerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace Someniatko\FormTransformer;

use Someniatko\FormTransformer\Exception\UnexpectedValueException;

interface FormDataTransformerInterface
{
/**
Expand All @@ -14,6 +16,7 @@ interface FormDataTransformerInterface
* field name => FieldTransformer class
* Fields not specified in the config will be left as is.
* @return array Normalized data
* @throws UnexpectedValueException
*/
public function transform(array $formData, array $config) :array;
}
8 changes: 7 additions & 1 deletion tests/FieldTransformer/IntegerFieldTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use PHPUnit\Framework\TestCase;
use Someniatko\FormTransformer\FieldTransformer\IntegerField;

final class IntegerFieldTest extends TestCase
final class IntegerFieldTest extends TestCase
{
/**
* @dataProvider fieldDataProvider
Expand All @@ -26,4 +26,10 @@ public function testGetDefaultValue() :void
{
$this->assertNull((new IntegerField)->getDefaultValue());
}

public function testNonNumericValueResultsInException(): void
{
$this->expectException(\UnexpectedValueException::class);
(new IntegerField)->transformField('abcd');
}
}
39 changes: 37 additions & 2 deletions tests/FormDataTransformerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

class BorkTransformer implements FieldTransformerInterface
{
public function transformField($formFieldValue)
public function transformField(string $formFieldValue)
{
return $formFieldValue === null ? null : $formFieldValue.'-bork';
return $formFieldValue.'-bork';
}

public function getDefaultValue()
Expand All @@ -19,6 +19,26 @@ public function getDefaultValue()
}
}

final class TransformerWithConstructor implements FieldTransformerInterface
{
private $addition;

public function __construct(string $addition)
{
$this->addition = $addition;
}

public function transformField(string $formFieldValue)
{
return $formFieldValue.$this->addition;
}

public function getDefaultValue()
{
return null;
}
}

final class FormDataTransformerTest extends TestCase
{
public function testTransformWithoutConfig() :void
Expand Down Expand Up @@ -216,4 +236,19 @@ public function testTransformCallableInsideEach() :void
],
], (new FormDataTransformer)->transform($formData, $config));
}

public function testTransformWithTransformerInstance(): void
{
$formData = [
'wolf' => 'boo'
];

$config = [
'wolf' => new TransformerWithConstructor('-bar')
];

$this->assertEquals([
'wolf' => 'boo-bar',
], (new FormDataTransformer)->transform($formData, $config));
}
}

0 comments on commit 25d62be

Please sign in to comment.