108 lines
3.2 KiB
PHP
108 lines
3.2 KiB
PHP
<?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());
|
|
}
|
|
}
|