Normalize Russian vehicle data

This commit is contained in:
qananasikq
2026-08-18 15:59:00 +03:00
parent a19a2009ed
commit f3329f76a5
2 changed files with 267 additions and 64 deletions
+114
View File
@@ -434,6 +434,17 @@ class TestMobileDeMapper(unittest.TestCase):
self.assertEqual(record.drive, "FWD")
def test_bmw_sdrive_maps_to_two_wheel_drive(self) -> None:
record = self.mapper.detail_to_car_record(
"1014",
{
"shortTitle": "BMW X1",
"subTitle": "sDrive18i Advantage",
},
)
self.assertEqual(record.drive, "2WD")
def test_russian_search_values_map_to_english_contract(self) -> None:
record = self.mapper.listing_to_car_record(
MobileDeListing(
@@ -469,6 +480,64 @@ class TestMobileDeMapper(unittest.TestCase):
self.assertFalse(record.is_damaged)
self.assertFalse(record.new_car)
def test_russian_gold_color_maps_to_english_contract(self) -> None:
record = self.mapper.listing_to_car_record(
MobileDeListing(
id="2002",
url="https://suchen.mobile.de/fahrzeuge/details.html?id=2002",
title="BMW X2",
raw={"attr": {"ecol": "Золотистый Металлик Матовый"}},
)
)
self.assertEqual(record.color, "gold")
def test_truncated_white_color_maps_to_english_contract(self) -> None:
record = self.mapper.listing_to_car_record(
MobileDeListing(
id="2003",
url="https://suchen.mobile.de/fahrzeuge/details.html?id=2003",
title="BMW 320",
raw={"attr": {"ecol": "Wei"}},
)
)
self.assertEqual(record.color, "white")
def test_unknown_color_maps_to_other(self) -> None:
record = self.mapper.listing_to_car_record(
MobileDeListing(
id="2004",
url="https://suchen.mobile.de/fahrzeuge/details.html?id=2004",
title="BMW 320",
raw={"attr": {"ecol": "Неизвестное покрытие"}},
)
)
self.assertEqual(record.color, "other")
def test_right_hand_drive_maps_from_russian_feature(self) -> None:
record = self.mapper.detail_to_car_record(
"2005",
{
"shortTitle": "BMW 320",
"features": ["Правый руль"],
},
)
self.assertEqual(record.steering_wheel, "RIGHT")
def test_right_hand_drive_maps_from_explicit_flag(self) -> None:
record = self.mapper.detail_to_car_record(
"2006",
{
"shortTitle": "BMW 320",
"rightHandDrive": True,
},
)
self.assertEqual(record.steering_wheel, "RIGHT")
def test_russian_detail_values_and_exact_gallery_map_to_english_contract(self) -> None:
first = "img.classistatic.de/api/v1/mo-prod/images/a1/a1111111-1111-4111-8111-111111111111"
second = "img.classistatic.de/api/v1/mo-prod/images/b2/b2222222-2222-4222-8222-222222222222"
@@ -482,6 +551,11 @@ class TestMobileDeMapper(unittest.TestCase):
"model": {"localized": "Macan"},
"price": {"grs": {"amount": 59900, "currency": "EUR"}},
"isConditionNew": "false",
"isDamageCase": True,
"features": [
"Привод на четыре колеса",
"Машина некурящего водителя",
],
"attributes": [
{"tag": "firstRegistration", "value": "04/2022"},
{"tag": "mileage", "value": "149 300 км"},
@@ -503,8 +577,12 @@ class TestMobileDeMapper(unittest.TestCase):
self.assertEqual(record.gearbox, "AT")
self.assertEqual(record.body_type, "SUV")
self.assertEqual(record.engine_volume, 2894)
self.assertEqual(record.drive, "4WD")
self.assertTrue(record.one_owner)
self.assertTrue(record.is_damaged)
self.assertTrue(record.non_smoking)
self.assertTrue(record.repair_history)
self.assertFalse(record.rental)
self.assertFalse(record.new_car)
self.assertEqual(len(record.images), 2)
self.assertEqual(
@@ -515,6 +593,42 @@ class TestMobileDeMapper(unittest.TestCase):
],
)
def test_detail_is_new_ad_does_not_mean_new_car(self) -> None:
record = self.mapper.detail_to_car_record(
"2003",
{
"shortTitle": "BMW X5",
"make": {"localized": "BMW"},
"model": {"localized": "X5"},
"isNew": True,
"isConditionNew": False,
"attributes": [
{"tag": "firstRegistration", "value": "05/2023"},
{"tag": "mileage", "value": "108 398 км"},
{"tag": "damageCondition", "value": "Подержанный"},
],
},
)
self.assertFalse(record.new_car)
def test_russian_mechanics_and_bmw_ix_body_are_mapped(self) -> None:
record = self.mapper.detail_to_car_record(
"2004",
{
"shortTitle": "BMW iX3",
"make": {"localized": "BMW"},
"model": {"localized": "iX3"},
"attributes": [
{"tag": "transmission", "value": "Механика"},
{"tag": "category", "value": "Иное"},
],
},
)
self.assertEqual(record.gearbox, "MT")
self.assertEqual(record.body_type, "SUV")
if __name__ == "__main__":
unittest.main()