diff --git a/src/mailstore/filesystem.rs b/src/mailstore/filesystem.rs index 1eb18d2..6638dad 100644 --- a/src/mailstore/filesystem.rs +++ b/src/mailstore/filesystem.rs @@ -140,11 +140,10 @@ impl MailStore for Filesystem { Some(folder) } - fn get_message(&self, user: &str, folder: &str, title: &str) -> Option { + fn get_message(&self, user: &str, folder: &str, id: &str) -> Option { self.get_folder(user, folder).and_then(|f| { f.messages - .values() - .find(|m| m.title.as_deref() == Some(title)) + .get(id) .cloned() }) } @@ -163,6 +162,7 @@ impl MailStore for Filesystem { path.push(user); path.push(folder); path.push(&message.id); + path.set_extension("gmi"); let mut fd = File::create(path)?; write!(fd, "{message}") } @@ -176,6 +176,7 @@ impl MailStore for Filesystem { path.push(user); path.push(folder); path.push(id); + path.set_extension("gmi"); if path.exists() { fs::remove_file(&path)?; } @@ -198,8 +199,10 @@ impl MailStore for Filesystem { let mut outfile = infile.clone(); infile.push(folder1); infile.push(id); + infile.set_extension("gmi"); outfile.push(folder2); outfile.push(id); + outfile.set_extension("gmi"); fs::copy(&infile, &outfile)?; fs::remove_file(infile)?; 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() == "misfin.example.org" && u.username == "jane" )); 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] @@ -330,4 +333,39 @@ mod tests { let msg = folder.messages.get("488571"); 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")); + } } diff --git a/src/mailstore/mod.rs b/src/mailstore/mod.rs index b7febb6..f654005 100644 --- a/src/mailstore/mod.rs +++ b/src/mailstore/mod.rs @@ -20,7 +20,7 @@ pub trait MailStore { fn get_folder(&self, user: &str, folder: &str) -> Option; /// Checks whether this server has a message with the given title for this user and if so /// returns the message - fn get_message(&self, user: &str, folder: &str, title: &str) -> Option; + fn get_message(&self, user: &str, folder: &str, id: &str) -> Option; /// Move a message to a new folder fn move_message( &mut self,