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 }