oem_crawler/tests/test_porsche_parser.py
2026-11-07 16:53:30 +01:00

285 lines
12 KiB
Python

"""
Unit tests for the Porsche Finder parser and normalization logic.
"""
from decimal import Decimal
import pytest
from oem_crawler.crawlers.base import CrawlerRegistry
from oem_crawler.crawlers.porsche.parser import (
map_porsche_drivetrain,
map_porsche_fuel_type,
map_porsche_series,
map_porsche_transmission,
parse_porsche_vehicle,
)
from oem_crawler.db.schemas import (
BatteryCapacityUnit,
DrivetrainType,
FuelType,
TransmissionType,
VehicleCondition,
VehicleStatus,
)
class TestPorscheParser:
def test_registry_contains_porsche(self):
assert "porsche" in CrawlerRegistry.supported_brands()
crawler_cls = CrawlerRegistry.get("porsche")
crawler = crawler_cls(market_country="DE")
assert crawler.brand_name == "PORSCHE"
def test_map_fuel_type(self):
assert map_porsche_fuel_type("ELECTRIC") == FuelType.BEV
assert map_porsche_fuel_type("Elektro") == FuelType.BEV
assert map_porsche_fuel_type("PLUG_IN_HYBRID") == FuelType.PHEV
assert map_porsche_fuel_type("MILD_HYBRID") == FuelType.MHEV
assert map_porsche_fuel_type("DIESEL") == FuelType.DIESEL
assert map_porsche_fuel_type("PETROL") == FuelType.PETROL
assert map_porsche_fuel_type("Benzin") == FuelType.PETROL
def test_map_transmission(self):
assert map_porsche_transmission("PDK (Automatik)") == TransmissionType.AUTOMATIC
assert map_porsche_transmission("Automatik") == TransmissionType.AUTOMATIC
assert map_porsche_transmission("Manuell") == TransmissionType.MANUAL
assert map_porsche_transmission(None) is None
def test_map_drivetrain(self):
assert map_porsche_drivetrain("ALL_WHEEL_DRIVE") == DrivetrainType.AWD
assert map_porsche_drivetrain("Allradantrieb") == DrivetrainType.AWD
assert map_porsche_drivetrain("REAR_WHEEL_DRIVE") == DrivetrainType.RWD
assert map_porsche_drivetrain("Heckantrieb") == DrivetrainType.RWD
def test_map_series(self):
assert map_porsche_series("Taycan", None) == "Taycan"
assert map_porsche_series("911", None) == "911"
assert map_porsche_series("Macan", None) == "Macan"
assert map_porsche_series("Cayenne", None) == "Cayenne"
assert map_porsche_series("Panamera", None) == "Panamera"
assert map_porsche_series("718", None) == "718"
assert map_porsche_series(None, "Porsche 911 Carrera 4S") == "911"
assert map_porsche_series(None, "Porsche Taycan 4S") == "Taycan"
def test_parse_porsche_new_ice_vehicle(self):
search_item = {
"id": "RNR7NZ",
"listingUrlSlug": "porsche-911-carrera-4s-cabriolet-neu-RNR7NZ",
"meta": {
"title": "911 Carrera 4S Cabriolet",
"condition": "new",
"priceValue": 220231.42,
"priceCurrency": "EUR",
"numberOfPreviousOwners": 0,
"mileage": {"value": 0, "unitCode": "KMT"},
"model": "992 II",
"interiorColor": "Lederausstattung Schwarz",
"color": "Schiefergrau Neo",
"transmission": "PDK (Automatik)",
"modelYear": 2026,
"engineType": "PETROL",
"modelCategory": "911",
"bodyType": "Cabriolet",
"drivetrain": "ALL_WHEEL_DRIVE",
"enginePower": 353,
"engineDisplacement": 2981,
"co2Emissions": 245,
"fuelConsumption": 10.8,
"seller": {
"sellerId": "8066",
"porschePartnerNumber": "1110050",
"name": "Porsche Zentrum Berlin-Potsdam",
"addressComponents": {
"postalCode": "14532",
"city": "Kleinmachnow",
"street": "Albert-Einstein-Ring 49",
},
},
},
"dataLayerListingMeta": {
"car": {
"isPorscheApproved": False,
"exteriorColorCode": "2T",
"interiorColorCode": "VF",
}
},
"gallery": {
"imageIds": ["dcf0d51e-230b-444f-bcb2-d37c8f631d98"]
},
"description": {
"title": "Porsche 911 Carrera 4S Cabriolet",
"periodicPayments": {
"paymentLabel": "2808 per month",
},
},
}
detail_data = {
"equipment": {
"specialEquipment": [
{
"name": "Exterieur",
"items": [
{"code": "KQ2", "name": "„PORSCHE“ Schriftzug lackiert in Schwarz", "description": "Hochglanz"},
{"code": "3FG", "name": "Panoramadach", "description": "Glas"},
],
}
],
"importantEquipmentOptions": [
{"value": "bose-sound-system", "label": "BOSE Surround Sound-System"}
],
},
"summary": {
"characteristics": [
{"title": "Motor", "value": "Benzin"},
{"title": "Leistung Verbrennungsmotor", "value": "353 kW / 480 PS"},
]
},
"info": {
"stockNumber": "D27829",
"commissionNumber": "D27829",
"vin": "$undefined",
},
}
veh = parse_porsche_vehicle(search_item, detail_data, market_country="DE", requested_stock_type="new")
assert veh.brand == "PORSCHE"
assert veh.oem_vehicle_id == "RNR7NZ"
assert veh.vin is None
assert veh.series == "911"
assert veh.model_name == "911 Carrera 4S Cabriolet"
assert veh.trim_line == "992 II"
assert veh.body_type == "Cabriolet"
assert veh.condition == VehicleCondition.NEW
assert veh.fuel_type == FuelType.PETROL
assert veh.transmission == TransmissionType.AUTOMATIC
assert veh.drivetrain == DrivetrainType.AWD
assert veh.power_kw == 353
assert veh.power_hp == 480
assert veh.engine_displacement_cc == 2981
assert veh.price_gross == Decimal("220231.42")
assert veh.monthly_rate == Decimal("2808")
assert veh.dealer_name == "Porsche Zentrum Berlin-Potsdam"
assert veh.location_city == "Kleinmachnow"
assert veh.location_postal_code == "14532"
assert veh.location_country == "DE"
assert len(veh.options) == 3
option_codes = {opt.option_code for opt in veh.options}
assert "KQ2" in option_codes
assert "3FG" in option_codes
assert "bose-sound-system" in option_codes
assert veh.image_urls == ["https://images.finder.porsche.com/dcf0d51e-230b-444f-bcb2-d37c8f631d98/960.webp"]
def test_parse_porsche_used_certified_vehicle(self):
search_item = {
"id": "P00XDK",
"listingUrlSlug": "porsche-macan-gebraucht-P00XDK",
"meta": {
"title": "Macan",
"condition": "preowned",
"priceValue": 56900,
"priceCurrency": "EUR",
"numberOfPreviousOwners": 1,
"mileage": {"value": 35050, "unitCode": "KMT"},
"model": "H1 III",
"color": "Tiefschwarzmetallic",
"firstRegistration": "2022-01-04",
"modelYear": 2022,
"engineType": "PETROL",
"modelCategory": "Macan",
"bodyType": "SUV",
"drivetrain": "ALL_WHEEL_DRIVE",
"enginePower": 195,
"seller": {
"sellerId": "15713",
"name": "Porsche Zentrum Essen",
"addressComponents": {"postalCode": "45143", "city": "Essen"},
},
},
"dataLayerListingMeta": {
"car": {
"isPorscheApproved": True,
}
},
"description": {
"title": "Porsche Macan",
"periodicPayments": {
"paymentLabel": "765.26 per month",
},
},
}
veh = parse_porsche_vehicle(search_item, detail_data=None, market_country="DE", requested_stock_type="used")
assert veh.brand == "PORSCHE"
assert veh.oem_vehicle_id == "P00XDK"
assert veh.series == "Macan"
assert veh.condition == VehicleCondition.CERTIFIED_PRE_OWNED
assert veh.mileage_km == 35050
assert veh.price_gross == Decimal("56900")
assert veh.monthly_rate == Decimal("765.26")
assert veh.dealer_name == "Porsche Zentrum Essen"
assert veh.location_city == "Essen"
assert veh.location_postal_code == "45143"
def test_parse_porsche_electric_option_c(self):
search_item = {
"id": "EK6EW6",
"listingUrlSlug": "porsche-taycan-sport-turismo-black-edition-neu-EK6EW6",
"meta": {
"title": "Taycan Sport Turismo Black Edition",
"condition": "new",
"priceValue": 131063,
"priceCurrency": "EUR",
"mileage": {"value": 0, "unitCode": "KMT"},
"model": "J1 II",
"color": "Eisgraumetallic",
"engineType": "ELECTRIC",
"modelCategory": "Taycan",
"bodyType": "Sport Turismo",
"drivetrain": "REAR_WHEEL_DRIVE",
"enginePower": 320,
"seller": {
"name": "Porsche Zentrum Berlin-Adlershof",
"addressComponents": {"postalCode": "12487", "city": "Berlin"},
},
},
"dataLayerListingMeta": {
"car": {"isPorscheApproved": False}
},
}
detail_data = {
"equipment": {
"specialEquipment": [
{
"name": "Motor, Getriebe und Fahrwerk",
"items": [
{"code": "KB3", "name": "On-Board AC-Lader mit 22 kW", "description": "Schnelles Laden"},
],
}
]
},
"summary": {
"characteristics": [
{"title": "Motor", "value": "Elektro"},
{"title": "Reichweite kombiniert (WLTP)", "value": "636 km"},
{"title": "Brutto-Energieinhalt Batterie", "value": "105,0 kWh"},
{"title": "Ladezeit für Gleichstrom (DC) mit maximaler Ladeleistung (10 auf bis zu 80%)", "value": "18,00 min"},
{"title": "Antrieb", "value": "Heckantrieb"},
]
},
}
veh = parse_porsche_vehicle(search_item, detail_data, market_country="DE", requested_stock_type="new")
assert veh.brand == "PORSCHE"
assert veh.series == "Taycan"
assert veh.fuel_type == FuelType.BEV
assert veh.drivetrain == DrivetrainType.RWD
assert veh.battery_capacity == Decimal("105.0")
assert veh.battery_capacity_unit == BatteryCapacityUnit.KWH
assert veh.electric_range_wltp_km == 636
assert veh.charging_time_dc_minutes == 18
assert veh.charging_power_ac_kw == Decimal("22.00")
assert veh.charging_power_dc_kw == Decimal("320.00")