@@ -131,3 +131,102 @@ def test_provider_gets_mlparser(provider_class):
131131 assert provider ._processors [- 1 ] == CombinedProcessor ( # pylint: disable=protected-access
132132 data_parsers = [EmailDateParser , OpenAIParser ]
133133 )
134+
135+
136+ def test_add_subject_to_text_appends_subject_to_text_parts ():
137+ """Test that add_subject_to_text appends subject to text/* and html parts when not already present."""
138+ provider = GenericProvider ()
139+
140+ # Create test data with email subject and various content types
141+ data = NotificationData ()
142+ data .add_data_part ("email-header-subject" , b"Test Maintenance Subject" )
143+ data .add_data_part ("text/plain" , b"This is plain text content" )
144+ data .add_data_part ("text/html" , b"<html><body>This is HTML content</body></html>" )
145+ data .add_data_part ("html" , b"<div>Another HTML content</div>" )
146+ data .add_data_part ("application/pdf" , b"binary pdf content" )
147+
148+ # Verify initial state - subject should not be in content
149+ text_part = data .data_parts [1 ] # text/plain part
150+ html_part = data .data_parts [2 ] # text/html part
151+ html_part2 = data .data_parts [3 ] # html part
152+
153+ assert b"Test Maintenance Subject" not in text_part .content
154+ assert b"Test Maintenance Subject" not in html_part .content
155+ assert b"Test Maintenance Subject" not in html_part2 .content
156+
157+ # Call the method
158+ provider .add_subject_to_text (data )
159+
160+ # Verify subject was appended to text/* and html parts
161+ text_part_after = data .data_parts [1 ] # text/plain part
162+ html_part_after = data .data_parts [2 ] # text/html part
163+ html_part2_after = data .data_parts [3 ] # html part
164+ pdf_part_after = data .data_parts [4 ] # application/pdf part
165+
166+ assert b"Test Maintenance Subject" in text_part_after .content
167+ assert text_part_after .content == b"This is plain text content\n Test Maintenance Subject"
168+
169+ assert b"Test Maintenance Subject" in html_part_after .content
170+ assert html_part_after .content == b"<html><body>This is HTML content</body></html>\n Test Maintenance Subject"
171+
172+ assert b"Test Maintenance Subject" in html_part2_after .content
173+ assert html_part2_after .content == b"<div>Another HTML content</div>\n Test Maintenance Subject"
174+
175+ # PDF part should remain unchanged
176+ assert pdf_part_after .content == b"binary pdf content"
177+ assert b"Test Maintenance Subject" not in pdf_part_after .content
178+
179+
180+ def test_add_subject_to_text_skips_when_subject_already_present ():
181+ """Test that add_subject_to_text skips parts that already contain the subject."""
182+ provider = GenericProvider ()
183+
184+ # Create test data where subject is already in the content
185+ data = NotificationData ()
186+ data .add_data_part ("email-header-subject" , b"Test Subject" )
187+ data .add_data_part ("text/plain" , b"Content with Test Subject already included" )
188+ data .add_data_part ("text/html" , b"<html>No subject here</html>" )
189+
190+ # Call the method
191+ provider .add_subject_to_text (data )
192+
193+ # First part should remain unchanged since subject is already there
194+ text_part = data .data_parts [1 ]
195+ assert text_part .content == b"Content with Test Subject already included"
196+
197+ # Second part should have subject appended
198+ html_part = data .data_parts [2 ]
199+ assert html_part .content == b"<html>No subject here</html>\n Test Subject"
200+
201+
202+ def test_add_subject_to_text_no_subject_header ():
203+ """Test that add_subject_to_text does nothing when no email-header-subject part exists."""
204+ provider = GenericProvider ()
205+
206+ # Create test data without email-header-subject
207+ data = NotificationData ()
208+ data .add_data_part ("text/plain" , b"This is plain text content" )
209+ data .add_data_part ("text/html" , b"<html><body>This is HTML content</body></html>" )
210+
211+ original_text_content = data .data_parts [0 ].content
212+ original_html_content = data .data_parts [1 ].content
213+
214+ # Call the method
215+ provider .add_subject_to_text (data )
216+
217+ # Content should remain unchanged
218+ assert data .data_parts [0 ].content == original_text_content
219+ assert data .data_parts [1 ].content == original_html_content
220+
221+
222+ def test_add_subject_to_text_handles_decode_errors ():
223+ """Test that add_subject_to_text handles decode errors gracefully."""
224+ provider = GenericProvider ()
225+
226+ # Create test data with invalid UTF-8 sequences
227+ data = NotificationData ()
228+ data .add_data_part ("email-header-subject" , b"\xff \xfe " ) # Invalid UTF-8
229+ data .add_data_part ("text/plain" , b"\x80 \x81 " ) # Invalid UTF-8
230+
231+ # This should not raise an exception due to errors="ignore" in decode()
232+ provider .add_subject_to_text (data )
0 commit comments