From a5168792588874d8e4f3769ccf18ea5ddde750ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Tue, 5 Nov 2019 17:05:04 +0100 Subject: [PATCH] Fixed an exception in getmaxDiscountAmount(). This should fixes an 500 error code, that showed up on some pages. Also added a test method to test this function. --- src/Services/PricedetailHelper.php | 24 ++++-- tests/Services/PricedetailHelperTest.php | 93 ++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 tests/Services/PricedetailHelperTest.php diff --git a/src/Services/PricedetailHelper.php b/src/Services/PricedetailHelper.php index e785d707..e939740b 100644 --- a/src/Services/PricedetailHelper.php +++ b/src/Services/PricedetailHelper.php @@ -25,6 +25,8 @@ namespace App\Services; use App\Entity\Parts\Part; use App\Entity\PriceInformations\Currency; use App\Entity\PriceInformations\Pricedetail; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\PersistentCollection; use Locale; class PricedetailHelper @@ -53,20 +55,32 @@ class PricedetailHelper foreach ($orderdetails as $orderdetail) { $pricedetails = $orderdetail->getPricedetails(); //The orderdetail must have pricedetails, otherwise this will not work! - if (empty($pricedetails)) { + if (count($pricedetails) === 0) { continue; } - /* Pricedetails in orderdetails are ordered by min discount quantity, - so our first object is our min order amount for the current orderdetail */ - $max_amount = $pricedetails->last()->getMinDiscountQuantity(); + if ($pricedetails instanceof PersistentCollection) { + /* Pricedetails in orderdetails are ordered by min discount quantity, + so our first object is our min order amount for the current orderdetail */ + $max_amount = $pricedetails->last()->getMinDiscountQuantity(); + } else { + // We have to sort the pricedetails manually + $array = $pricedetails->map( + function (Pricedetail $pricedetail) { + return $pricedetail->getMinDiscountQuantity(); + } + )->toArray(); + sort($array); + $max_amount = end($array); + } + if ($max_amount > $max) { $max = $max_amount; } } - if ($max > 0) { + if ($max > 0.0) { return $max; } diff --git a/tests/Services/PricedetailHelperTest.php b/tests/Services/PricedetailHelperTest.php new file mode 100644 index 00000000..947fbfb3 --- /dev/null +++ b/tests/Services/PricedetailHelperTest.php @@ -0,0 +1,93 @@ +service = self::$container->get(PricedetailHelper::class); + } + + public function maxDiscountAmountDataProvider() + { + $part = new Part(); + yield [$part, null, 'Part without any orderdetails failed!']; + + //Part with empty orderdetails + $part = new Part(); + $orderdetail = new Orderdetail(); + $part->addOrderdetail($orderdetail); + yield [$part, null, 'Part with one empty orderdetail failed!']; + + $part = new Part(); + $orderdetail = new Orderdetail(); + $part->addOrderdetail($orderdetail); + $orderdetail->addPricedetail((new Pricedetail())->setMinDiscountQuantity(1)); + yield [$part, 1.0, 'Part with one pricedetail failed!']; + + $part = new Part(); + $orderdetail = new Orderdetail(); + $part->addOrderdetail($orderdetail); + $orderdetail->addPricedetail((new Pricedetail())->setMinDiscountQuantity(1)); + $orderdetail->addPricedetail((new Pricedetail())->setMinDiscountQuantity(2)); + $orderdetail->addPricedetail((new Pricedetail())->setMinDiscountQuantity(1.5)); + yield [$part, 2.0, 'Part with multiple pricedetails failed!']; + + $part = new Part(); + $orderdetail = new Orderdetail(); + $orderdetail2 = new Orderdetail(); + $part->addOrderdetail($orderdetail); + $part->addOrderdetail($orderdetail2); + $orderdetail->addPricedetail((new Pricedetail())->setMinDiscountQuantity(1)); + $orderdetail->addPricedetail((new Pricedetail())->setMinDiscountQuantity(2)); + $orderdetail->addPricedetail((new Pricedetail())->setMinDiscountQuantity(1.5)); + $orderdetail2->addPricedetail((new Pricedetail())->setMinDiscountQuantity(10)); + + yield [$part, 10.0, 'Part with multiple orderdetails failed']; + } + + /** + * @dataProvider maxDiscountAmountDataProvider + */ + public function testGetMaxDiscountAmount(Part $part, ?float $expected_result, string $message) + { + $this->assertEquals($expected_result, $this->service->getMaxDiscountAmount($part), $message); + } +} \ No newline at end of file