schoolbridge / backend /tests /test_card_builder.py
tsKim
feat: schoolbridge spaces deploy (extract-text endpoint added)
7f105c8
"""card_builder 슬롯 카드 빌드 + dedup 단위 테스트."""
from app.models.schemas import SlotCard
from app.services.card_builder import _dedup_cards
def _card(header: str, value: str, importance: float = 0.5) -> SlotCard:
return SlotCard(
header_ko=header,
header_translated=header,
value_ko=value,
value_easy_ko=value,
value_translated=value,
chip=None,
importance=importance,
)
def test_dedup_removes_substring_within_same_header():
"""같은 헤더 안에서 짧은 value가 긴 value 안에 들어있으면 짧은 것 제거 — 본문/표 영역 중복 흡수."""
cards = [
_card("운영방법", "온라인 사전예약 100명 선착순 5가지 체험 안전 복장", 0.99),
_card("운영방법", "온라인 사전예약 100명 선착순", 0.53), # substring
]
out = _dedup_cards(cards)
assert len(out) == 1
assert out[0].importance == 0.99 # 긴 쪽이 살아남음
def test_dedup_keeps_different_headers():
"""헤더가 다르면 손대지 않음 — 운영방법과 일시는 별개 슬롯."""
cards = [
_card("운영방법", "온라인 사전예약", 0.9),
_card("일시", "2026. 4. 18.(토)", 0.7),
_card("신청 URL", "http://example.com", 0.7),
]
out = _dedup_cards(cards)
assert len(out) == 3
def test_dedup_normalizes_pipe_and_colon_separators():
"""`|`/`:` 구분자 차이로 substring 매칭 놓치는 것 방지 — 윤정님 기호 정제 전후 둘 다 호환."""
cards = [
_card("운영방법", "온라인 사전예약 100명 선착순", 0.99),
_card("운영방법", "온라인 | 사전예약 | 100명 선착순", 0.50), # `|` 구분자만 다름
]
out = _dedup_cards(cards)
assert len(out) == 1
def test_dedup_keeps_distinct_values_under_same_header():
"""같은 헤더라도 substring 관계 아니면 둘 다 유지 — 정보 손실 방지."""
cards = [
_card("기타", "물 지참", 0.8),
_card("기타", "음식물 반입 금지", 0.6),
]
out = _dedup_cards(cards)
assert len(out) == 2