aboutsummaryrefslogtreecommitdiff
path: root/docs/scripts/tests/test_generate_filenames.py
blob: 07c8f8400731f3b10584b7ee9306ba43d7ca3edd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
"""Tests for generate_basename(), generate_email_filename(), generate_attachment_filename()."""

import sys
import os

sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))

import importlib.util
spec = importlib.util.spec_from_file_location(
    "eml_script",
    os.path.join(os.path.dirname(__file__), '..', 'eml-view-and-extract-attachments.py')
)
eml_script = importlib.util.module_from_spec(spec)
spec.loader.exec_module(eml_script)

generate_basename = eml_script.generate_basename
generate_email_filename = eml_script.generate_email_filename
generate_attachment_filename = eml_script.generate_attachment_filename


# --- generate_basename ---

class TestGenerateBasename:
    def test_standard_from_and_date(self):
        metadata = {
            'from': 'Jonathan Smith <jsmith@example.com>',
            'date': 'Wed, 05 Feb 2026 11:36:00 -0600',
        }
        assert generate_basename(metadata) == "2026-02-05-1136-Jonathan"

    def test_from_with_display_name_first_token(self):
        metadata = {
            'from': 'C Ciarm <cciarm@example.com>',
            'date': 'Wed, 05 Feb 2026 11:36:00 -0600',
        }
        result = generate_basename(metadata)
        assert result == "2026-02-05-1136-C"

    def test_from_without_display_name(self):
        metadata = {
            'from': 'jsmith@example.com',
            'date': 'Wed, 05 Feb 2026 11:36:00 -0600',
        }
        result = generate_basename(metadata)
        assert result == "2026-02-05-1136-jsmith"

    def test_missing_date(self):
        metadata = {
            'from': 'Jonathan Smith <jsmith@example.com>',
            'date': None,
        }
        result = generate_basename(metadata)
        assert result == "unknown-Jonathan"

    def test_missing_from(self):
        metadata = {
            'from': None,
            'date': 'Wed, 05 Feb 2026 11:36:00 -0600',
        }
        result = generate_basename(metadata)
        assert result == "2026-02-05-1136-unknown"

    def test_both_missing(self):
        metadata = {'from': None, 'date': None}
        result = generate_basename(metadata)
        assert result == "unknown-unknown"

    def test_unparseable_date(self):
        metadata = {
            'from': 'Jonathan <j@example.com>',
            'date': 'not a real date',
        }
        result = generate_basename(metadata)
        assert result == "unknown-Jonathan"

    def test_none_date_no_crash(self):
        metadata = {'from': 'Test <t@e.com>', 'date': None}
        # Should not raise
        result = generate_basename(metadata)
        assert "unknown" in result


# --- generate_email_filename ---

class TestGenerateEmailFilename:
    def test_standard_subject(self):
        result = generate_email_filename(
            "2026-02-05-1136-Jonathan",
            "Re: Fw: 4319 Danneel Street"
        )
        assert result == "2026-02-05-1136-Jonathan-EMAIL-Re-Fw-4319-Danneel-Street"

    def test_subject_with_special_chars(self):
        result = generate_email_filename(
            "2026-02-05-1136-Jonathan",
            "Update: Meeting (draft) & notes!"
        )
        # Colons, parens, ampersands, exclamation stripped
        assert "EMAIL" in result
        assert ":" not in result
        assert "(" not in result
        assert ")" not in result
        assert "&" not in result
        assert "!" not in result

    def test_none_subject(self):
        result = generate_email_filename("2026-02-05-1136-Jonathan", None)
        assert result == "2026-02-05-1136-Jonathan-EMAIL-no-subject"

    def test_empty_subject(self):
        result = generate_email_filename("2026-02-05-1136-Jonathan", "")
        assert result == "2026-02-05-1136-Jonathan-EMAIL-no-subject"

    def test_very_long_subject(self):
        long_subject = "A" * 100 + " " + "B" * 100
        result = generate_email_filename("2026-02-05-1136-Jonathan", long_subject)
        # The cleaned subject part should be truncated
        # basename (27) + "-EMAIL-" (7) + subject
        # Subject itself is limited to 80 chars by _clean_for_filename
        subject_part = result.split("-EMAIL-")[1]
        assert len(subject_part) <= 80


# --- generate_attachment_filename ---

class TestGenerateAttachmentFilename:
    def test_standard_attachment(self):
        result = generate_attachment_filename(
            "2026-02-05-1136-Jonathan",
            "Ltr Carrollton.pdf"
        )
        assert result == "2026-02-05-1136-Jonathan-ATTACH-Ltr-Carrollton.pdf"

    def test_filename_with_spaces_and_parens(self):
        result = generate_attachment_filename(
            "2026-02-05-1136-Jonathan",
            "Document (final copy).pdf"
        )
        assert " " not in result
        assert "(" not in result
        assert ")" not in result
        assert result.endswith(".pdf")

    def test_preserves_extension(self):
        result = generate_attachment_filename(
            "2026-02-05-1136-Jonathan",
            "photo.jpg"
        )
        assert result.endswith(".jpg")

    def test_none_filename(self):
        result = generate_attachment_filename("2026-02-05-1136-Jonathan", None)
        assert result == "2026-02-05-1136-Jonathan-ATTACH-unnamed"

    def test_empty_filename(self):
        result = generate_attachment_filename("2026-02-05-1136-Jonathan", "")
        assert result == "2026-02-05-1136-Jonathan-ATTACH-unnamed"