# backend/tests/test_normalize_golden.py — C5 정규화 골든(provider → 내부 모델 고정 매핑) import base64 from app.connectors.base import RawRecord from app.connectors.calendar.normalize import account_calendar_id, normalize_event 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 # 수신 시각: internalDate(epoch ms) → aware datetime(정렬·표시 기준). assert f["received_at"] is not None assert f["received_at"].year == 2024 # 1718000000000ms = 2024-06-10 def test_gmail_plain_strips_conditional_comments_and_vml(): """text/plain 파트에 MSO 조건부 주석·VML 블록· 래핑이 섞인 (Google 알림류) 메일. 본문에 HTML 잔재가 남지 않고 URL 은 언랩되어 보존되어야 한다.""" acct = _acct("ca-mail-personal", "mail") body = ( "\n" "\n" "본인의 계정으로 로그인했습니다\n" "magnific.com\n" "\n" "계정으로 이동\n" "© 2026 Google LLC" ) payload = { "id": "gmail-2", "labelIds": ["CATEGORY_UPDATES"], "snippet": "스니펫", "internalDate": "1718000000000", "payload": { "mimeType": "text/plain", "body": {"data": _b64(body)}, }, } norm = normalize_email(acct, RawRecord("gmail-2", payload, etag="h"), provider="gmail") text = "\n".join(norm.fields["body"]) assert "