from __future__ import annotations import json from mobilede_scraper.browser.fast_client import ( DETAIL_MARKER, LISTING_MARKER, build_resizer_images_from_keys, is_challenge_response, parse_listing_page, parse_product_details_vm, ) from mobilede_scraper.parsing.fast_mapper import FastCarMapper def test_parse_listing_page_extracts_hidden_payloads() -> None: gbp = {"CurrentPage": 1, "PageSize": 100} vehicles = [ { "Id": "45078011~US", "Tenant": "US", "InventoryStatus": "RS", "Currency": "USD", "PreBidIndicator": True, } ] html = ( f'' f'' '' '' '' ) parsed = parse_listing_page(html) assert parsed.result_count == 1 assert parsed.page_size == 100 assert parsed.current_page == 1 assert parsed.vehicles[0].inventory_id == "45078011~US" assert parsed.vehicles[0].inventory_status == "RS" def test_parse_product_details_vm_and_map_record() -> None: payload = { "inventoryView": { "attributes": { "Id": "45078011~US", "Year": "2002", "Make": "ACURA", "Model": "RSX", "Series": "BASE", "Currency": "USD", "ODOValue": "219187", "ExteriorColor": "GRAY", "DriveLineTypeDesc": "FWD", "Transmission": "Automatic", "BodyStyleName": "COUPE", "EngineSize": "2.0L I-4", "VehicleGrade": "50", "PrimaryDamageDesc": "NORMAL WEAR & TEAR", }, "imageDimensions": { "keys": { "$values": [ {"k": "45078011~US~I1", "w": 1600, "h": 1200, "i": 0}, ] } }, }, "auctionInformation": { "prebidInformation": {"decimalHighBidAmount": "600", "highBidAmount": "$600"}, "biddingInformation": {"buyNowPrice": "$0"}, }, } html = f'' parsed = parse_product_details_vm(html) record = FastCarMapper().map_payload_to_record( detail_payload=parsed, vehicle_url="https://www.MOBILEDE.com/VehicleDetail/45078011~US", ) assert record.origin_id == "mobilede:45078011" assert record.brand == "ACURA" assert record.model == "RSX BASE" assert record.year == 2002 assert record.price == 600 assert record.drive == "FWD" assert record.gearbox == "AT" assert record.body_type == "COUPE" assert record.engine_volume == 2000 assert record.is_damaged is False assert len(record.images) == 1 def test_fast_mapper_uses_fallback_keys_and_normalization() -> None: payload = { "inventoryView": { "attributes": { "Id": "454502861", "FirstRegistration": "05/2012", "Make": "BMW", "Model": "X1", "Variant": "xDrive 20d", "Currency": "EUR", "Mileage": "50.100 km", "ColorDesc": "silber metallic", "Category": "Kombi", "TransmissionType": "Schaltgetriebe", "EngineInformation": "1995 ccm, Diesel", }, "imageDimensions": { "keys": { "$values": [ {"k": "454502861~I1", "w": 1600, "h": 1200, "i": 0}, ] } }, }, "auctionInformation": { "biddingInformation": {"buyNowPrice": "9.900 €"}, }, } record = FastCarMapper().map_payload_to_record( detail_payload=payload, vehicle_url="https://www.mobile.de/ru/транспортные-средства/подробности.html?id=454502861&vc=Car&s=Car", ) assert record.model == "X1 xDrive 20d" assert record.year == 2012 assert record.price == 9900 assert record.mileage == 50100 assert record.color == "silver" assert record.drive == "4WD" assert record.gearbox == "MT" assert record.body_type == "STATION_WAGON" assert record.engine_volume == 1995 def test_build_resizer_images_from_keys_deduplicates_and_orders() -> None: keys = [ {"k": "abc~1", "w": 2000, "h": 1500, "i": 2}, {"k": "abc~1", "w": 2000, "h": 1500, "i": 2}, {"k": "abc~2", "w": 1800, "h": 1200, "i": 1}, ] images = build_resizer_images_from_keys(keys) assert len(images) == 2 assert images[0]["order_index"] == 1 assert "imageKeys=abc~2" in str(images[0]["fullres_image"]) def test_is_challenge_response_marker_rules() -> None: assert is_challenge_response(status_code=403, body_text="", expected_marker=None) is True assert is_challenge_response(status_code=200, body_text="blocked", expected_marker=LISTING_MARKER) is True assert is_challenge_response( status_code=200, body_text=f'{DETAIL_MARKER}', expected_marker=DETAIL_MARKER, ) is False