createMock(FilesystemOperator::class); $filesystem ->expects($this->never()) ->method('read'); $loader = $this->createLoader($filesystem); $travel = new Travel(); $travel->hotelId = null; $travel->hotel = null; $loader->patchHotelDetails($travel); $this->assertNull($travel->hotel); } public function testParseXmlMapsCostUnitAndCountryCode(): void { $hotel = $this->createLoader()->parseXml($this->hotelNode( '83CH' )); $this->assertSame('83', $hotel->costUnit); $this->assertSame('CH', $hotel->country, 'the raw token is the join key and must not be rewritten'); $this->assertSame('ch', $hotel->countryCode); } public function testParseXmlKeepsAListOfCostUnitsAsAString(): void { $hotel = $this->createLoader()->parseXml($this->hotelNode( '84 85D' )); $this->assertSame('84 85', $hotel->costUnit); } public function testParseXmlLeavesCostUnitNullWhenAbsent(): void { $hotel = $this->createLoader()->parseXml($this->hotelNode('D')); $this->assertNull($hotel->costUnit); $this->assertSame('de', $hotel->countryCode); } public function testParseXmlLeavesBothCountryFieldsNullWhenLandIsAbsent(): void { $hotel = $this->createLoader()->parseXml($this->hotelNode('Ohne Land')); $this->assertNull($hotel->country); $this->assertNull($hotel->countryCode); } public function testParseXmlLeavesCountryCodeNullForAnUnmappableToken(): void { $hotel = $this->createLoader()->parseXml($this->hotelNode('XX')); $this->assertSame('XX', $hotel->country); $this->assertNull($hotel->countryCode, 'an unknown token must never be guessed into a code'); } private function hotelNode(string $children): Crawler { $xml = sprintf('%s', $children); return XmlCrawlerFactory::create($xml)->filterXPath('//hotels/hotel'); } private function createLoader(?FilesystemOperator $filesystem = null): HotelLoader { return new HotelLoader( new CountryCodeMapper(new NullLogger()), new ArrayAdapter(), $filesystem ?? $this->createStub(FilesystemOperator::class), ); } }