mirror of
https://github.com/rustmailer/bichon.git
synced 2026-08-03 07:48:34 +02:00
Update content.rs
This commit is contained in:
@@ -362,3 +362,102 @@ pub fn retrieve_nested_eml_content(
|
|||||||
has_remote_content,
|
has_remote_content,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
/// Simulates JSON written by a version before `extracted_text`, `extracted_page_count`,
|
||||||
|
/// and `extracted_is_ocr` were added to [`AttachmentInfo`]. Deserialization must
|
||||||
|
/// succeed and fill the missing fields with their defaults.
|
||||||
|
#[test]
|
||||||
|
fn attachment_info_backward_compat_no_extracted_fields() {
|
||||||
|
let old_json = r#"[
|
||||||
|
{
|
||||||
|
"file_type": "application/pdf",
|
||||||
|
"inline": false,
|
||||||
|
"filename": "report.pdf",
|
||||||
|
"size": 12345,
|
||||||
|
"content_id": null,
|
||||||
|
"content_hash": "abc123",
|
||||||
|
"is_message": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file_type": "image/png",
|
||||||
|
"inline": true,
|
||||||
|
"filename": "logo.png",
|
||||||
|
"size": 6789,
|
||||||
|
"content_id": "cid:logo@example.com",
|
||||||
|
"content_hash": "def456",
|
||||||
|
"is_message": false
|
||||||
|
}
|
||||||
|
]"#;
|
||||||
|
|
||||||
|
let attachments: Vec<AttachmentInfo> =
|
||||||
|
serde_json::from_str(old_json).expect("should deserialize legacy JSON");
|
||||||
|
|
||||||
|
assert_eq!(attachments.len(), 2);
|
||||||
|
|
||||||
|
// First attachment (regular file)
|
||||||
|
assert_eq!(attachments[0].file_type, "application/pdf");
|
||||||
|
assert!(!attachments[0].inline);
|
||||||
|
assert_eq!(attachments[0].filename.as_deref(), Some("report.pdf"));
|
||||||
|
assert_eq!(attachments[0].size, 12345);
|
||||||
|
assert_eq!(attachments[0].content_id, None);
|
||||||
|
assert_eq!(attachments[0].content_hash, "abc123");
|
||||||
|
assert!(!attachments[0].is_message);
|
||||||
|
// Fields added after the legacy format — must default correctly
|
||||||
|
assert_eq!(attachments[0].extracted_text, None);
|
||||||
|
assert_eq!(attachments[0].extracted_page_count, None);
|
||||||
|
assert!(!attachments[0].extracted_is_ocr);
|
||||||
|
|
||||||
|
// Second attachment (inline image with content-id)
|
||||||
|
assert_eq!(attachments[1].file_type, "image/png");
|
||||||
|
assert!(attachments[1].inline);
|
||||||
|
assert_eq!(attachments[1].filename.as_deref(), Some("logo.png"));
|
||||||
|
assert_eq!(attachments[1].size, 6789);
|
||||||
|
assert_eq!(attachments[1].content_id.as_deref(), Some("cid:logo@example.com"));
|
||||||
|
assert_eq!(attachments[1].content_hash, "def456");
|
||||||
|
assert!(!attachments[1].is_message);
|
||||||
|
assert_eq!(attachments[1].extracted_text, None);
|
||||||
|
assert_eq!(attachments[1].extracted_page_count, None);
|
||||||
|
assert!(!attachments[1].extracted_is_ocr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Current struct must round-trip through serde_json without data loss.
|
||||||
|
#[test]
|
||||||
|
fn attachment_info_round_trip() {
|
||||||
|
let attachments = vec![
|
||||||
|
AttachmentInfo {
|
||||||
|
file_type: "text/html".into(),
|
||||||
|
inline: false,
|
||||||
|
filename: Some("page.html".into()),
|
||||||
|
size: 42,
|
||||||
|
content_id: None,
|
||||||
|
content_hash: "hash1".into(),
|
||||||
|
is_message: true,
|
||||||
|
extracted_text: Some("hello world".into()),
|
||||||
|
extracted_page_count: Some(1),
|
||||||
|
extracted_is_ocr: false,
|
||||||
|
},
|
||||||
|
AttachmentInfo {
|
||||||
|
file_type: "application/zip".into(),
|
||||||
|
inline: false,
|
||||||
|
filename: Some("archive.zip".into()),
|
||||||
|
size: 99999,
|
||||||
|
content_id: None,
|
||||||
|
content_hash: "hash2".into(),
|
||||||
|
is_message: false,
|
||||||
|
extracted_text: None,
|
||||||
|
extracted_page_count: None,
|
||||||
|
extracted_is_ocr: true,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
let json = serde_json::to_string(&attachments).expect("serialize");
|
||||||
|
let round_tripped: Vec<AttachmentInfo> =
|
||||||
|
serde_json::from_str(&json).expect("deserialize");
|
||||||
|
|
||||||
|
assert_eq!(attachments, round_tripped);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user