Files
myep/tests/BusProNet/XmlParser/BookingResponseParserTest.php
T

213 lines
8.8 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\BusProNet\XmlParser;
use App\BusProNet\XmlParser\BookingResponseParser;
use PHPUnit\Framework\TestCase;
use Symfony\Component\DomCrawler\Crawler;
class BookingResponseParserTest extends TestCase
{
private BookingResponseParser $parser;
protected function setUp(): void
{
$this->parser = new BookingResponseParser();
}
public function testParseBookingResponseWithPurchaseVoucher(): void
{
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
<ergebnis>
<satz typ="BUCHUNG" />
<buchung>möglich</buchung>
<vorgang>321530</vorgang>
<preise>
<preis position="1" art="UNT" unterart="ZIM" bezeichnung="Bett im Mehrbettzimmer" preis="679,00" gesamtpreis="679,00" />
</preise>
<gesamtpreis>755,00</gesamtpreis>
<zahlungsbedingungen>
<kaufgutschein nummer="G1263" betrag="100,00"></kaufgutschein>
<restzahlung betrag="655,00" termin="02.12.2029"></restzahlung>
</zahlungsbedingungen>
</ergebnis>';
$crawler = new Crawler($xmlContent);
$response = $this->parser->parse($crawler->filter('ergebnis'));
$this->assertTrue($response->isInquiryValid());
$this->assertEquals('321530', $response->transactionNumber);
$this->assertEquals(755.0, $response->totalPrice);
// Verify purchase voucher is parsed
$this->assertNotNull($response->paymentTerms);
$this->assertCount(1, $response->paymentTerms->appliedPurchaseVouchers);
$this->assertEquals('G1263', $response->paymentTerms->appliedPurchaseVouchers[0]['nummer']);
$this->assertEquals(100.0, $response->paymentTerms->appliedPurchaseVouchers[0]['betrag']);
$this->assertEquals(100.0, $response->paymentTerms->getPurchaseVoucherDiscount());
$this->assertEquals(655.0, $response->paymentTerms->finalPaymentAmount);
}
public function testParseBookingResponseWithPromotionalVoucher(): void
{
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
<ergebnis>
<satz typ="BUCHUNG" />
<buchung>möglich</buchung>
<vorgang>321530</vorgang>
<preise>
<preis position="1" art="UNT" unterart="ZIM" bezeichnung="Bett im Mehrbettzimmer" preis="679,00" gesamtpreis="679,00" />
<preis position="2" art="AKTION" unterart="" bezeichnung="TESTERINO1" anzahl="1" zuordnung="1" preis="-100,00" gesamtpreis="-100,00"></preis>
</preise>
<gesamtpreis>615,20</gesamtpreis>
<zahlungsbedingungen>
<restzahlung betrag="615,20" termin="29.11.2025"></restzahlung>
</zahlungsbedingungen>
</ergebnis>';
$crawler = new Crawler($xmlContent);
$response = $this->parser->parse($crawler->filter('ergebnis'));
$this->assertTrue($response->isInquiryValid());
$this->assertEquals(615.2, $response->totalPrice);
// Verify price items include promotional voucher
$this->assertCount(2, $response->priceItems);
$voucherItem = $response->priceItems[1];
$this->assertEquals('AKTION', $voucherItem->type);
$this->assertEquals('TESTERINO1', $voucherItem->label);
$this->assertEquals(-100.0, $voucherItem->totalPrice);
// Verify voucher discount extraction
$voucherDiscounts = $response->getVoucherDiscountsFromPrices();
$this->assertCount(1, $voucherDiscounts);
$this->assertEquals(100.0, $response->getVoucherDiscountFromPrices());
$this->assertEquals(100.0, $response->getTotalVoucherDiscount());
}
public function testParseBookingResponseWithGoodwillVoucher(): void
{
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
<ergebnis>
<satz typ="BUCHUNG" />
<buchung>möglich</buchung>
<vorgang>321530</vorgang>
<preise>
<preis position="1" art="UNT" unterart="ZIM" bezeichnung="Bett im Mehrbettzimmer" preis="679,00" gesamtpreis="679,00" />
<preis position="2" art="KULANZGUTSCHEIN" unterart="" bezeichnung="Kulanzgutschein K1904" anzahl="1" zuordnung="1" preis="-679,00" gesamtpreis="-679,00"></preis>
</preise>
<gesamtpreis>0,00</gesamtpreis>
<zahlungsbedingungen></zahlungsbedingungen>
</ergebnis>';
$crawler = new Crawler($xmlContent);
$response = $this->parser->parse($crawler->filter('ergebnis'));
$this->assertTrue($response->isInquiryValid());
$this->assertEquals(0.0, $response->totalPrice);
// Verify goodwill voucher is parsed
$voucherDiscounts = $response->getVoucherDiscountsFromPrices();
$this->assertCount(1, $voucherDiscounts);
$goodwillVoucher = array_values($voucherDiscounts)[0];
$this->assertEquals('KULANZGUTSCHEIN', $goodwillVoucher->type);
$this->assertEquals('Kulanzgutschein K1904', $goodwillVoucher->label);
$this->assertEquals(-679.0, $goodwillVoucher->totalPrice);
$this->assertEquals(679.0, $response->getVoucherDiscountFromPrices());
$this->assertEquals(679.0, $response->getTotalVoucherDiscount());
}
public function testParseBookingResponseWithMultipleVouchers(): void
{
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
<ergebnis>
<satz typ="BUCHUNG" />
<buchung>möglich</buchung>
<vorgang>321530</vorgang>
<preise>
<preis position="1" art="UNT" unterart="ZIM" bezeichnung="Bett im Mehrbettzimmer" preis="679,00" gesamtpreis="679,00" />
<preis position="2" art="AKTION" unterart="" bezeichnung="PROMO10" anzahl="1" zuordnung="1" preis="-50,00" gesamtpreis="-50,00"></preis>
<preis position="3" art="KULANZGUTSCHEIN" unterart="" bezeichnung="Kulanzgutschein K123" anzahl="1" zuordnung="1" preis="-30,00" gesamtpreis="-30,00"></preis>
</preise>
<gesamtpreis>499,00</gesamtpreis>
<zahlungsbedingungen>
<kaufgutschein nummer="G5678" betrag="100,00"></kaufgutschein>
<restzahlung betrag="399,00" termin="02.12.2029"></restzahlung>
</zahlungsbedingungen>
</ergebnis>';
$crawler = new Crawler($xmlContent);
$response = $this->parser->parse($crawler->filter('ergebnis'));
// Verify all voucher types are parsed
$this->assertEquals(80.0, $response->getVoucherDiscountFromPrices()); // 50 + 30
$this->assertEquals(100.0, $response->getPurchaseVoucherDiscount());
$this->assertEquals(180.0, $response->getTotalVoucherDiscount()); // 50 + 30 + 100
// Verify price item vouchers
$voucherDiscounts = $response->getVoucherDiscountsFromPrices();
$this->assertCount(2, $voucherDiscounts);
}
public function testParseBookingResponseWithNoVouchers(): void
{
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
<ergebnis>
<satz typ="BUCHUNG" />
<buchung>möglich</buchung>
<vorgang>321530</vorgang>
<preise>
<preis position="1" art="UNT" unterart="ZIM" bezeichnung="Bett im Mehrbettzimmer" preis="679,00" gesamtpreis="679,00" />
</preise>
<gesamtpreis>679,00</gesamtpreis>
<zahlungsbedingungen>
<restzahlung betrag="679,00" termin="02.12.2029"></restzahlung>
</zahlungsbedingungen>
</ergebnis>';
$crawler = new Crawler($xmlContent);
$response = $this->parser->parse($crawler->filter('ergebnis'));
$this->assertTrue($response->isInquiryValid());
$this->assertEquals(679.0, $response->totalPrice);
// Verify no voucher discounts
$this->assertCount(0, $response->getVoucherDiscountsFromPrices());
$this->assertEquals(0.0, $response->getVoucherDiscountFromPrices());
$this->assertEquals(0.0, $response->getPurchaseVoucherDiscount());
$this->assertEquals(0.0, $response->getTotalVoucherDiscount());
}
public function testParseBookingResponseWithMultiplePurchaseVouchers(): void
{
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
<ergebnis>
<satz typ="BUCHUNG" />
<buchung>möglich</buchung>
<vorgang>321530</vorgang>
<preise>
<preis position="1" art="UNT" unterart="ZIM" bezeichnung="Bett im Mehrbettzimmer" preis="679,00" gesamtpreis="679,00" />
</preise>
<gesamtpreis>679,00</gesamtpreis>
<zahlungsbedingungen>
<kaufgutschein nummer="G1111" betrag="50,00"></kaufgutschein>
<kaufgutschein nummer="G2222" betrag="75,00"></kaufgutschein>
<restzahlung betrag="554,00" termin="02.12.2029"></restzahlung>
</zahlungsbedingungen>
</ergebnis>';
$crawler = new Crawler($xmlContent);
$response = $this->parser->parse($crawler->filter('ergebnis'));
// Verify multiple purchase vouchers are parsed
$this->assertNotNull($response->paymentTerms);
$this->assertCount(2, $response->paymentTerms->appliedPurchaseVouchers);
$this->assertEquals(125.0, $response->paymentTerms->getPurchaseVoucherDiscount()); // 50 + 75
$this->assertEquals(125.0, $response->getTotalVoucherDiscount());
}
}