"""测试 cf_temp_email provider。 注:历史 cloud-mail API(`/account/list` `/email/list` `/email/latest`)在 cloudmail.py 切到 dreamhunter2333/cloudflare_temp_email 时已经不再适用,这些用例改为针对当前 `/admin/*` 路由的实现。OTP 提取测试与后端无关,沿用原断言。 """ from autoteam import accounts, cloudflare_temp_email from autoteam.mail import cf_temp_email def test_search_emails_by_recipient_returns_normalized_records(monkeypatch): client = cf_temp_email.CfTempEmailClient() target = "tmp-user@example.com" monkeypatch.setattr(accounts, "load_accounts", lambda: []) class _Resp: status_code = 200 def __init__(self, payload): self._payload = payload def json(self): return self._payload raw_mime = ( "From: noreply@tm.openai.com\r\n" f"To: {target}\r\n" "Subject: Your ChatGPT code is 189799\r\n" "Message-ID: \r\n" "\r\n" "Your ChatGPT code is 189799\r\n" ) def fake_get(path, params=None): assert path == "/admin/mails" assert (params or {}).get("address") == target return _Resp( { "results": [ { "id": 15, "address": target, "raw": raw_mime, "source": "noreply@tm.openai.com", "created_at": 1761331200, } ] } ) monkeypatch.setattr(client, "_admin_get", fake_get) emails = client.search_emails_by_recipient(target, size=5) assert len(emails) == 1 assert emails[0]["emailId"] == 15 assert emails[0]["subject"] == "Your ChatGPT code is 189799" assert emails[0]["sendEmail"] == "noreply@tm.openai.com" assert emails[0]["accountEmail"] == target assert emails[0]["createTime"] == 1761331200 def test_cloudflare_temp_email_top_level_compat_uses_provider(monkeypatch): assert ( cloudflare_temp_email.normalize_cloudflare_temp_email_base_url("https://mail.example.com/admin/") == "https://mail.example.com" ) client = cloudflare_temp_email.CloudflareTempEmailClient() monkeypatch.setattr(client, "domain", "example.com") monkeypatch.setattr( client, "_request", lambda method, path, **kwargs: { "address": "tmp-user@example.com", "address_id": 321, "jwt": "token", }, ) account_id, email = client.create_temp_email(prefix="tmp-user") assert account_id == 321 assert email == "tmp-user@example.com" def test_extract_helpers_prefer_ai_extract_metadata(): client = cf_temp_email.CfTempEmailClient() assert ( client.extract_verification_code( { "metadata": '{"ai_extract":{"type":"auth_code","result":"123456"}}', "subject": "ignored 654321", } ) == "123456" ) assert ( client.extract_invite_link( { "metadata": '{"ai_extract":{"type":"auth_link","result":"https://chatgpt.com/auth/login?invite=abc"}}', "content": "", } ) == "https://chatgpt.com/auth/login?invite=abc" ) def test_search_emails_by_recipient_filters_unrelated_address(monkeypatch): client = cf_temp_email.CfTempEmailClient() target = "tmp-user@example.com" monkeypatch.setattr(accounts, "load_accounts", lambda: []) class _Resp: status_code = 200 def __init__(self, payload): self._payload = payload def json(self): return self._payload def fake_get(path, params=None): return _Resp( { "results": [ { "id": 410, "address": "someone-else@example.com", "raw": "Subject: Other\r\n\r\nbody", } ] } ) monkeypatch.setattr(client, "_admin_get", fake_get) emails = client.search_emails_by_recipient(target, size=5) assert emails == [] def test_resolve_address_id_accepts_int_and_email(monkeypatch): client = cf_temp_email.CfTempEmailClient() assert client._resolve_address_id(43) == 43 assert client._resolve_address_id("43") == 43 class _Resp: status_code = 200 def __init__(self, payload): self._payload = payload def json(self): return self._payload def fake_get(path, params=None): assert path == "/admin/address" return _Resp({"results": [{"id": 99, "name": "user@example.com"}]}) monkeypatch.setattr(client, "_admin_get", fake_get) assert client._resolve_address_id("user@example.com") == 99 def test_extract_verification_code_prefers_visible_text_over_html_color_values(): client = cf_temp_email.CfTempEmailClient() email_data = { "text": None, "content": """ Your ChatGPT code is 676952

Your ChatGPT code is 676952

""", } assert client.extract_verification_code(email_data) == "676952" def test_extract_verification_code_uses_plain_text_when_available(): client = cf_temp_email.CfTempEmailClient() email_data = { "text": "Your temporary OpenAI login code is 123456", "content": "ignored", } assert client.extract_verification_code(email_data) == "123456" def test_factory_returns_cf_temp_email_by_default(monkeypatch): """工厂 + 别名兼容性:`from autoteam.cloudmail import CloudMailClient` 调用零改动。""" monkeypatch.delenv("MAIL_PROVIDER", raising=False) from autoteam.cloudmail import CloudMailClient client = CloudMailClient() assert isinstance(client, cf_temp_email.CfTempEmailClient) def test_factory_dispatches_to_maillab_when_configured(monkeypatch): monkeypatch.setenv("MAIL_PROVIDER", "maillab") monkeypatch.setenv("MAILLAB_API_URL", "http://example.com") from autoteam.cloudmail import CloudMailClient from autoteam.mail.maillab import MaillabClient client = CloudMailClient() assert isinstance(client, MaillabClient) def test_factory_rejects_unknown_provider(monkeypatch): import pytest monkeypatch.setenv("MAIL_PROVIDER", "made-up") from autoteam.mail import get_mail_client with pytest.raises(ValueError, match="未知 MAIL_PROVIDER"): get_mail_client()