|
1
|
use crate::imap::mailbox::MailboxStore; |
|
2
|
use std::sync::Arc; |
|
3
|
|
|
4
|
#[derive(Clone)] |
|
5
|
pub struct MessageStorage { |
|
6
|
pub mailbox_store: Arc<MailboxStore>, |
|
7
|
} |
|
8
|
|
|
9
|
impl MessageStorage { |
|
10
|
pub fn new() -> Self { |
|
11
|
MessageStorage { |
|
12
|
mailbox_store: Arc::new(MailboxStore::new()), |
|
13
|
} |
|
14
|
} |
|
15
|
|
|
16
|
pub fn store_message(&self, from: String, to: Vec<String>, content: String) { |
|
17
|
// Store message in INBOX by default |
|
18
|
if let Some(inbox) = self.mailbox_store.get_mailbox("INBOX") { |
|
19
|
inbox.add_message(from, to, content); |
|
20
|
tracing::info!("Message stored in INBOX"); |
|
21
|
} |
|
22
|
} |
|
23
|
} |
|
24
|
|
|
25
|
impl Default for MessageStorage { |
|
26
|
fn default() -> Self { |
|
27
|
Self::new() |
|
28
|
} |
|
29
|
} |
|
30
|
|
|
31
|
#[cfg(test)] |
|
32
|
mod tests { |
|
33
|
use super::*; |
|
34
|
|
|
35
|
#[test] |
|
36
|
fn test_message_storage() { |
|
37
|
let storage = MessageStorage::new(); |
|
38
|
|
|
39
|
// Store a message |
|
40
|
let from = "sender@example.com".to_string(); |
|
41
|
let to = vec!["recipient@example.com".to_string()]; |
|
42
|
let content = "Subject: Test\r\n\r\nTest body".to_string(); |
|
43
|
|
|
44
|
storage.store_message(from.clone(), to.clone(), content.clone()); |
|
45
|
|
|
46
|
// Verify message was stored |
|
47
|
if let Some(inbox) = storage.mailbox_store.get_mailbox("INBOX") { |
|
48
|
let messages = inbox.get_messages(); |
|
49
|
assert_eq!(messages.len(), 1); |
|
50
|
assert_eq!(messages[0].from, from); |
|
51
|
assert_eq!(messages[0].to, to); |
|
52
|
assert_eq!(messages[0].subject, "Test"); |
|
53
|
} else { |
|
54
|
panic!("INBOX mailbox not found"); |
|
55
|
} |
|
56
|
} |
|
57
|
|
|
58
|
#[test] |
|
59
|
fn test_multiple_messages() { |
|
60
|
let storage = MessageStorage::new(); |
|
61
|
|
|
62
|
// Store multiple messages |
|
63
|
storage.store_message( |
|
64
|
"sender1@example.com".to_string(), |
|
65
|
vec!["recipient@example.com".to_string()], |
|
66
|
"Subject: First\r\n\r\nFirst message".to_string() |
|
67
|
); |
|
68
|
|
|
69
|
storage.store_message( |
|
70
|
"sender2@example.com".to_string(), |
|
71
|
vec!["recipient@example.com".to_string()], |
|
72
|
"Subject: Second\r\n\r\nSecond message".to_string() |
|
73
|
); |
|
74
|
|
|
75
|
// Verify both messages were stored |
|
76
|
if let Some(inbox) = storage.mailbox_store.get_mailbox("INBOX") { |
|
77
|
let messages = inbox.get_messages(); |
|
78
|
assert_eq!(messages.len(), 2); |
|
79
|
assert_eq!(messages[0].subject, "First"); |
|
80
|
assert_eq!(messages[1].subject, "Second"); |
|
81
|
} |
|
82
|
} |
|
83
|
|
|
84
|
#[test] |
|
85
|
fn test_mailbox_list() { |
|
86
|
let storage = MessageStorage::new(); |
|
87
|
let mailboxes = storage.mailbox_store.list_mailboxes(); |
|
88
|
|
|
89
|
// Verify default mailboxes exist |
|
90
|
assert!(mailboxes.contains(&"INBOX".to_string())); |
|
91
|
assert!(mailboxes.contains(&"Sent".to_string())); |
|
92
|
assert!(mailboxes.contains(&"Drafts".to_string())); |
|
93
|
assert!(mailboxes.contains(&"Trash".to_string())); |
|
94
|
} |
|
95
|
} |