198 lines
11 KiB
PHP
198 lines
11 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\BusProNet\XmlParser;
|
|
|
|
use App\BusProNet\XmlCrawlerFactory;
|
|
use App\BusProNet\XmlParser\InsuranceParser;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class InsuranceParserTest extends TestCase
|
|
{
|
|
private InsuranceParser $parser;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->parser = new InsuranceParser();
|
|
}
|
|
|
|
public function testParseIndividualInsuranceWithSubtype(): void
|
|
{
|
|
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
|
|
<versicherungsstammdaten>
|
|
<versicherungen>
|
|
<versicherung id="1" idbuspro="178917" code="903100" bezeichnung="Reise-Rücktritt" preis="5,00" preisartprozent="False" unterart="RRV" familienversicherung="False" paarversicherung="False" zusatzversicherung="False" reisedatumvon="01.09.2024" reisedatumbis="31.12.2030" buchungdatumvon="01.03.2025" buchungdatumbis="31.12.2030" altervon="0" alterbis="64" reisepreisvon="0,00" reisepreisbis="100,00" reisedauervon="0" reisedauerbis="255" urlinfo="https://example.com/info1" urlproduktinfo="https://example.com/product1" urlagb="https://example.com/terms1" />
|
|
<versicherung id="2" idbuspro="177236" code="913320" bezeichnung="Reiseschutz Platin Auto/Bahn/Bus (Europa)" preis="9,00" preisartprozent="False" unterart="PAK" familienversicherung="True" paarversicherung="False" zusatzversicherung="False" reisedatumvon="01.09.2024" reisedatumbis="31.12.2030" buchungdatumvon="01.03.2025" buchungdatumbis="31.12.2030" altervon="0" alterbis="64" reisepreisvon="0,00" reisepreisbis="100,00" reisedauervon="1" reisedauerbis="45" urlinfo="https://example.com/info2" urlproduktinfo="https://example.com/product2" urlagb="https://example.com/terms2" />
|
|
<versicherung id="3" idbuspro="177270" code="903551" bezeichnung="Selbstbehaltübernahme" preis="5,00" preisartprozent="False" unterart="OHN" familienversicherung="False" paarversicherung="False" zusatzversicherung="True" reisedatumvon="01.09.2024" reisedatumbis="31.12.2030" buchungdatumvon="01.03.2025" buchungdatumbis="31.12.2030" altervon="0" alterbis="64" reisepreisvon="0,00" reisepreisbis="600,00" reisedauervon="0" reisedauerbis="255" urlinfo="https://example.com/info3" urlproduktinfo="https://example.com/product3" urlagb="https://example.com/terms3" />
|
|
</versicherungen>
|
|
<versicherungspakete>
|
|
<versicherungspaket id="1" idbuspro="P1000320" bezeichnung="Reiseschutz Platin Auto/Bahn/Bus (Europa) + Selbstbehaltübernahme" preis="14,00" preisartprozent="False" reisedatumvon="01.09.2024" reisedatumbis="31.12.2030" altervon="0" alterbis="64" reisepreisvon="0" reisepreisbis="100,00" familienversicherung="False">
|
|
<enthalteneversicherungen>
|
|
<enthalteneversicherung idbuspro="177236" />
|
|
<enthalteneversicherung idbuspro="177270" />
|
|
</enthalteneversicherungen>
|
|
</versicherungspaket>
|
|
</versicherungspakete>
|
|
</versicherungsstammdaten>';
|
|
|
|
$crawler = XmlCrawlerFactory::create($xmlContent);
|
|
$insurances = $this->parser->parse($crawler);
|
|
|
|
// Test all insurances are included (2 regular + 1 complementary + 1 package = 4 total)
|
|
$this->assertCount(4, $insurances);
|
|
|
|
// Test travel cancellation insurance (RRV)
|
|
$cancellationInsurance = $insurances[178917];
|
|
$this->assertEquals(178917, $cancellationInsurance->id);
|
|
$this->assertEquals('903100', $cancellationInsurance->code);
|
|
$this->assertEquals('Reise-Rücktritt', $cancellationInsurance->label);
|
|
$this->assertEquals('RRV', $cancellationInsurance->subType);
|
|
$this->assertEquals(5.0, $cancellationInsurance->price);
|
|
$this->assertFalse($cancellationInsurance->familyInsurance);
|
|
$this->assertFalse($cancellationInsurance->package);
|
|
$this->assertFalse($cancellationInsurance->complementary);
|
|
|
|
// Test travel protection insurance (PAK) with family flag
|
|
$protectionInsurance = $insurances[177236];
|
|
$this->assertEquals(177236, $protectionInsurance->id);
|
|
$this->assertEquals('913320', $protectionInsurance->code);
|
|
$this->assertEquals('Reiseschutz Platin', $protectionInsurance->label); // "Auto/Bahn/Bus (Europa)" is normalized away
|
|
$this->assertEquals('PAK', $protectionInsurance->subType);
|
|
$this->assertEquals(9.0, $protectionInsurance->price);
|
|
$this->assertTrue($protectionInsurance->familyInsurance);
|
|
$this->assertFalse($protectionInsurance->package);
|
|
$this->assertFalse($protectionInsurance->complementary);
|
|
|
|
// Test deductible insurance (OHN) - IS included but marked as complementary
|
|
$deductibleInsurance = $insurances[177270];
|
|
$this->assertEquals(177270, $deductibleInsurance->id);
|
|
$this->assertEquals('903551', $deductibleInsurance->code);
|
|
$this->assertEquals('Selbstbehaltübernahme', $deductibleInsurance->label);
|
|
$this->assertEquals('OHN', $deductibleInsurance->subType);
|
|
$this->assertEquals(5.0, $deductibleInsurance->price);
|
|
$this->assertFalse($deductibleInsurance->familyInsurance);
|
|
$this->assertFalse($deductibleInsurance->package);
|
|
$this->assertTrue($deductibleInsurance->complementary); // Marked as complementary
|
|
|
|
// Test package - should be family insurance because it contains a family insurance (177236)
|
|
$package = $insurances['P1000320'];
|
|
$this->assertEquals('P1000320', $package->id);
|
|
$this->assertEquals('Reiseschutz Platin + Selbstbehaltübernahme', $package->label); // "Auto/Bahn/Bus (Europa)" is normalized away
|
|
$this->assertNull($package->subType); // Packages don't have subtypes
|
|
$this->assertEquals(14.0, $package->price);
|
|
$this->assertTrue($package->familyInsurance); // Should be true because it contains family insurance 177236
|
|
$this->assertTrue($package->package);
|
|
$this->assertEquals([177236, 177270], $package->containedInsuranceIds);
|
|
|
|
// Test containedInsurances array is populated with actual Insurance objects
|
|
$this->assertCount(2, $package->containedInsurances);
|
|
$this->assertEquals(177236, $package->containedInsurances[0]->id);
|
|
$this->assertEquals(177270, $package->containedInsurances[1]->id);
|
|
|
|
// Test URL aggregation from contained insurances
|
|
$this->assertEquals(['https://example.com/info2', 'https://example.com/info3'], $package->getAllUrlsInfo());
|
|
$this->assertEquals(['https://example.com/product2', 'https://example.com/product3'], $package->getAllUrlsProductInfo());
|
|
$this->assertEquals(['https://example.com/terms2', 'https://example.com/terms3'], $package->getAllUrlsTerms());
|
|
}
|
|
|
|
public function testParsePackageWithoutSubtype(): void
|
|
{
|
|
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
|
|
<versicherungsstammdaten>
|
|
<versicherungen>
|
|
<versicherung id="1" idbuspro="177236" code="913320" bezeichnung="Test Insurance" preis="9,00" preisartprozent="False" unterart="PAK" familienversicherung="False" paarversicherung="False" zusatzversicherung="False" />
|
|
</versicherungen>
|
|
<versicherungspakete>
|
|
<versicherungspaket id="1" idbuspro="P1000320" bezeichnung="Test Package" preis="14,00" familienversicherung="True">
|
|
<enthalteneversicherungen>
|
|
<enthalteneversicherung idbuspro="177236" />
|
|
</enthalteneversicherungen>
|
|
</versicherungspaket>
|
|
</versicherungspakete>
|
|
</versicherungsstammdaten>';
|
|
|
|
$crawler = XmlCrawlerFactory::create($xmlContent);
|
|
$insurances = $this->parser->parse($crawler);
|
|
|
|
$this->assertCount(2, $insurances);
|
|
|
|
// Test package has no subType but has familyInsurance flag
|
|
$package = $insurances['P1000320'];
|
|
$this->assertEquals('P1000320', $package->id);
|
|
$this->assertNull($package->subType);
|
|
$this->assertTrue($package->familyInsurance);
|
|
$this->assertTrue($package->package);
|
|
}
|
|
|
|
public function testParseInsuranceWithNullSubtype(): void
|
|
{
|
|
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
|
|
<versicherungsstammdaten>
|
|
<versicherungen>
|
|
<versicherung id="1" idbuspro="178917" code="903100" bezeichnung="Test Insurance" preis="5,00" preisartprozent="False" familienversicherung="False" paarversicherung="False" zusatzversicherung="False" />
|
|
</versicherungen>
|
|
</versicherungsstammdaten>';
|
|
|
|
$crawler = XmlCrawlerFactory::create($xmlContent);
|
|
$insurances = $this->parser->parse($crawler);
|
|
|
|
$this->assertCount(1, $insurances);
|
|
|
|
$insurance = $insurances[178917];
|
|
$this->assertEquals(178917, $insurance->id);
|
|
$this->assertNull($insurance->subType); // Missing unterart attribute should result in null
|
|
$this->assertFalse($insurance->package);
|
|
}
|
|
|
|
public function testParseEmptyXml(): void
|
|
{
|
|
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
|
|
<versicherungsstammdaten>
|
|
<versicherungen>
|
|
</versicherungen>
|
|
<versicherungspakete>
|
|
</versicherungspakete>
|
|
</versicherungsstammdaten>';
|
|
|
|
$crawler = XmlCrawlerFactory::create($xmlContent);
|
|
$insurances = $this->parser->parse($crawler);
|
|
|
|
$this->assertEmpty($insurances);
|
|
}
|
|
|
|
public function testParseZusatzversicherungFiltering(): void
|
|
{
|
|
$xmlContent = '<?xml version="1.0" encoding="utf-8"?>
|
|
<versicherungsstammdaten>
|
|
<versicherungen>
|
|
<versicherung id="1" idbuspro="178917" code="903100" bezeichnung="Normal Insurance" preis="5,00" preisartprozent="False" unterart="RRV" familienversicherung="False" paarversicherung="False" zusatzversicherung="False" />
|
|
<versicherung id="2" idbuspro="177270" code="903551" bezeichnung="Zusatz Insurance Referenced" preis="5,00" preisartprozent="False" unterart="OHN" familienversicherung="False" paarversicherung="False" zusatzversicherung="True" />
|
|
<versicherung id="3" idbuspro="999999" code="999999" bezeichnung="Zusatz Insurance Not Referenced" preis="5,00" preisartprozent="False" unterart="OHN" familienversicherung="False" paarversicherung="False" zusatzversicherung="True" />
|
|
</versicherungen>
|
|
<versicherungspakete>
|
|
<versicherungspaket id="1" idbuspro="P1000320" bezeichnung="Test Package" preis="14,00" familienversicherung="False">
|
|
<enthalteneversicherungen>
|
|
<enthalteneversicherung idbuspro="177270" />
|
|
</enthalteneversicherungen>
|
|
</versicherungspaket>
|
|
</versicherungspakete>
|
|
</versicherungsstammdaten>';
|
|
|
|
$crawler = XmlCrawlerFactory::create($xmlContent);
|
|
$insurances = $this->parser->parse($crawler);
|
|
|
|
// Should include: normal insurance (178917), both complementary insurances (177270, 999999), and package (P1000320)
|
|
$this->assertCount(4, $insurances);
|
|
$this->assertArrayHasKey(178917, $insurances);
|
|
$this->assertArrayHasKey(177270, $insurances);
|
|
$this->assertArrayHasKey(999999, $insurances);
|
|
$this->assertArrayHasKey('P1000320', $insurances);
|
|
|
|
// Verify complementary flags
|
|
$this->assertFalse($insurances[178917]->complementary); // Normal insurance
|
|
$this->assertTrue($insurances[177270]->complementary); // Complementary insurance
|
|
$this->assertTrue($insurances[999999]->complementary); // Complementary insurance
|
|
}
|
|
}
|