From a41bc808e2996e2ff8c7107ff23a555e2d5575b9 Mon Sep 17 00:00:00 2001 From: Tom Kay Date: Tue, 7 Jul 2026 12:25:40 +0100 Subject: [PATCH] Normalise currency codes in CurrencyHelper Trim and uppercase codes (and defaults) before lookup so lowercase or padded input resolves the correct currency class, guarding against the PHP 8.1 null-to-string deprecation when both code and default are null. Co-Authored-By: Claude Fable 5 --- src/Currency/CurrencyHelper.php | 5 +++-- tests/Currency/CurrencyTest.php | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/Currency/CurrencyHelper.php b/src/Currency/CurrencyHelper.php index 5fb7b12..ad27a54 100644 --- a/src/Currency/CurrencyHelper.php +++ b/src/Currency/CurrencyHelper.php @@ -11,13 +11,13 @@ class CurrencyHelper */ public static function getCurrency($code, $default = null) { - $code = $code ?: $default; + $code = strtoupper(trim((string)($code ?: $default))); $className = sprintf('\Packaged\Rwd\Currency\Currencies\%sCurrency', $code); if(class_exists($className)) { return new $className(); } - else if($default !== null && $code !== $default) + else if($default !== null && $code !== strtoupper(trim((string)$default))) { return self::getCurrency($default); } @@ -36,6 +36,7 @@ public static function listAllCurrencies() $c = new \ReflectionClass(CurrencyCode::class); foreach($c->getConstants() as $code) { + $code = strtoupper(trim((string)$code)); try { $currencies[$code] = self::getCurrency($code)->getName(); diff --git a/tests/Currency/CurrencyTest.php b/tests/Currency/CurrencyTest.php index a31fe88..f4928d1 100644 --- a/tests/Currency/CurrencyTest.php +++ b/tests/Currency/CurrencyTest.php @@ -1,6 +1,8 @@ format(123)); self::assertEquals('-¥123', $jpy->format(-123)); } + + public function testCodeIsNormalised() + { + self::assertInstanceOf(USDCurrency::class, CurrencyHelper::getCurrency('usd')); + self::assertInstanceOf(USDCurrency::class, CurrencyHelper::getCurrency('Usd')); + self::assertInstanceOf(USDCurrency::class, CurrencyHelper::getCurrency(' USD ')); + self::assertInstanceOf(USDCurrency::class, CurrencyHelper::getCurrency("\tusd\n")); + } + + public function testFallbackToDefault() + { + self::assertInstanceOf(GBPCurrency::class, CurrencyHelper::getCurrency('XXX', 'GBP')); + self::assertInstanceOf(GBPCurrency::class, CurrencyHelper::getCurrency('xxx', 'gbp')); + self::assertInstanceOf(GBPCurrency::class, CurrencyHelper::getCurrency(null, ' gbp ')); + self::assertInstanceOf(GBPCurrency::class, CurrencyHelper::getCurrency('', 'GBP')); + } + + public function testInvalidCodeThrows() + { + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('XXX is not a supported currency'); + CurrencyHelper::getCurrency('xxx'); + } + + public function testInvalidCodeAndDefaultThrows() + { + $this->expectException(\RuntimeException::class); + CurrencyHelper::getCurrency('xxx', 'xxx'); + } + + public function testNullCodeThrows() + { + $this->expectException(\RuntimeException::class); + CurrencyHelper::getCurrency(null); + } }