"""Folder-name special-use heuristics (SPEC §6.3 / §12 M2).""" from __future__ import annotations import pytest from app.sync.folder_names import infer_special_use @pytest.mark.parametrize( "path,expected", [ # inbox ("INBOX", "inbox"), ("inbox", "inbox"), ("INBOX.", "inbox"), # Dovecot may show a trailing delimiter # English / Outlook / Gmail ("Sent", "sent"), ("Sent Items", "sent"), ("[Gmail]/Sent Mail", "sent"), ("Drafts", "drafts"), ("Deleted Items", "trash"), ("Bin", "trash"), ("Junk", "junk"), ("Junk E-mail", "junk"), # Outlook, punctuation-insensitive ("[Gmail]/Spam", "junk"), ("Archive", "archive"), ("[Gmail]/All Mail", "archive"), # Polish (accents) ("Wysłane", "sent"), ("Elementy wysłane", "sent"), ("Robocze", "drafts"), ("Kosz", "trash"), ("Wiadomości-śmieci", "junk"), ("Archiwum", "archive"), # German ("Gesendet", "sent"), ("Gesendete Elemente", "sent"), ("Entwürfe", "drafts"), ("Papierkorb", "trash"), ("Gelöschte Elemente", "trash"), # French ("Éléments envoyés", "sent"), ("Brouillons", "drafts"), ("Corbeille", "trash"), ("Courrier indésirable", "junk"), # Spanish / Italian / Dutch / Portuguese ("Enviados", "sent"), ("Papelera", "trash"), ("Posta inviata", "sent"), ("Cestino", "trash"), ("Verzonden", "sent"), ("Prullenbak", "trash"), ("Itens enviados", "sent"), ("Lixeira", "trash"), # Russian (Cyrillic) ("Отправленные", "sent"), ("Корзина", "trash"), ("Черновики", "drafts"), ("Спам", "junk"), # delimiters / nesting ("INBOX/Sent", "sent"), ("INBOX.Sent", "sent"), # Dovecot dot delimiter ("INBOX.Trash", "trash"), # negatives — must not misfire ("Work", None), ("Random Folder", None), ("Sent to John", None), # curated names, not substring match ("Newsletter", None), ("Projects/Client", None), ], ) def test_infer_special_use(path: str, expected: str | None) -> None: assert infer_special_use(path) == expected