114 lines
No EOL
4.5 KiB
PHP
114 lines
No EOL
4.5 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Acme\Dhl\Services\ShippingService;
|
|
use ReflectionClass;
|
|
use ReflectionMethod;
|
|
|
|
/**
|
|
* Test cases for German address parsing functionality
|
|
*/
|
|
class AddressParserTest extends TestCase
|
|
{
|
|
private ShippingService $shippingService;
|
|
private ReflectionMethod $parseMethod;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
// Mock DhlClient for testing
|
|
$mockClient = $this->createMock(\Acme\Dhl\Support\DhlClient::class);
|
|
$this->shippingService = new ShippingService($mockClient);
|
|
|
|
// Make private method accessible for testing
|
|
$reflection = new ReflectionClass($this->shippingService);
|
|
$this->parseMethod = $reflection->getMethod('parseGermanAddress');
|
|
$this->parseMethod->setAccessible(true);
|
|
}
|
|
|
|
/**
|
|
* Test standard German address formats
|
|
*/
|
|
public function testStandardGermanAddresses(): void
|
|
{
|
|
$testCases = [
|
|
// Basic format: Street + Number
|
|
'Musterstraße 123' => ['street' => 'Musterstraße', 'houseNumber' => '123'],
|
|
'Hauptstraße 1' => ['street' => 'Hauptstraße', 'houseNumber' => '1'],
|
|
|
|
// With letter suffix
|
|
'Bahnhofstraße 45a' => ['street' => 'Bahnhofstraße', 'houseNumber' => '45a'],
|
|
'Kirchgasse 12B' => ['street' => 'Kirchgasse', 'houseNumber' => '12B'],
|
|
|
|
// Multi-word street names
|
|
'Am Markt 7' => ['street' => 'Am Markt', 'houseNumber' => '7'],
|
|
'An der Kirche 23' => ['street' => 'An der Kirche', 'houseNumber' => '23'],
|
|
'Karl-Marx-Straße 156' => ['street' => 'Karl-Marx-Straße', 'houseNumber' => '156'],
|
|
|
|
// Range numbers
|
|
'Lindenstraße 1-3' => ['street' => 'Lindenstraße', 'houseNumber' => '1-3'],
|
|
'Gartenweg 12/14' => ['street' => 'Gartenweg', 'houseNumber' => '12/14'],
|
|
|
|
// With abbreviations
|
|
'Muster Str. 99' => ['street' => 'Muster Str.', 'houseNumber' => '99'],
|
|
'Berliner Pl. 5' => ['street' => 'Berliner Pl.', 'houseNumber' => '5'],
|
|
];
|
|
|
|
foreach ($testCases as $input => $expected) {
|
|
$result = $this->parseMethod->invoke($this->shippingService, $input);
|
|
|
|
$this->assertEquals($expected['street'], $result['street'], "Failed parsing street for: {$input}");
|
|
$this->assertEquals($expected['houseNumber'], $result['houseNumber'], "Failed parsing house number for: {$input}");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test edge cases and problematic addresses
|
|
*/
|
|
public function testEdgeCases(): void
|
|
{
|
|
$edgeCases = [
|
|
// No house number - should return null for houseNumber
|
|
'Musterstraße' => ['street' => 'Musterstraße', 'houseNumber' => null],
|
|
'Am Markt' => ['street' => 'Am Markt', 'houseNumber' => null],
|
|
|
|
// Empty string
|
|
'' => ['street' => '', 'houseNumber' => null],
|
|
|
|
// Only number
|
|
'123' => ['street' => '123', 'houseNumber' => null],
|
|
|
|
// Multiple spaces
|
|
'Muster Straße 123' => ['street' => 'Muster Straße', 'houseNumber' => '123'],
|
|
];
|
|
|
|
foreach ($edgeCases as $input => $expected) {
|
|
$result = $this->parseMethod->invoke($this->shippingService, $input);
|
|
|
|
$this->assertEquals($expected['street'], $result['street'], "Failed parsing street for edge case: {$input}");
|
|
$this->assertEquals($expected['houseNumber'], $result['houseNumber'], "Failed parsing house number for edge case: {$input}");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test international addresses (should not be parsed)
|
|
*/
|
|
public function testInternationalAddresses(): void
|
|
{
|
|
$internationalCases = [
|
|
// English-style addresses
|
|
'123 Main Street' => ['street' => '123 Main Street', 'houseNumber' => null],
|
|
'456 Oak Avenue' => ['street' => '456 Oak Avenue', 'houseNumber' => null],
|
|
];
|
|
|
|
foreach ($internationalCases as $input => $expected) {
|
|
$result = $this->parseMethod->invoke($this->shippingService, $input);
|
|
|
|
$this->assertEquals($expected['street'], $result['street'], "International address should not be parsed: {$input}");
|
|
$this->assertEquals($expected['houseNumber'], $result['houseNumber'], "International address should have null house number: {$input}");
|
|
}
|
|
}
|
|
} |