use crate::inbox::Inbox;
use crate::test_helpers::{MockInbox, find_folder_equals};
use anyhow::Result;
#[test_log::test]
fn test_mock_inbox_basic_functionality() -> Result<()> {
let mut inbox = MockInbox::new();
let folders = inbox.list_folders()?;
assert_eq!(folders.len(), 3);
let test_email = b"From: sender@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email\r\n\r\nThis is a test email body.";
inbox.add_message("INBOX", test_email.to_vec())?;
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let messages = inbox.fetch_all_messages_in_folder(&inbox_folder)?;
assert_eq!(messages.len(), 1);
let message = &messages[0];
assert_eq!(message.subject.as_deref(), Some("Test Email"));
assert_eq!(message.from.as_deref(), Some(" <sender@example.com>"));
assert!(message.body.contains("test email body"));
assert!(message.valid);
assert_eq!(message.uid(), Some(1));
Ok(())
}
#[test_log::test]
fn test_mock_inbox_move_message() -> Result<()> {
let mut inbox = MockInbox::new();
let test_email = b"From: sender@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email\r\n\r\nThis is a test email body.";
inbox.add_message("INBOX", test_email.to_vec())?;
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let mut messages = inbox.fetch_all_messages_in_folder(&inbox_folder)?;
let mut message = messages.remove(0);
let processed_folder = find_folder_equals(&mut inbox, "Processed")?;
inbox.move_message_to_folder(&mut message, &processed_folder)?;
let inbox_messages = inbox.fetch_all_messages_in_folder(&inbox_folder)?;
assert_eq!(inbox_messages.len(), 0);
let processed_messages = inbox.fetch_all_messages_in_folder(&processed_folder)?;
assert_eq!(processed_messages.len(), 1);
assert!(!message.valid);
Ok(())
}
#[test_log::test]
fn test_mock_inbox_delete_message() -> Result<()> {
let mut inbox = MockInbox::new();
let test_email = b"From: sender@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email\r\n\r\nThis is a test email body.";
inbox.add_message("INBOX", test_email.to_vec())?;
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let mut messages = inbox.fetch_all_messages_in_folder(&inbox_folder)?;
let mut message = messages.remove(0);
inbox.delete_message(&mut message)?;
let inbox_messages = inbox.fetch_all_messages_in_folder(&inbox_folder)?;
assert_eq!(inbox_messages.len(), 0);
assert!(!message.valid);
Ok(())
}
#[test_log::test]
fn test_mock_inbox_custom_folders() -> Result<()> {
let mut inbox = MockInbox::with_folders(vec!["Custom1", "Custom2"]);
let folders = inbox.list_folders()?;
assert_eq!(folders.len(), 2);
let test_email = b"From: sender@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email\r\n\r\nThis is a test email body.";
inbox.add_message("Custom1", test_email.to_vec())?;
inbox.add_message("Custom2", test_email.to_vec())?;
assert_eq!(inbox.message_count("Custom1"), 1);
assert_eq!(inbox.message_count("Custom2"), 1);
inbox.clear_folder("Custom1")?;
assert_eq!(inbox.message_count("Custom1"), 0);
assert_eq!(inbox.message_count("Custom2"), 1);
Ok(())
}
#[test_log::test]
fn test_mock_inbox_with_specific_uid() -> Result<()> {
let mut inbox = MockInbox::new();
let test_email = b"From: sender@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email\r\n\r\nThis is a test email body.";
inbox.add_message_with_uid("INBOX", test_email.to_vec(), 42)?;
inbox.add_message("INBOX", test_email.to_vec())?;
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let messages = inbox.fetch_all_messages_in_folder(&inbox_folder)?;
assert_eq!(messages.len(), 2);
let uids: Vec<u32> = messages.iter().filter_map(|m| m.uid()).collect();
assert!(uids.contains(&42));
assert!(uids.contains(&43));
Ok(())
}
#[test_log::test]
fn test_mock_inbox_fetch_top_n_less_than_total() -> Result<()> {
let mut inbox = MockInbox::new();
for i in 1..=5 {
let test_email = format!(
"From: sender{}@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email {}\r\n\r\nThis is test email body {}.",
i, i, i
).as_bytes().to_vec();
inbox.add_message("INBOX", test_email)?;
}
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let messages = inbox.fetch_top_n_messages_in_folder(&inbox_folder, 3)?;
assert_eq!(messages.len(), 3);
let uids: Vec<u32> = messages.iter().filter_map(|m| m.uid()).collect();
assert_eq!(uids, vec![3, 4, 5]);
Ok(())
}
#[test_log::test]
fn test_mock_inbox_fetch_top_n_equal_to_total() -> Result<()> {
let mut inbox = MockInbox::new();
for i in 1..=3 {
let test_email = format!(
"From: sender{}@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email {}\r\n\r\nThis is test email body {}.",
i, i, i
).as_bytes().to_vec();
inbox.add_message("INBOX", test_email)?;
}
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let messages = inbox.fetch_top_n_messages_in_folder(&inbox_folder, 3)?;
assert_eq!(messages.len(), 3);
let uids: Vec<u32> = messages.iter().filter_map(|m| m.uid()).collect();
assert_eq!(uids, vec![1, 2, 3]);
Ok(())
}
#[test_log::test]
fn test_mock_inbox_fetch_top_n_zero() -> Result<()> {
let mut inbox = MockInbox::new();
for i in 1..=5 {
let test_email = format!(
"From: sender{}@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email {}\r\n\r\nThis is test email body {}.",
i, i, i
).as_bytes().to_vec();
inbox.add_message("INBOX", test_email)?;
}
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let messages = inbox.fetch_top_n_messages_in_folder(&inbox_folder, 0)?;
assert_eq!(messages.len(), 0);
Ok(())
}
#[test_log::test]
fn test_mock_inbox_fetch_top_n_greater_than_total() -> Result<()> {
let mut inbox = MockInbox::new();
for i in 1..=3 {
let test_email = format!(
"From: sender{}@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email {}\r\n\r\nThis is test email body {}.",
i, i, i
).as_bytes().to_vec();
inbox.add_message("INBOX", test_email)?;
}
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let messages = inbox.fetch_top_n_messages_in_folder(&inbox_folder, 10)?;
assert_eq!(messages.len(), 3);
let uids: Vec<u32> = messages.iter().filter_map(|m| m.uid()).collect();
assert_eq!(uids, vec![1, 2, 3]);
Ok(())
}
#[test_log::test]
fn test_mock_inbox_fetch_top_n_empty_folder() -> Result<()> {
let mut inbox = MockInbox::new();
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let messages = inbox.fetch_top_n_messages_in_folder(&inbox_folder, 5)?;
assert_eq!(messages.len(), 0);
Ok(())
}
#[test_log::test]
fn test_mock_inbox_fetch_top_n_single_message() -> Result<()> {
let mut inbox = MockInbox::new();
let test_email = b"From: sender@example.com\r\nTo: recipient@example.com\r\nSubject: Test Email\r\n\r\nThis is a test email body.";
inbox.add_message("INBOX", test_email.to_vec())?;
let inbox_folder = find_folder_equals(&mut inbox, "INBOX")?;
let messages = inbox.fetch_top_n_messages_in_folder(&inbox_folder, 1)?;
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].uid(), Some(1));
Ok(())
}