285 lines
12 KiB
Python
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")
|