from __future__ import annotations import unittest from dubizzle_scraper.parsing.mapper import CarMapper class TestCarMapper(unittest.TestCase): def setUp(self) -> None: self.mapper = CarMapper() def test_extracts_make_model_from_algolia_details(self) -> None: record = self.mapper.map_to_car_record( vehicle_url="https://dubizzle.com/s/DOBI7J3", vehicle_summary={ "id": 16810399, "details_v2": { "tertiary": [ {"slug": "make", "value": {"en": "Toyota", "ar": "تويوتا"}}, {"slug": "model", "value": {"en": "Land Cruiser", "ar": "لاند كروزر"}}, ] }, "category_v2": { "names_en": ["Motors", "Used Cars", "Toyota", "Land Cruiser"], "slug_paths": [ "motors", "motors/used-cars", "motors/used-cars/toyota", "motors/used-cars/toyota/land-cruiser", ], }, }, payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}}, ) self.assertEqual(record.brand, "Toyota") self.assertEqual(record.model, "Land Cruiser") def test_extracts_make_model_from_legacy_details(self) -> None: record = self.mapper.map_to_car_record( vehicle_url="https://dubizzle.com/s/DOBIlegacy", vehicle_summary={ "objectID": "item:legacy:1", "details": { "Make": {"en": {"label": "Make", "value": "Honda"}}, "Model": {"en": {"label": "Model", "value": "Civic"}}, }, }, payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}}, ) self.assertEqual(record.brand, "Honda") self.assertEqual(record.model, "Civic") def test_extracts_extended_algolia_fields(self) -> None: record = self.mapper.map_to_car_record( vehicle_url="https://dubizzle.com/s/DOBGaGs", vehicle_summary={ "id": 16345114, "year": 2012, "price": 59000.0, "kilometers": 91800, "seller_type": "DL", "site": {"en": "Dubai"}, "category_v2": { "names_en": ["Motors", "Used Cars", "Porsche", "Cayenne"], "slug_paths": [ "motors", "motors/used-cars", "motors/used-cars/porsche", "motors/used-cars/porsche/cayenne", ], }, "details": { "Body Type": {"en": {"value": "SUV"}}, "Transmission Type": {"en": {"value": "Automatic Transmission"}}, "Exterior Color": {"en": {"value": "Brown"}}, "Steering Side": {"en": {"value": "Left Hand"}}, "Engine Capacity (cc)": {"en": {"value": "4800 cc"}}, "Make": {"en": {"value": "Porsche"}}, "Model": {"en": {"value": "Cayenne"}}, }, "photo_mains": ["https://dbz-images.dubizzle.com/images/example.jpeg?impolicy=dpv"], }, payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}}, ) self.assertEqual(record.brand, "Porsche") self.assertEqual(record.model, "Cayenne") self.assertEqual(record.price, 59000) self.assertEqual(record.mileage, 91800) self.assertEqual(record.color, "brown") self.assertEqual(record.body_type, "SUV") self.assertEqual(record.gearbox, "AT") self.assertEqual(record.steering_wheel, "LEFT") self.assertEqual(record.engine_volume, 4800) self.assertEqual(record.country, "AE") def test_deduplicates_images_by_image_key(self) -> None: urls = [ "https://vis.dubizzle.com/resizer?imageKeys=1&width=200&height=150", "https://vis.dubizzle.com/resizer?imageKeys=1&width=845&height=633", "https://vis.dubizzle.com/resizer?imageKeys=2&width=400&height=300", ] record = self.mapper.map_to_car_record( vehicle_url="https://www.dubizzle.com/VehicleDetail/123~US", vehicle_summary={"make": "Honda", "model": "Civic", "image_urls": urls}, payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}}, ) self.assertEqual(len(record.images), 2) self.assertIn("width=845", record.images[0].fullres_image) self.assertIn("height=633", record.images[0].fullres_image) def test_no_damage_marker_is_not_damaged(self) -> None: record = self.mapper.map_to_car_record( vehicle_url="https://www.dubizzle.com/VehicleDetail/123~US", vehicle_summary={"make": "Ford", "model": "Focus"}, payload_insights={ "vehicle_core": {}, "pricing": {}, "damage": {"primary": "normal wear"}, "auction": {}, "images": {}, }, ) self.assertFalse(record.is_damaged) def test_unknown_empty_values_and_normalization(self) -> None: record = self.mapper.map_to_car_record( vehicle_url="https://www.dubizzle.com/VehicleDetail/999~US", vehicle_summary={"make": " ", "model": None, "drive": "???", "gearbox": "unknown"}, payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}}, ) self.assertEqual(record.brand, "UNKNOWN") self.assertEqual(record.model, "UNKNOWN") self.assertEqual(record.drive, "NA") self.assertEqual(record.gearbox, "NA") # Нормализация регистра и пробелов. record2 = self.mapper.map_to_car_record( vehicle_url="https://www.dubizzle.com/VehicleDetail/888~US", vehicle_summary={"make": "Honda", "model": "Civic", "drive": " Front Wheel Drive ", "gearbox": " AUTOMATIC "}, payload_insights={"vehicle_core": {}, "pricing": {}, "damage": {}, "auction": {}, "images": {}}, ) 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.dubizzle.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": {}, }, ) self.assertEqual(record.price, 5200) record2 = self.mapper.map_to_car_record( vehicle_url="https://www.dubizzle.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) if __name__ == "__main__": unittest.main()