use std::io;
use elektromail::{Server, ServerConfig, StorageBackend};
use elektromail_test_support as support;
fn temp_db_path() -> String {
format!("/tmp/elektromail_test_{}.db", std::process::id())
}
#[tokio::test]
async fn sqlite_messages_persist_across_restart() -> io::Result<()> {
let db_path = temp_db_path();
let _ = std::fs::remove_file(&db_path);
let config = ServerConfig {
storage: StorageBackend::Sqlite(db_path.clone()),
..ServerConfig::default()
};
let server = Server::start(config).await?;
let smtp_addr = server.smtp_addr();
let imap_addr = server.imap_addr();
support::smtp_send(smtp_addr, "user@localhost").await?;
let fetched = support::imap_fetch_all(imap_addr).await?;
assert!(fetched.contains("Subject: Hello"));
server.stop().await?;
let config = ServerConfig {
storage: StorageBackend::Sqlite(db_path.clone()),
..ServerConfig::default()
};
let server = Server::start(config).await?;
let imap_addr = server.imap_addr();
let fetched = support::imap_fetch_all(imap_addr).await?;
assert!(fetched.contains("Subject: Hello"));
server.stop().await?;
let _ = std::fs::remove_file(&db_path);
Ok(())
}
#[tokio::test]
async fn sqlite_flags_persist_across_restart() -> io::Result<()> {
let db_path = temp_db_path() + "_flags";
let _ = std::fs::remove_file(&db_path);
let config = ServerConfig {
storage: StorageBackend::Sqlite(db_path.clone()),
..ServerConfig::default()
};
let server = Server::start(config).await?;
let smtp_addr = server.smtp_addr();
let imap_addr = server.imap_addr();
support::smtp_send(smtp_addr, "user@localhost").await?;
support::imap_store_seen(imap_addr).await?;
let flags = support::imap_fetch_flags(imap_addr).await?;
assert!(flags.contains("\\Seen"));
server.stop().await?;
let config = ServerConfig {
storage: StorageBackend::Sqlite(db_path.clone()),
..ServerConfig::default()
};
let server = Server::start(config).await?;
let imap_addr = server.imap_addr();
let flags = support::imap_fetch_flags(imap_addr).await?;
assert!(flags.contains("\\Seen"));
server.stop().await?;
let _ = std::fs::remove_file(&db_path);
Ok(())
}
#[tokio::test]
async fn sqlite_mailboxes_persist_across_restart() -> io::Result<()> {
let db_path = temp_db_path() + "_mailboxes";
let _ = std::fs::remove_file(&db_path);
let config = ServerConfig {
storage: StorageBackend::Sqlite(db_path.clone()),
..ServerConfig::default()
};
let server = Server::start(config).await?;
let imap_addr = server.imap_addr();
let result = support::imap_create_mailbox(imap_addr, "TestFolder").await?;
assert!(result.contains("OK"));
let list = support::imap_list(imap_addr).await?;
assert!(list.contains("TestFolder"));
server.stop().await?;
let config = ServerConfig {
storage: StorageBackend::Sqlite(db_path.clone()),
..ServerConfig::default()
};
let server = Server::start(config).await?;
let imap_addr = server.imap_addr();
let list = support::imap_list(imap_addr).await?;
assert!(list.contains("TestFolder"));
server.stop().await?;
let _ = std::fs::remove_file(&db_path);
Ok(())
}
#[tokio::test]
async fn in_memory_is_default_and_ephemeral() -> io::Result<()> {
let server = Server::start(ServerConfig::default()).await?;
let smtp_addr = server.smtp_addr();
let imap_addr = server.imap_addr();
support::smtp_send(smtp_addr, "user@localhost").await?;
let fetched = support::imap_fetch_all(imap_addr).await?;
assert!(fetched.contains("Subject: Hello"));
server.stop().await?;
let server = Server::start(ServerConfig::default()).await?;
let imap_addr = server.imap_addr();
let fetched = support::imap_fetch_all(imap_addr).await?;
assert!(!fetched.contains("Subject: Hello"));
server.stop().await?;
Ok(())
}