from __future__ import annotations from legal_mcp.services import extractor as ex # Nevo preamble block shared by the Nevo-sourced cases. _PREAMBLE = ( "חקיקה שאוזכרה:\n" "חוק התכנון והבניה, תשכ\"ה-1965: סע' 197\n\n" "מיני-רציו:\n" "* העותרים לא הוכיחו טעם מיוחד.\n" "ביהמ\"ש העליון דחה את העתירה בקובעו:\n" "המחוקק הגביל את הזמן ל-3 שנים.\n\n" ) def test_strips_court_ruling_judge_opening(): # #86.1: court rulings open with the authoring judge — previously NOT stripped. text = _PREAMBLE + "השופט ס' ג'ובראן:\n\nהאם קיימים טעמים מיוחדים..." out = ex.strip_nevo_preamble(text) assert out.startswith("השופט ס' ג'ובראן:") assert "מיני-רציו" not in out assert "דחה את העתירה בקובעו" not in out def test_strips_court_ruling_pdin_header(): text = _PREAMBLE + "פסק-דין\n\nלפנינו עתירה..." out = ex.strip_nevo_preamble(text) assert out.startswith("פסק-דין") assert "מיני-רציו" not in out def test_strips_vaada_opening_regression(): # existing behaviour must keep working text = _PREAMBLE + "בפנינו ערר על החלטת הוועדה המקומית..." out = ex.strip_nevo_preamble(text) assert out.startswith("בפנינו ערר") assert "מיני-רציו" not in out def test_non_nevo_unchanged(): # no Nevo markers → returned as-is even though it has a judge line text = "פסק דין\nהשופט כהן: בעניין שלפנינו..." assert ex.strip_nevo_preamble(text) == text def test_nevo_markers_but_no_body_start_unchanged(): # markers present but nothing that looks like a decision body → leave intact text = "מיני-רציו:\n* תקציר בלבד ללא גוף החלטה\n" assert ex.strip_nevo_preamble(text) == text def test_markers_past_400_chars_still_detected(): # a long court/parties header pushes the markers past the old 400-char window header = "בבית המשפט העליון " + ("x " * 200) + "\n" # ~600 chars text = header + _PREAMBLE + "השופטת ע' ארבל:\n\nגוף ההחלטה..." out = ex.strip_nevo_preamble(text) assert out.startswith("השופטת ע' ארבל:") # ── extract_nevo_ratio (#86.3 gold-set capture) ── def test_extract_ratio_returns_block_before_body(): text = _PREAMBLE + "השופט ס' ג'ובראן:\n\nגוף ההחלטה..." ratio = ex.extract_nevo_ratio(text) assert "העותרים לא הוכיחו טעם מיוחד" in ratio assert "המחוקק הגביל את הזמן" in ratio # must not bleed into the judgment body assert "גוף ההחלטה" not in ratio assert "השופט ס' ג'ובראן" not in ratio def test_extract_ratio_stops_at_following_marker(): # ratio first, then a bibliography marker AFTER it text = ( "מיני-רציו:\n* עיקרון אחד בלבד.\n\n" "פסקי דין שאוזכרו:\nבג\"ץ 1/00\n\n" "פסק-דין\nגוף..." ) ratio = ex.extract_nevo_ratio(text) assert "עיקרון אחד בלבד" in ratio assert "פסקי דין שאוזכרו" not in ratio assert "בג\"ץ 1/00" not in ratio def test_extract_ratio_empty_when_no_marker(): assert ex.extract_nevo_ratio("פסק דין\nהשופט כהן: ...") == "" assert ex.extract_nevo_ratio("") == "" # ── #86.2 over-strip regressions ── def test_citation_judge_line_is_not_a_decision_start(): # "השופט מ' חשין, פסקה 23" is a CITATION (comma, no colon) — must NOT be # treated as the decision opening, or 32K of real body gets stripped. body = ( "**פסק דין**\n\n" "שני ערעורים לפניי. כפי שנפסק מפי כבוד \n\n" "השופט מ' חשין, פסקה 23 (להלן עניין קהתי), יש לבחון...\n" ) text = _PREAMBLE + body out = ex.strip_nevo_preamble(text) assert out.startswith("**פסק דין**") assert "השופט מ' חשין, פסקה" in out # citation kept inside body assert "מיני-רציו" not in out def test_markdown_wrapped_pdin_header_is_stripped(): text = _PREAMBLE + "**פסק דין**\n\nשני ערעוריה הנדונים..." out = ex.strip_nevo_preamble(text) assert out.startswith("**פסק דין**") assert "מיני-רציו" not in out def test_author_line_with_colon_still_strips(): text = _PREAMBLE + "כב' השופטת ד' ברק-ארז:\n\nגוף ההחלטה..." out = ex.strip_nevo_preamble(text) assert out.startswith("כב' השופטת ד' ברק-ארז:") assert "מיני-רציו" not in out