bf7cabc9d8
release: fix HIGH-severity CVEs in receiptwitness image (UAT+Security PASS)
94 lines
3.2 KiB
Python
94 lines
3.2 KiB
Python
"""Tests for TargetEmailParser."""
|
|
|
|
from pathlib import Path
|
|
|
|
from receiptwitness.parsers.email.base import EmailReceipt
|
|
from receiptwitness.parsers.email.target import TargetEmailParser
|
|
|
|
FIXTURE_PATH = Path(__file__).parent.parent.parent / "fixtures" / "target_email_receipt.html"
|
|
|
|
|
|
class TestTargetEmailParser:
|
|
"""Tests for TargetEmailParser."""
|
|
|
|
def setup_method(self) -> None:
|
|
self.parser = TargetEmailParser()
|
|
self.fixture_html = FIXTURE_PATH.read_text()
|
|
|
|
def test_can_parse_target_sender(self) -> None:
|
|
email = EmailReceipt(
|
|
sender="receipts@target.com",
|
|
recipient="user@example.com",
|
|
subject="Your Target Order Confirmation",
|
|
body_html=self.fixture_html,
|
|
)
|
|
assert self.parser.can_parse(email) is True
|
|
|
|
def test_can_parse_circle_in_body(self) -> None:
|
|
email = EmailReceipt(
|
|
sender="someone@unknown.com",
|
|
recipient="user@example.com",
|
|
subject="Your Receipt",
|
|
body_html="<html><body>Target Circle savings offer</body></html>",
|
|
)
|
|
assert self.parser.can_parse(email) is True
|
|
|
|
def test_cannot_parse_unrelated(self) -> None:
|
|
email = EmailReceipt(
|
|
sender="noreply@walmart.com",
|
|
recipient="user@example.com",
|
|
subject="Your Receipt",
|
|
body_html="<html><body>Walmart receipt</body></html>",
|
|
)
|
|
assert self.parser.can_parse(email) is False
|
|
|
|
def test_parse_items(self) -> None:
|
|
email = EmailReceipt(
|
|
sender="orders@target.com",
|
|
recipient="user@example.com",
|
|
subject="Your Target Order",
|
|
body_html=self.fixture_html,
|
|
)
|
|
result = self.parser.parse(email)
|
|
items = result.get("items", [])
|
|
assert len(items) >= 3
|
|
product_names = [item["product_name_raw"] for item in items]
|
|
assert any("Whole Milk" in name for name in product_names)
|
|
assert any("Arborio" in name for name in product_names)
|
|
for item in items:
|
|
assert "unit_price" in item
|
|
assert "extended_price" in item
|
|
|
|
def test_parse_totals(self) -> None:
|
|
email = EmailReceipt(
|
|
sender="orders@target.com",
|
|
recipient="user@example.com",
|
|
subject="Your Target Order",
|
|
body_html=self.fixture_html,
|
|
)
|
|
result = self.parser.parse(email)
|
|
total = result.get("total", 0)
|
|
assert total > 0
|
|
|
|
def test_parse_receipt_id(self) -> None:
|
|
email = EmailReceipt(
|
|
sender="orders@target.com",
|
|
recipient="user@example.com",
|
|
subject="Your Target Order",
|
|
body_html=self.fixture_html,
|
|
)
|
|
result = self.parser.parse(email)
|
|
receipt_id = result.get("receipt_id", "")
|
|
assert "TGT-2026" in receipt_id or "CNF" in receipt_id
|
|
|
|
def test_parse_date(self) -> None:
|
|
email = EmailReceipt(
|
|
sender="orders@target.com",
|
|
recipient="user@example.com",
|
|
subject="Your Target Order",
|
|
body_html=self.fixture_html,
|
|
)
|
|
result = self.parser.parse(email)
|
|
purchase_date = result.get("purchase_date", "")
|
|
assert purchase_date == "2026-03-18"
|