You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
3.2 KiB
Python

# backend/tests/test_normalize_golden.py — C5 정규화 골든(provider → 내부 모델 고정 매핑)
import base64
from app.connectors.base import RawRecord
from app.connectors.calendar.normalize import normalize_event
from app.connectors.finance.normalize import categorize, normalize_tx
from app.connectors.mail.normalize import normalize_email
from app.models import ConnectorAccount, ConnectorDomain
def _b64(s: str) -> str:
return base64.urlsafe_b64encode(s.encode("utf-8")).decode("utf-8").rstrip("=")
def _acct(aid, domain, name="x", tone="blue"):
return ConnectorAccount(id=aid, domain=ConnectorDomain(domain), name=name, tone=tone)
def test_gmail_email_golden():
acct = _acct("ca-mail-personal", "mail")
payload = {
"id": "gmail-1",
"labelIds": ["UNREAD", "IMPORTANT", "CATEGORY_PERSONAL", "STARRED"],
"snippet": "미리보기 텍스트",
"internalDate": "1718000000000",
"payload": {
"headers": [
{"name": "From", "value": "hyunwoo@lumi.co"},
{"name": "To", "value": "jiwoo@lumi.co"},
{"name": "Subject", "value": "온보딩 시안 v3"},
],
"parts": [
{"mimeType": "text/plain", "body": {"data": _b64("본문 라인1\n본문 라인2")}},
{"filename": "spec.pdf", "body": {}},
],
},
}
norm = normalize_email(acct, RawRecord("gmail-1", payload, etag="hist1"), provider="gmail")
f = norm.fields
assert norm.entity_type == "email"
assert f["account"] == "personal"
assert f["from_key"] == "hyunwoo@lumi.co"
assert f["to"] == "jiwoo@lumi.co"
assert f["subject"] == "온보딩 시안 v3"
assert f["body"] == ["본문 라인1", "본문 라인2"]
assert f["labels"] == ["중요", "개인"]
assert f["read"] is False # UNREAD 존재
assert f["starred"] is True
assert f["has_attach"] is True
def test_google_calendar_event_golden():
acct = _acct("ca-cal-google", "calendar")
payload = {
"id": "ev-1",
"summary": "분기 전략 미팅",
"location": "대회의실",
"start": {"dateTime": "2026-06-10T14:00:00+09:00"},
"end": {"dateTime": "2026-06-10T15:00:00+09:00"},
"attendees": [{"email": "a@x.co"}, {"email": "b@x.co"}],
}
norm = normalize_event(acct, RawRecord("ev-1", payload), provider="google_calendar")
f = norm.fields
assert norm.entity_type == "event"
assert f["day"] == 10 and f["start"] == "14:00" and f["end"] == "15:00"
assert f["title"] == "분기 전략 미팅" and f["loc"] == "대회의실"
assert f["cal"] == "work" # 유효 calendar 로 폴백
assert f["people"] == "a@x.co, b@x.co"
def test_finance_categorize():
assert categorize("스타벅스 강남R점") == "카페·간식"
assert categorize("카카오T 택시") == "교통"
assert categorize("넷플릭스 멤버십") == "구독"
acct = _acct("ca-fin-woori", "finance", name="우리카드")
norm = normalize_tx(
acct, RawRecord("t1", {"merchant": "쿠팡", "amount": "23,900", "date": "2026-06-08"})
)
assert norm.fields["amount"] == 23900 and norm.fields["category"] == "쇼핑"
assert norm.fields["account_label"] == "우리카드"