refactor mobile.de parser, fix country mapping, update README
This commit is contained in:
@@ -2,92 +2,87 @@ from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from mobilede_scraper.parsing.mapper import CarMapper
|
||||
from mobilede_scraper.mobile_de.mapper import MobileDeMapper
|
||||
from mobilede_scraper.mobile_de.models import MobileDeListing
|
||||
|
||||
|
||||
class TestCarMapper(unittest.TestCase):
|
||||
class TestMobileDeMapper(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.mapper = CarMapper()
|
||||
self.mapper = MobileDeMapper()
|
||||
|
||||
def test_deduplicates_images_by_image_key(self) -> None:
|
||||
def test_deduplicates_images(self) -> None:
|
||||
urls = [
|
||||
"https://vis.MOBILEDE.com/resizer?imageKeys=1&width=200&height=150",
|
||||
"https://vis.MOBILEDE.com/resizer?imageKeys=1&width=845&height=633",
|
||||
"https://vis.MOBILEDE.com/resizer?imageKeys=2&width=400&height=300",
|
||||
"https://img.classistatic.de/api/v1/mo-prod/images/1",
|
||||
"https://img.classistatic.de/api/v1/mo-prod/images/1",
|
||||
"//img.classistatic.de/api/v1/mo-prod/images/2",
|
||||
]
|
||||
|
||||
record = self.mapper.map_to_car_record(
|
||||
vehicle_url="https://www.MOBILEDE.com/VehicleDetail/123~US",
|
||||
vehicle_summary={"make": "Honda", "model": "Civic", "image_urls": urls},
|
||||
payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}},
|
||||
record = self.mapper.listing_to_car_record(
|
||||
MobileDeListing(
|
||||
id="123",
|
||||
url="https://suchen.mobile.de/fahrzeuge/details.html?id=123",
|
||||
title="Honda Civic",
|
||||
raw={"images": urls},
|
||||
)
|
||||
)
|
||||
|
||||
self.assertEqual(len(record.images), 2)
|
||||
self.assertIn("width=845", record.images[0].fullres_image)
|
||||
self.assertIn("height=633", record.images[0].fullres_image)
|
||||
self.assertEqual(record.images[0].fullres_image, urls[0])
|
||||
self.assertEqual(record.images[1].fullres_image, "https://img.classistatic.de/api/v1/mo-prod/images/2")
|
||||
|
||||
def test_no_damage_marker_is_not_damaged(self) -> None:
|
||||
record = self.mapper.map_to_car_record(
|
||||
vehicle_url="https://www.MOBILEDE.com/VehicleDetail/123~US",
|
||||
vehicle_summary={"make": "Ford", "model": "Focus"},
|
||||
payload_insights={
|
||||
"vehicle_core": {},
|
||||
"pricing": {},
|
||||
"damage": {"primary": "normal wear"},
|
||||
"auction": {},
|
||||
"images": {},
|
||||
},
|
||||
def test_origin_id_uses_canonical_prefix(self) -> None:
|
||||
record = self.mapper.listing_to_car_record(
|
||||
MobileDeListing(
|
||||
id="456",
|
||||
url="https://suchen.mobile.de/fahrzeuge/details.html?id=456",
|
||||
title="Ford Focus",
|
||||
)
|
||||
)
|
||||
|
||||
self.assertFalse(record.is_damaged)
|
||||
self.assertEqual(record.origin_id, "mobile.de:456")
|
||||
self.assertEqual(record.origin, "MOBILE_DE")
|
||||
|
||||
def test_unknown_empty_values_and_normalization(self) -> None:
|
||||
record = self.mapper.map_to_car_record(
|
||||
vehicle_url="https://www.MOBILEDE.com/VehicleDetail/999~US",
|
||||
vehicle_summary={"make": " ", "model": None, "drive": "???", "gearbox": "unknown"},
|
||||
payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}},
|
||||
record = self.mapper.listing_to_car_record(
|
||||
MobileDeListing(
|
||||
id="999",
|
||||
url="https://suchen.mobile.de/fahrzeuge/details.html?id=999",
|
||||
title="",
|
||||
subtitle="",
|
||||
raw={"make": {"localized": " "}, "model": {"localized": ""}, "attr": {"tr": "unknown"}},
|
||||
)
|
||||
)
|
||||
self.assertEqual(record.brand, "UNKNOWN")
|
||||
self.assertEqual(record.model, "UNKNOWN")
|
||||
self.assertEqual(record.drive, "NA")
|
||||
self.assertEqual(record.gearbox, "NA")
|
||||
self.assertIsNone(record.drive)
|
||||
self.assertIsNone(record.gearbox)
|
||||
|
||||
# Нормализация регистра и пробелов.
|
||||
record2 = self.mapper.map_to_car_record(
|
||||
vehicle_url="https://www.MOBILEDE.com/VehicleDetail/888~US",
|
||||
vehicle_summary={"make": "Honda", "model": "Civic", "drive": " Front Wheel Drive ", "gearbox": " AUTOMATIC "},
|
||||
payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}},
|
||||
record2 = self.mapper.listing_to_car_record(
|
||||
MobileDeListing(
|
||||
id="888",
|
||||
url="https://suchen.mobile.de/fahrzeuge/details.html?id=888",
|
||||
title="Honda Civic",
|
||||
transmission=" Automatik ",
|
||||
)
|
||||
)
|
||||
self.assertEqual(record2.drive, "FWD")
|
||||
self.assertEqual(record2.gearbox, "AT")
|
||||
|
||||
def test_price_and_currency_parsing(self) -> None:
|
||||
record = self.mapper.map_to_car_record(
|
||||
vehicle_url="https://www.MOBILEDE.com/VehicleDetail/777~US",
|
||||
vehicle_summary={"make": "Toyota", "model": "Corolla"},
|
||||
payload_insights={
|
||||
"vehicle_core": {},
|
||||
"pricing": {"buy_now": "USD 4,500 - 5,200"},
|
||||
"damage": {},
|
||||
"auction": {},
|
||||
"images": {},
|
||||
},
|
||||
record = self.mapper.listing_to_car_record(
|
||||
MobileDeListing(
|
||||
id="777",
|
||||
url="https://suchen.mobile.de/fahrzeuge/details.html?id=777",
|
||||
title="Toyota Corolla",
|
||||
price="€ 5.200",
|
||||
first_registration="05/2019",
|
||||
mileage="50.100 km",
|
||||
)
|
||||
)
|
||||
self.assertEqual(record.price, 5200)
|
||||
|
||||
record2 = self.mapper.map_to_car_record(
|
||||
vehicle_url="https://www.MOBILEDE.com/VehicleDetail/778~US",
|
||||
vehicle_summary={"make": "Toyota", "model": "Corolla"},
|
||||
payload_insights={
|
||||
"vehicle_core": {},
|
||||
"pricing": {"buy_now": "€4.500,00"},
|
||||
"damage": {},
|
||||
"auction": {},
|
||||
"images": {},
|
||||
},
|
||||
)
|
||||
self.assertEqual(record2.currency, "EUR")
|
||||
self.assertEqual(record2.price, 4500)
|
||||
self.assertEqual(record.currency, "EUR")
|
||||
self.assertEqual(record.year, 2019)
|
||||
self.assertEqual(record.mileage, 50100)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user