o2o-plagiarism-ai/tests/test_frontend_legal_risk.py
hbyang 500a4a4600 feat: 프론트에 판례 적재·인용 현황 표시
판례가 적재돼 있는지, 이번 판단에 실제로 쓰였는지가 화면에 전혀 드러나지
않았다. 엔진은 적재본 545건을 모두 로드하고 판정마다 저작물 유형·법적 태그가
맞는 상위 5건을 인용하는데, 사용자는 "판례를 쓰고 있는가"를 알 수 없었다.

세 곳에 표시한다.
  헤더 배지   ● 정상 · 코퍼스 3건 · 판례 545건
  푸터        판례 적재: 545건
  판단 카드   관련 판례 사건번호   인용 3건 / 적재 545건

적재 수를 함께 보여 주는 것이 핵심이다. "인용 3건"만 있으면 판례를 3개만
쓰는 것처럼 읽히는데, "/ 적재 545건"이 붙어야 545건 중 이 건에 맞는 3건을
고른 결과임이 드러난다.

인용 0건과 판례 미적재도 구분했다. 겉보기엔 둘 다 판례가 없지만 앞은 정상
동작이고, 뒤는 엔진이 insufficient_precedent_data 를 내며 판단 자체를
보류하는 상태다. 설정 오류일 가능성이 높아 배지를 경고색으로 바꾼다.

API 는 이미 /v1/health 의 precedent_count 와 응답의 precedent_ids 로
필요한 값을 주고 있었다. 프론트만 쓰지 않고 있었으므로 서버 변경은 없다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-20 14:54:51 +09:00

64 lines
2.3 KiB
Python

from pathlib import Path
HTML = Path("app/static/index.html").read_text(encoding="utf-8")
def test_frontend_sends_human_verified_legal_context():
for field_id in (
"legal-work-type",
"legal-access-evidence",
"legal-protected-reviewed",
"legal-rights-verified",
):
assert f'id="{field_id}"' in HTML
assert "legal_context:" in HTML
def test_frontend_renders_llm_legal_judgment_and_safety_fields():
assert 'id="legal-risk"' in HTML
assert "function renderLegalRisk" in HTML
for field in (
"llm_verdict",
"llm_confidence",
"llm_matched_precedent_ids",
"supporting_reasons",
"counter_reasons",
"missing_factors",
"judgment_summary",
"disclaimer",
):
assert field in HTML
assert "escapeHtml(item)" in HTML
assert "법률상 침해 확정이 아닙니다" in HTML
assert "판례에 비추어 저작권 침해 의심" in HTML
assert "GPT 판례 비교" not in HTML
assert "GPT 판정" not in HTML
def test_frontend_shows_precedent_corpus_is_loaded():
"""판례 적재 여부가 화면에 드러나야 한다.
엔진은 적재본 전체를 로드하고 판정마다 상위 몇 건을 인용하는데, 화면에
그 사실이 전혀 없어서 "판례를 쓰고 있는가"를 사용자가 알 수 없었다.
"""
# 헬스 배지와 푸터에 적재 수가 나온다
assert 'id="precedent-count"' in HTML
assert "data.precedent_count" in HTML
# 판단 카드에 '인용 N건 / 적재 M건'
assert "precedentCountLabel" in HTML
assert "인용 ${selectedIds.length}건 / 적재 ${precedentCount}건" in HTML
def test_frontend_distinguishes_no_match_from_no_corpus():
"""매칭 실패와 판례 미적재는 다른 상황이므로 문구가 갈려야 한다.
앞은 이 건에 맞는 판례가 없는 것이고, 뒤는 판단 자체가 성립하지 않는다
(엔진이 insufficient_precedent_data 를 낸다).
"""
assert "판례가 적재되지 않아 판단 근거를 제시할 수 없습니다." in HTML
assert "저작물 유형·법적 태그가 맞는 판례가 없습니다." in HTML
# 미적재는 헬스 배지에서도 경고색으로 구분된다
assert "badge warn" in HTML
assert "header .badge.warn" in HTML