Added some tests for Filestore
This commit is contained in:
parent
12b10e382e
commit
8af4a5bc39
3 changed files with 87 additions and 2 deletions
|
@ -2,10 +2,11 @@ use {
|
||||||
super::*,
|
super::*,
|
||||||
crate::{message::Parser as MessageParser, prelude::ParseMailboxError},
|
crate::{message::Parser as MessageParser, prelude::ParseMailboxError},
|
||||||
std::{
|
std::{
|
||||||
|
ffi::OsString,
|
||||||
fs::{self, File},
|
fs::{self, File},
|
||||||
io::{self, BufWriter, Write},
|
io::{self, BufWriter, Write},
|
||||||
os::unix::fs::DirBuilderExt,
|
os::unix::fs::DirBuilderExt,
|
||||||
path::PathBuf,
|
path::{Path, PathBuf},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -25,6 +26,36 @@ pub struct Filesystem {
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<String> for Filesystem {
|
||||||
|
fn from(value: String) -> Self {
|
||||||
|
Self { path: value.into() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&str> for Filesystem {
|
||||||
|
fn from(value: &str) -> Self {
|
||||||
|
Self { path: value.into() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&Path> for Filesystem {
|
||||||
|
fn from(value: &Path) -> Self {
|
||||||
|
Self { path: value.into() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<PathBuf> for Filesystem {
|
||||||
|
fn from(value: PathBuf) -> Self {
|
||||||
|
Self { path: value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<OsString> for Filesystem {
|
||||||
|
fn from(value: OsString) -> Self {
|
||||||
|
Self { path: value.into() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl MailStore for Filesystem {
|
impl MailStore for Filesystem {
|
||||||
type Error = io::Error;
|
type Error = io::Error;
|
||||||
|
|
||||||
|
@ -98,7 +129,7 @@ impl MailStore for Filesystem {
|
||||||
};
|
};
|
||||||
dir.filter_map(Result::ok).for_each(|e| {
|
dir.filter_map(Result::ok).for_each(|e| {
|
||||||
if let Ok(contents) = fs::read_to_string(e.path()) {
|
if let Ok(contents) = fs::read_to_string(e.path()) {
|
||||||
if let Some(p) = e.path().to_str() {
|
if let Some(Some(p)) = e.path().file_stem().map(|s| s.to_str()) {
|
||||||
let parser = MessageParser::new(p);
|
let parser = MessageParser::new(p);
|
||||||
if let Ok(message) = parser.parse(&contents) {
|
if let Ok(message) = parser.parse(&contents) {
|
||||||
folder.messages.insert(message.id.clone(), message);
|
folder.messages.insert(message.id.clone(), message);
|
||||||
|
@ -253,3 +284,50 @@ impl MultiDomain for Filesystem {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn store() -> Filesystem {
|
||||||
|
"test/mailstore".into()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn users() {
|
||||||
|
let users = store().users();
|
||||||
|
assert!(users.iter().any(|u| u.host.to_string() == "mail.gmi.org" && u.username == "jane" ));
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serves_domain() {
|
||||||
|
let store = store();
|
||||||
|
assert!(store.serves_domain("mail.gmi.org"));
|
||||||
|
assert!(store.serves_domain("misfin.example.org"));
|
||||||
|
assert!(!store.serves_domain("iron.maiden.org"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn has_user() {
|
||||||
|
let store = store();
|
||||||
|
assert!(store.has_mailuser("jane@mail.gmi.org"));
|
||||||
|
assert!(store.has_mailuser("dick@mail.gmi.org"));
|
||||||
|
assert!(store.has_mailuser("jane@misfin.example.org"));
|
||||||
|
assert!(store.has_mailuser("dick@misfin.example.org"));
|
||||||
|
assert!(!store.has_mailuser("fred@mail.gmi.org"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_folder() {
|
||||||
|
let store = store();
|
||||||
|
let folder = store.get_folder("jane@mail.gmi.org", "Inbox").unwrap();
|
||||||
|
let msg = folder.messages.get("867017");
|
||||||
|
assert!(msg.is_some());
|
||||||
|
let msg = folder.messages.get("488571");
|
||||||
|
assert!(msg.is_some());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
< joe@bonamassa.sucks Joe Bonamassa
|
||||||
|
|
||||||
|
# Does anyone like my music?
|
||||||
|
Or should I just stop now?
|
|
@ -0,0 +1,3 @@
|
||||||
|
< april@we.wear.shortshorts.biz
|
||||||
|
|
||||||
|
This message is spam that probably never would have actually been delivered
|
Loading…
Add table
Reference in a new issue