from pathlib import Path from app.discovery.urlgen import generate_search_url from app.sources.geizhals.taxonomy_parser import parse_taxonomy_html HTML = (Path(__file__).resolve().parents[2] / "fixtures" / "geizhals" / "nb-category.html").read_text( encoding="utf-8" ) def test_parser_reads_href_filters_and_price_inputs() -> None: payload = parse_taxonomy_html( HTML, category_ref="nb", source_url="https://geizhals.de/?cat=nb", ) keys = {item["external_filter_key"] for item in payload["filters"]} assert {"12", "17023", "price", "12128", "7436", "82", "asuch"} <= keys assert len(payload["filters"]) >= 12 live_ram = next(item for item in payload["filters"] if item["external_filter_key"] == "17023") assert live_ram["label"] == "RAM" ram = next(item for item in payload["filters"] if item["external_filter_key"] == "12") assert ram["label"] == "RAM ab" assert ram["filter_type"] == "NUMERIC_THRESHOLD" assert any(option["source_value"] == "ab 16GB" for option in ram["options"]) assert ram["encoding"]["options"]["ab 16GB"] == "16384" price = next(item for item in payload["filters"] if item["external_filter_key"] == "price") assert price["filter_type"] == "NUMERIC_RANGE" assert price["encoding"]["min_parameter"] == "bpmin" assert price["encoding"]["max_parameter"] == "bpmax" hersteller = next(item for item in payload["filters"] if item["external_filter_key"] == "1") assert hersteller["label"] == "Hersteller" assert hersteller["filter_type"] == "ENUM" assert hersteller["group_label"] == "Allgemein" assert {option["source_value"] for option in hersteller["options"]} >= {"Apple", "ASUS", "Lenovo"} display = next(item for item in payload["filters"] if item["external_filter_key"] == "12128") assert display["group_label"] == "Display" def test_learned_ram_and_price_encode_observed_geizhals_query() -> None: payload = parse_taxonomy_html( HTML, category_ref="nb", source_url="https://geizhals.de/?cat=nb", ) ram = next(item for item in payload["filters"] if item["external_filter_key"] == "12") price = next(item for item in payload["filters"] if item["external_filter_key"] == "price") url, internal = generate_search_url( category_url="https://geizhals.de/?cat=nb", criteria_items=[ {"criterion": "geizhals:nb:12", "operator": ">=", "value": 16}, {"criterion": "geizhals:nb:price", "operator": "<=", "value": 1700}, ], mappings=[ { "criterion_key": "geizhals:nb:12", "external_filter_key": "12", "source_value": "16384", "encoding": ram["encoding"], "status": "VERIFIED", }, { "criterion_key": "geizhals:nb:price", "external_filter_key": "price", "source_value": None, "encoding": price["encoding"], "status": "VERIFIED", }, ], ) assert internal == [] assert "xf=12_16384" in url assert "bpmax=1700" in url def test_challenge_html_is_not_treated_as_taxonomy() -> None: payload = parse_taxonomy_html( "Enable JavaScript and cookies to continue", category_ref="nb", source_url="https://geizhals.de/?cat=nb", ) assert payload["blocked"] is True assert payload["filters"] == []