mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-06-23 05:44:18 +00:00
3236bbd0c5
Move the mail parser from paperless_mail/parsers.py to paperless/parsers/mail.py and refactor it to implement ParserProtocol: - Class-level name/version/author/url attributes - supported_mime_types() and score() classmethods (score=20) - can_produce_archive=False, requires_pdf_rendition=True - Context manager lifecycle (__enter__/__exit__) - New parse() signature without mailrule_id kwarg; consumer sets parser.mailrule_id before calling parse() instead - get_text()/get_date()/get_archive_path() accessor methods - extract_metadata() returning email headers and attachment info Register MailDocumentParser in the ParserRegistry alongside Text and Tika parsers. Update consumer, signals, and all import sites to use the new location. Update tests to use the new accessor API, patch paths, and context-manager fixture. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
107 lines
2.6 KiB
Python
107 lines
2.6 KiB
Python
from collections.abc import Generator
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from paperless.parsers.mail import MailDocumentParser
|
|
from paperless_mail.mail import MailAccountHandler
|
|
from paperless_mail.models import MailAccount
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def sample_dir() -> Path:
|
|
return (
|
|
Path(__file__).parent.parent.parent
|
|
/ Path("paperless")
|
|
/ Path("tests")
|
|
/ Path("samples")
|
|
/ Path("mail")
|
|
).resolve()
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def broken_email_file(sample_dir: Path) -> Path:
|
|
return sample_dir / "broken.eml"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def simple_txt_email_file(sample_dir: Path) -> Path:
|
|
return sample_dir / "simple_text.eml"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def simple_txt_email_pdf_file(sample_dir: Path) -> Path:
|
|
return sample_dir / "simple_text.eml.pdf"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def simple_txt_email_thumbnail_file(sample_dir: Path) -> Path:
|
|
return sample_dir / "simple_text.eml.pdf.webp"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def html_email_file(sample_dir: Path) -> Path:
|
|
return sample_dir / "html.eml"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def html_email_pdf_file(sample_dir: Path) -> Path:
|
|
return sample_dir / "html.eml.pdf"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def html_email_thumbnail_file(sample_dir: Path) -> Path:
|
|
return sample_dir / "html.eml.pdf.webp"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def html_email_html_file(sample_dir: Path) -> Path:
|
|
return sample_dir / "html.eml.html"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def merged_pdf_first(sample_dir: Path) -> Path:
|
|
return sample_dir / "first.pdf"
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def merged_pdf_second(sample_dir: Path) -> Path:
|
|
return sample_dir / "second.pdf"
|
|
|
|
|
|
@pytest.fixture()
|
|
def mail_parser() -> Generator[MailDocumentParser, None, None]:
|
|
with MailDocumentParser() as parser:
|
|
yield parser
|
|
|
|
|
|
@pytest.fixture()
|
|
def greenmail_mail_account(db: None) -> Generator[MailAccount, None, None]:
|
|
"""
|
|
Create a mail account configured for local Greenmail server.
|
|
"""
|
|
account = MailAccount.objects.create(
|
|
name="Greenmail Test",
|
|
imap_server="localhost",
|
|
imap_port=3143,
|
|
imap_security=MailAccount.ImapSecurity.NONE,
|
|
username="test@localhost",
|
|
password="test",
|
|
character_set="UTF-8",
|
|
)
|
|
yield account
|
|
account.delete()
|
|
|
|
|
|
@pytest.fixture()
|
|
def mail_account_handler() -> MailAccountHandler:
|
|
return MailAccountHandler()
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def nginx_base_url() -> Generator[str, None, None]:
|
|
"""
|
|
The base URL for the nginx HTTP server we expect to be alive
|
|
"""
|
|
yield "http://localhost:8080"
|