# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. ========= # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ========= Copyright 2026 @ Strukto.AI All Rights Reserved. ========= from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from mirage.core.email._parse import parse_rfc822 def test_parse_simple_text_email(): raw = (b"From: Alice \r\n" b"To: Bob \r\n" b"Subject: Hello\r\n" b"Date: Mon, 14 Apr 2026 10:30:00 +0000\r\n" b"Message-ID: \r\n" b"\r\n" b"Hello, world!") result = parse_rfc822(raw) assert result["from"] == {"name": "Alice", "email": "alice@example.com"} assert result["to"] == [{"name": "Bob", "email": "bob@example.com"}] assert result["subject"] == "Hello" assert result["body_text"] == "Hello, world!" assert result["message_id"] == "" assert result["has_attachments"] is False def test_parse_multipart_email(): msg = MIMEMultipart() msg["From"] = "Alice " msg["To"] = "Bob " msg["Subject"] = "With HTML" msg["Message-ID"] = "" msg.attach(MIMEText("Plain text body", "plain")) msg.attach(MIMEText("

HTML body

", "html")) raw = msg.as_bytes() result = parse_rfc822(raw) assert result["body_text"] == "Plain text body" assert result["body_html"] == "

HTML body

" assert result["has_attachments"] is False def test_parse_headers_only(): raw = (b"From: Alice \r\n" b"Subject: Test\r\n" b"\r\n" b"Body text here") result = parse_rfc822(raw, headers_only=True) assert result["subject"] == "Test" assert result["body_text"] == "" def test_parse_reply_headers(): raw = (b"From: Bob \r\n" b"To: Alice \r\n" b"Subject: Re: Hello\r\n" b"In-Reply-To: \r\n" b"References: \r\n" b"\r\n" b"Thanks!") result = parse_rfc822(raw) assert result["in_reply_to"] == "" assert result["references"] == [ "", "" ] def test_parse_address_without_name(): raw = (b"From: alice@example.com\r\n" b"To: bob@example.com\r\n" b"Subject: Test\r\n" b"\r\n" b"Body") result = parse_rfc822(raw) assert result["from"]["email"] == "alice@example.com" assert result["from"]["name"] == "" def test_parse_cc(): raw = (b"From: alice@example.com\r\n" b"To: bob@example.com\r\n" b"Cc: Charlie , dave@example.com\r\n" b"Subject: Test\r\n" b"\r\n" b"Body") result = parse_rfc822(raw) assert len(result["cc"]) == 2 assert result["cc"][0]["email"] == "charlie@example.com"