# 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"] == "우리카드"