"""Der Parametersatz haengt am Modell - das war ein echter Produktionsfehler: claude-haiku-4-5 lehnt output_config.effort mit einem 400 ab. """ from app import extract def test_effort_nur_fuer_modelle_die_es_koennen(): assert "claude-haiku-4-5".startswith(extract._NO_EFFORT) assert "claude-sonnet-4-5".startswith(extract._NO_EFFORT) assert not "claude-opus-5".startswith(extract._NO_EFFORT) assert not "claude-sonnet-5".startswith(extract._NO_EFFORT) def test_server_seitiger_fallback_nur_fuer_die_grossen(): assert "claude-opus-5".startswith(extract._WITH_FALLBACK) assert "claude-fable-5-1".startswith(extract._WITH_FALLBACK) assert not "claude-haiku-4-5".startswith(extract._WITH_FALLBACK) assert not "claude-sonnet-5".startswith(extract._WITH_FALLBACK) def test_output_config_ohne_effort_bleibt_gueltig(): ohne = extract._output_config(with_effort=False) mit = extract._output_config(with_effort=True) assert "effort" not in ohne assert ohne["format"]["type"] == "json_schema" assert mit["effort"] == "low" assert mit["format"] == ohne["format"] def test_schema_verlangt_alle_felder_und_verbietet_zusaetze(): assert extract.SCHEMA["additionalProperties"] is False assert set(extract.SCHEMA["required"]) == { "is_business_card", "rotation", *extract.FIELDS, } for field in extract.FIELDS: assert extract.SCHEMA["properties"][field]["type"] == ["string", "null"] def test_rotation_ist_auf_vier_werte_beschraenkt(): """Das Modell sagt uns, wie herum die Karte gehoert - geometrisch ist das nicht bestimmbar.""" assert extract.SCHEMA["properties"]["rotation"]["enum"] == [0, 90, 180, 270]