69 lines
2.2 KiB
Python
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
|