o2o-plagiarism-ai/tests/test_training_data.py

69 lines
2.2 KiB
Python

"""수령 원고 익명화·그룹 분리 회귀 테스트."""
from __future__ import annotations
from pathlib import Path
from openpyxl import Workbook
from app.engine.training_data import (
pseudonymous_id,
redact_direct_identifiers,
sanitize_prompt_metadata,
)
from scripts.build_ai_training_dataset import load_human_from_xlsx
def test_pseudonymous_id_is_stable_and_salt_scoped():
assert pseudonymous_id("writer@example.com", "salt-a") == pseudonymous_id(
"writer@example.com", "salt-a"
)
assert pseudonymous_id("writer@example.com", "salt-a") != pseudonymous_id(
"writer@example.com", "salt-b"
)
assert "writer" not in pseudonymous_id("writer@example.com", "salt-a")
def test_direct_identifiers_are_redacted():
text = "연락처 writer@example.com, 010-1234-5678, 900101-1234567"
redacted = redact_direct_identifiers(text)
assert "writer@example.com" not in redacted
assert "010-1234-5678" not in redacted
assert "900101-1234567" not in redacted
def test_prompt_metadata_removes_named_autobiography_title():
assert sanitize_prompt_metadata("홍길동의 자서전") == "익명 작성자의 자서전"
def test_received_schema_uses_author_group_without_raw_identifier(tmp_path: Path):
path = tmp_path / "received.xlsx"
wb = Workbook()
ws = wb.active
ws.title = "bio"
ws.append(["id", "자서전 제목", "에피소드 제목", "에피소드 본문"])
ws.append([
"writer@example.com", "홍길동의 자서전", "첫 직장",
"이메일 writer@example.com으로 연락했다. " + "인생을 기록했다. " * 20,
])
wb.save(path)
records = load_human_from_xlsx(
path,
text_column="에피소드 본문",
book_column="자서전 제목",
id_column="id",
sheet=None,
min_chars=100,
group_column="id",
anonymization_salt="test-salt",
provenance="combooks_confirmed_human",
)
assert len(records) == 1
record = records[0]
assert record.source_group.startswith("author:")
assert record.book == ""
assert "writer@example.com" not in record.text
assert record.meta["human_verified"] is True
assert record.meta["ai_assistance"] is False