add helper scripts
This commit is contained in:
181
tests/test_mappers.py
Normal file
181
tests/test_mappers.py
Normal file
@@ -0,0 +1,181 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user