from email.message import EmailMessage from email.parser import BytesParser from glob import glob import email.policy import os import os.path from datetime import datetime, timezone, timedelta from typing import cast import sqlite3 from tempfile import TemporaryDirectory from mu4web.tree import ( parse_msg_ids, setup_relation_data, Tree, TreeEntry, fetch_relation_tree ) def test_parse_msg_ids() -> None: assert parse_msg_ids(", ") == ["id1", "id2"] parser = BytesParser(policy=email.policy.default) def test_relation_data(tmpdir: TemporaryDirectory[str], maildir: str) -> None: db = os.path.join(tmpdir.name, 'mail.db') setup_relation_data(db, maildir) con = sqlite3.connect(db) cur = con.cursor() CEST = timezone(timedelta(seconds=7200)) tree1 = Tree(data=TreeEntry(entry='ZM2CNjF0jRjd1H4x@lysator.liu.se', ref='', subject='Initial email', from_='Hugo ', date=datetime(2023, 8, 5, 0, 56, 54, tzinfo=CEST)), children=[Tree(data=TreeEntry(entry='ZM2CTjoCe8dwaoAg@lysator.liu.se', ref='ZM2CNjF0jRjd1H4x@lysator.liu.se', subject='Re: Initial email', from_='Hugo ', date=datetime(2023, 8, 5, 0, 57, 18, tzinfo=CEST))) ]) tree2 = Tree(data=TreeEntry(entry='ZM9pUTtYOHiPevlg@lysator.liu.se', ref='', subject='FWD: Initial email', from_='Hugo ', date=datetime(2023, 8, 6, 11, 35, 13, tzinfo=CEST))) data = { '1691189956.3013485_5.gandalf:2,RS': tree1, '1691189958.3013485_7.gandalf:2,S': tree1, '1691314589.3192599_3.gandalf:2,S': tree2, } msg: EmailMessage # os.system(f"cp {os.path.join(tmpdir.name, 'mail.db')} /tmp/mail.db") for mailfile in glob(os.path.join(maildir, 'cur', '*')): with open(mailfile, 'rb') as f: msg = cast(EmailMessage, parser.parse(f)) assert fetch_relation_tree(cur, msg) == data[os.path.basename(mailfile)]