From 67603c935f100d7a8a6587d68147833f440df42d Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Wed, 22 Nov 2023 14:37:31 +0200 Subject: [PATCH 1/2] Fix Money DataTransformer discarding cent values --- .../Form/DataTransformer/ViewTransformer.php | 6 +- .../DataTransformer/ViewTransformerTest.php | 78 +++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 src/MoneyBundle/Tests/Form/DataTransformer/ViewTransformerTest.php diff --git a/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php b/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php index 75d478bcc..7456eb1d6 100644 --- a/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php +++ b/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php @@ -33,10 +33,10 @@ public function __construct(Currency $currency) public function transform($value) { if ($value instanceof Money) { - return $value->getAmount() / 100; + return (float) ($value->getAmount() / 100); } - return 0; + return 0.0; } public function reverseTransform($value): Money @@ -45,6 +45,6 @@ public function reverseTransform($value): Money $value = 0; } - return new Money(((int) $value * 100), $this->currency); + return new Money($value * 100, $this->currency); } } diff --git a/src/MoneyBundle/Tests/Form/DataTransformer/ViewTransformerTest.php b/src/MoneyBundle/Tests/Form/DataTransformer/ViewTransformerTest.php new file mode 100644 index 000000000..cc9efd544 --- /dev/null +++ b/src/MoneyBundle/Tests/Form/DataTransformer/ViewTransformerTest.php @@ -0,0 +1,78 @@ +currency = new Currency("USD"); + $this->viewTransformer = new ViewTransformer($this->currency); + } + + /** + * @dataProvider reverseTransformDataProvider + */ + public function testReverseTransform(?float $value, int $expected): void + { + $expectedResult = new Money($expected, $this->currency); + $result = $this->viewTransformer->reverseTransform($value); + + self::assertTrue($result->equals($expectedResult)); + } + + /** + * @param Money|string|null $money + * @param int|float $expected + * + * @dataProvider transformDataProvider + */ + public function testTransformsMoneyObjectToFloat($money, $expected): void + { + $value = $this->viewTransformer->transform($money); + + self::assertSame($expected, $value); + } + + public function reverseTransformDataProvider(): iterable + { + yield [null, 0]; + yield [10, 1000]; + yield [10.00, 1000]; + yield [10.01, 1001]; + yield [10.10, 1010]; + yield [10.11, 1011]; + yield [10.99, 1099]; + yield [111, 11100]; + yield [111.11, 11111]; + yield [0.01, 1]; + yield [0.10, 10]; + yield [0.11, 11]; + yield [0.99, 99]; + } + + public function transformDataProvider(): iterable + { + yield [null, 0.0]; + yield ['something else', 0.0]; + yield [1.0, 0.0]; + yield [new Money(1500, new Currency('USD')), 15.0]; + yield [new Money(1000, new Currency('USD')), 10.0]; + yield [new Money(100, new Currency('USD')), 1.0]; + yield [new Money(10, new Currency('USD')), 0.10]; + yield [new Money(1, new Currency('USD')), 0.01]; + yield [new Money(0, new Currency('USD')), 0.0]; + } +} From 0664507750a19c93fefb1d1daec7eba9292ab918 Mon Sep 17 00:00:00 2001 From: Pierre du Plessis Date: Wed, 22 Nov 2023 15:12:48 +0200 Subject: [PATCH 2/2] Check for numeric values --- src/MoneyBundle/Form/DataTransformer/ViewTransformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php b/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php index 7456eb1d6..150c40390 100644 --- a/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php +++ b/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php @@ -41,7 +41,7 @@ public function transform($value) public function reverseTransform($value): Money { - if (null === $value) { + if (!is_numeric($value)) { $value = 0; }