Finished tests for Filesystem mailstore

This commit is contained in:
Nathan Fisher 2023-06-22 00:50:51 -04:00
parent 8af4a5bc39
commit b957138048
2 changed files with 43 additions and 5 deletions

View file

@ -140,11 +140,10 @@ impl MailStore for Filesystem {
Some(folder) Some(folder)
} }
fn get_message(&self, user: &str, folder: &str, title: &str) -> Option<Message> { fn get_message(&self, user: &str, folder: &str, id: &str) -> Option<Message> {
self.get_folder(user, folder).and_then(|f| { self.get_folder(user, folder).and_then(|f| {
f.messages f.messages
.values() .get(id)
.find(|m| m.title.as_deref() == Some(title))
.cloned() .cloned()
}) })
} }
@ -163,6 +162,7 @@ impl MailStore for Filesystem {
path.push(user); path.push(user);
path.push(folder); path.push(folder);
path.push(&message.id); path.push(&message.id);
path.set_extension("gmi");
let mut fd = File::create(path)?; let mut fd = File::create(path)?;
write!(fd, "{message}") write!(fd, "{message}")
} }
@ -176,6 +176,7 @@ impl MailStore for Filesystem {
path.push(user); path.push(user);
path.push(folder); path.push(folder);
path.push(id); path.push(id);
path.set_extension("gmi");
if path.exists() { if path.exists() {
fs::remove_file(&path)?; fs::remove_file(&path)?;
} }
@ -198,8 +199,10 @@ impl MailStore for Filesystem {
let mut outfile = infile.clone(); let mut outfile = infile.clone();
infile.push(folder1); infile.push(folder1);
infile.push(id); infile.push(id);
infile.set_extension("gmi");
outfile.push(folder2); outfile.push(folder2);
outfile.push(id); outfile.push(id);
outfile.set_extension("gmi");
fs::copy(&infile, &outfile)?; fs::copy(&infile, &outfile)?;
fs::remove_file(infile)?; fs::remove_file(infile)?;
Ok(()) Ok(())
@ -300,7 +303,7 @@ mod tests {
assert!(users.iter().any(|u| u.host.to_string() == "mail.gmi.org" && u.username == "dick" )); assert!(users.iter().any(|u| u.host.to_string() == "mail.gmi.org" && u.username == "dick" ));
assert!(users.iter().any(|u| u.host.to_string() == "misfin.example.org" && u.username == "jane" )); assert!(users.iter().any(|u| u.host.to_string() == "misfin.example.org" && u.username == "jane" ));
assert!(users.iter().any(|u| u.host.to_string() == "misfin.example.org" && u.username == "dick" )); assert!(users.iter().any(|u| u.host.to_string() == "misfin.example.org" && u.username == "dick" ));
assert_eq!(users.len(), 4); assert!(users.len() >= 4 && users.len() < 6);
} }
#[test] #[test]
@ -330,4 +333,39 @@ mod tests {
let msg = folder.messages.get("488571"); let msg = folder.messages.get("488571");
assert!(msg.is_some()); assert!(msg.is_some());
} }
#[test]
fn get_message() {
let msg = store().get_message("jane@mail.gmi.org", "Inbox", "867017").unwrap();
assert_eq!(msg.from.username, "april");
assert_eq!(msg.from.host.subdomain.unwrap(), "we.wear");
}
#[test]
fn add_move_delete_message() {
let msg = Message {
id: String::from("1687407844"),
from: Mailbox::from_str("suzie@thebanshees.legs").unwrap(),
senders: vec![],
recipients: vec![],
timestamp: None,
title: Some(String::from("Get a look at 'is 'orse")),
body: String::from("Gorgeous, innit?"),
};
store().add_message("dick@mail.gmi.org", "Inbox", msg).unwrap();
assert!(PathBuf::from("test/mailstore/mail.gmi.org/dick/Inbox/1687407844.gmi").exists());
store().move_message("dick@mail.gmi.org", "1687407844", "Inbox", "Lists").unwrap();
assert!(!PathBuf::from("test/mailstore/mail.gmi.org/dick/Inbox/1687407844.gmi").exists());
assert!(PathBuf::from("test/mailstore/mail.gmi.org/dick/Lists/1687407844.gmi").exists());
store().delete_message("dick@mail.gmi.org", "Lists", "1687407844").unwrap();
assert!(!PathBuf::from("test/mailstore/mail.gmi.org/dick/Lists/1687407844.gmi").exists());
}
#[test]
fn add_remove_user() {
store().add_user("rob@misfin.example.org Rob Zombie").unwrap();
assert!(store().has_mailuser("rob@misfin.example.org"));
assert!(store().remove_user("rob@misfin.example.org"));
assert!(!store().has_mailuser("rob@misfin.example.org"));
}
} }

View file

@ -20,7 +20,7 @@ pub trait MailStore {
fn get_folder(&self, user: &str, folder: &str) -> Option<Folder>; fn get_folder(&self, user: &str, folder: &str) -> Option<Folder>;
/// Checks whether this server has a message with the given title for this user and if so /// Checks whether this server has a message with the given title for this user and if so
/// returns the message /// returns the message
fn get_message(&self, user: &str, folder: &str, title: &str) -> Option<Message>; fn get_message(&self, user: &str, folder: &str, id: &str) -> Option<Message>;
/// Move a message to a new folder /// Move a message to a new folder
fn move_message( fn move_message(
&mut self, &mut self,