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}"); } } }