feat: finalize voucher handling and discount display in summary and overview

This commit is contained in:
Björn Fromme
2025-11-26 17:29:15 +01:00
parent 32bef9a4e9
commit f4691ec67e
15 changed files with 762 additions and 46 deletions
+107
View File
@@ -0,0 +1,107 @@
<?php
declare(strict_types=1);
namespace App\Tests\Form\Model;
use App\Form\Model\AcceptedVoucherDto;
use App\Form\Model\AcceptedVouchersDto;
use PHPUnit\Framework\TestCase;
class AcceptedVouchersTest extends TestCase
{
public function testAddVoucherCalculatesTotalDiscount(): void
{
$acceptedVouchers = new AcceptedVouchersDto();
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_PROMOTIONAL,
code: 'PROMO10',
amount: 50.00
));
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_PURCHASE,
code: 'G1234',
amount: 100.00
));
$this->assertEquals(150.0, $acceptedVouchers->getTotalDiscount());
$this->assertCount(2, $acceptedVouchers->getVouchers());
}
public function testFilterVouchersByType(): void
{
$acceptedVouchers = new AcceptedVouchersDto();
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_PROMOTIONAL,
code: 'PROMO10',
amount: 50.00
));
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_PURCHASE,
code: 'G1234',
amount: 100.00
));
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_GOODWILL,
code: 'K5678',
amount: 75.00
));
$this->assertCount(1, $acceptedVouchers->getPromotionalVouchers());
$this->assertCount(1, $acceptedVouchers->getPurchaseVouchers());
$this->assertCount(1, $acceptedVouchers->getGoodwillVouchers());
}
public function testHasVouchersReturnsFalseWhenEmpty(): void
{
$acceptedVouchers = new AcceptedVouchersDto();
$this->assertFalse($acceptedVouchers->hasVouchers());
$this->assertEquals(0, $acceptedVouchers->count());
}
public function testHasVouchersReturnsTrueWhenNotEmpty(): void
{
$acceptedVouchers = new AcceptedVouchersDto();
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_PROMOTIONAL,
code: 'PROMO10',
amount: 50.00
));
$this->assertTrue($acceptedVouchers->hasVouchers());
$this->assertEquals(1, $acceptedVouchers->count());
}
public function testFloatPrecisionHandling(): void
{
$acceptedVouchers = new AcceptedVouchersDto();
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_PROMOTIONAL,
code: 'PROMO1',
amount: 33.33
));
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_PROMOTIONAL,
code: 'PROMO2',
amount: 33.33
));
$acceptedVouchers->addVoucher(new AcceptedVoucherDto(
type: AcceptedVoucherDto::TYPE_PROMOTIONAL,
code: 'PROMO3',
amount: 33.34
));
// Should be exactly 100.00 with proper rounding
$this->assertEquals(100.0, $acceptedVouchers->getTotalDiscount());
}
}