""" 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")