Ported tests over, fixed tests

pull/7/head
Benedikt Terhechte 3 years ago
parent 108d6d31e8
commit 2633ef6b4c

4
Cargo.lock generated

@ -1557,7 +1557,9 @@ name = "postsack"
version = "0.2.0" version = "0.2.0"
dependencies = [ dependencies = [
"ps-core", "ps-core",
"ps-database",
"ps-gui", "ps-gui",
"ps-importer",
] ]
[[package]] [[package]]
@ -1608,8 +1610,10 @@ dependencies = [
"crossbeam-channel", "crossbeam-channel",
"eyre", "eyre",
"flate2", "flate2",
"getrandom",
"lru", "lru",
"once_cell", "once_cell",
"rand",
"regex", "regex",
"rsql_builder", "rsql_builder",
"serde", "serde",

@ -19,9 +19,8 @@ osx_minimum_system_version = "10.14"
[dependencies] [dependencies]
ps-gui = { path = "../ps-gui" } ps-gui = { path = "../ps-gui" }
ps-core = { path = "../ps-core" } ps-core = { path = "../ps-core" }
ps-importer = { path = "../ps-importer" }
[profile.dev] ps-database = { path = "../ps-database" }
split-debuginfo = "unpacked"
#[profile.release] #[profile.release]
#lto = "fat" #lto = "fat"

@ -1,12 +1,10 @@
use eframe::egui; use ps_core::{
use postsack::{
self, self,
database::query::{Field, Filter, ValueField}, model::{self, Engine, Rect},
importer::Importerlike, Config, DatabaseLike, Field, Filter, FormatType, Importerlike, ValueField,
model::{self, Engine},
types::Config,
types::FormatType,
}; };
use ps_database::Database;
use ps_importer::mbox_importer;
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
@ -20,7 +18,7 @@ mod tests {
if std::env::var("RUST_LOG").is_err() { if std::env::var("RUST_LOG").is_err() {
std::env::set_var("RUST_LOG", "trace"); std::env::set_var("RUST_LOG", "trace");
} }
postsack::setup_tracing(); ps_core::setup_tracing();
}); });
} }
@ -28,7 +26,7 @@ mod tests {
fn test_engine_all() { fn test_engine_all() {
initialize(); initialize();
let config = create_database(); let config = create_database();
let mut engine = Engine::new(&config).expect("Expected Engine"); let mut engine = Engine::new::<Database>(&config).expect("Expected Engine");
engine.start().expect("Expect to start engine"); engine.start().expect("Expect to start engine");
engine.wait().expect("Expected working wait"); engine.wait().expect("Expected working wait");
let segment = { let segment = {
@ -85,19 +83,21 @@ mod tests {
} }
} }
fn default_rect() -> egui::Rect { fn default_rect() -> Rect {
egui::Rect::from_min_size( Rect {
egui::Pos2 { x: 50.0, y: 50.0 }, left: 50.0,
egui::Vec2 { x: 500.0, y: 500.0 }, top: 50.0,
) width: 500.0,
height: 500.0,
}
} }
fn create_database() -> Config { fn create_database() -> Config {
let path = "tests/resources/mbox"; let path = "tests/resources/mbox";
let config = postsack::types::Config::new(None, path, vec!["".to_string()], FormatType::Mbox) let config = Config::new(None, path, vec!["".to_string()], FormatType::Mbox).expect("Config");
.expect("Config"); let importer = mbox_importer(config.clone());
let importer = postsack::importer::mbox_importer(config.clone()); let database = Database::new(&config.database_path).unwrap();
let (_receiver, handle) = importer.import().unwrap(); let (_receiver, handle) = importer.import(database).unwrap();
handle.join().expect("").expect(""); handle.join().expect("").expect("");
config config
} }

@ -1,14 +1,10 @@
use postsack::{ use ps_core::{self, DatabaseLike, FormatType, Importerlike};
self, use ps_database::Database;
database::{query, Database}, use ps_importer;
importer::Importerlike,
types::FormatType,
};
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use postsack::database::{query::Field, query_result::QueryResult}; use ps_core::{Config, Field, Query, QueryResult};
use std::sync::Once; use std::sync::Once;
use super::*; use super::*;
@ -20,7 +16,7 @@ mod tests {
if std::env::var("RUST_LOG").is_err() { if std::env::var("RUST_LOG").is_err() {
std::env::set_var("RUST_LOG", "trace"); std::env::set_var("RUST_LOG", "trace");
} }
postsack::setup_tracing(); ps_core::setup_tracing();
}); });
} }
@ -30,20 +26,19 @@ mod tests {
initialize(); initialize();
let path = "tests/resources/mbox"; let path = "tests/resources/mbox";
let config = let config =
postsack::types::Config::new(None, path, vec!["".to_string()], FormatType::Mbox) Config::new(None, path, vec!["".to_string()], FormatType::Mbox).expect("Config");
.expect("Config"); let importer = ps_importer::mbox_importer(config.clone());
let importer = postsack::importer::mbox_importer(config.clone()); let database = Database::new(&config.database_path).unwrap();
let (_receiver, handle) = importer.import().unwrap(); let (_receiver, handle) = importer.import(database).unwrap();
handle.join().expect("").expect(""); handle.join().expect("").expect("");
// The temporary database path
let db = Database::new(&config.database_path).unwrap(); let db = Database::new(&config.database_path).unwrap();
let total_mails = db.total_mails().expect("Expected total mails"); let total_mails = db.total_mails().expect("Expected total mails");
assert_eq!(total_mails, 141); assert_eq!(total_mails, 141);
let mails = db.query(&query::Query::Normal { let mails = db.query(&Query::Normal {
fields: vec![query::Field::Subject], fields: vec![Field::Subject],
filters: Vec::new(), filters: Vec::new(),
range: 0..141, range: 0..141,
}); });
@ -69,15 +64,17 @@ mod tests {
initialize(); initialize();
let path = "tests/resources/applemail"; let path = "tests/resources/applemail";
let config = let config =
postsack::types::Config::new(None, path, vec!["".to_string()], FormatType::AppleMail) Config::new(None, path, vec!["".to_string()], FormatType::AppleMail).expect("Config");
.expect("Config"); let importer = ps_importer::applemail_importer(config.clone());
let importer = postsack::importer::applemail_importer(config.clone());
let (_receiver, handle) = importer.import().unwrap(); let (_receiver, handle) = importer
.import(Database::new(&config.database_path).unwrap())
.unwrap();
handle.join().expect("").expect(""); handle.join().expect("").expect("");
// The temporary database path // The temporary database path
let db = Database::new(&config.database_path).unwrap(); let db = Database::new(&config.database_path).unwrap();
let mails = db.query(&query::Query::Normal { let mails = db.query(&Query::Normal {
fields: vec![query::Field::Subject], fields: vec![Field::Subject],
filters: Vec::new(), filters: Vec::new(),
range: 0..10, range: 0..10,
}); });

@ -22,6 +22,12 @@ strum = "0.23.0"
strum_macros = "0.23.0" strum_macros = "0.23.0"
lru = { version = "0.7.0", optional = true } lru = { version = "0.7.0", optional = true }
shellexpand = "2.1.0" shellexpand = "2.1.0"
rand = "0.8.4"
[target."cfg(target_arch = \"wasm32\")".dependencies]
# https://docs.rs/getrandom/latest/getrandom/#webassembly-support
getrandom = { version = "0.2", features = ["js"] }
[features] [features]
default = ["lru"] default = ["lru"]

@ -8,7 +8,8 @@ use std::iter::FromIterator;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::str::FromStr; use std::str::FromStr;
// use super::ImporterFormatType; // FIXME: This abstraction should be in the `ps-importer` crate with only
// a protocol here.
#[derive(Debug, Clone, Copy, PartialEq, Eq, IntoStaticStr, EnumIter)] #[derive(Debug, Clone, Copy, PartialEq, Eq, IntoStaticStr, EnumIter)]
pub enum FormatType { pub enum FormatType {
@ -29,17 +30,6 @@ impl FormatType {
FormatType::Mbox => "Mbox", FormatType::Mbox => "Mbox",
} }
} }
/// Forward the importer format location
pub fn default_path(&self) -> Option<PathBuf> {
todo!()
// use crate::importer::formats::{self, ImporterFormat};
// match self {
// FormatType::AppleMail => formats::AppleMail::default_path(),
// FormatType::GmailVault => formats::Gmail::default_path(),
// FormatType::Mbox => formats::Mbox::default_path(),
// }
}
} }
impl Default for FormatType { impl Default for FormatType {
@ -154,7 +144,7 @@ impl Config {
let database_path = match db { let database_path = match db {
Some(n) => n.as_ref().to_path_buf(), Some(n) => n.as_ref().to_path_buf(),
None => { None => {
let number = timestamp(); let number = random_filename();
let folder = "postsack"; let folder = "postsack";
let filename = format!("{}.sqlite", number); let filename = format!("{}.sqlite", number);
let mut temp_dir = std::env::temp_dir(); let mut temp_dir = std::env::temp_dir();
@ -201,11 +191,10 @@ impl Config {
} }
} }
fn timestamp() -> u32 { fn random_filename() -> String {
use std::time::{SystemTime, UNIX_EPOCH}; use rand::Rng;
let start = SystemTime::now(); let number: u32 = rand::thread_rng().gen();
let since_the_epoch = start let folder = "postsack";
.duration_since(UNIX_EPOCH) let filename = format!("{}.sqlite", number);
.expect("Time went backwards"); return filename;
since_the_epoch.as_millis() as u32
} }

@ -155,7 +155,7 @@ impl StartupUI {
self.open_email_folder_dialog() self.open_email_folder_dialog()
} }
if self.format == FormatType::AppleMail && ui.button("or Mail.app default folder").clicked(){ if self.format == FormatType::AppleMail && ui.button("or Mail.app default folder").clicked(){
self.email_folder = self.format.default_path(); self.email_folder = ps_importer::default_path(&self.format);
} }
}); });
ui.end_row(); ui.end_row();
@ -302,9 +302,7 @@ impl StartupUI {
fn open_email_folder_dialog(&mut self) { fn open_email_folder_dialog(&mut self) {
let fallback = shellexpand::tilde("~/"); let fallback = shellexpand::tilde("~/");
let default_path = self let default_path = ps_importer::default_path(&self.format)
.format
.default_path()
.unwrap_or_else(|| std::path::Path::new(&fallback.to_string()).to_path_buf()); .unwrap_or_else(|| std::path::Path::new(&fallback.to_string()).to_path_buf());
let folder = match tinyfiledialogs::select_folder_dialog( let folder = match tinyfiledialogs::select_folder_dialog(

@ -4,10 +4,11 @@ pub(crate) mod formats;
use formats::{shared, ImporterFormat}; use formats::{shared, ImporterFormat};
use std::thread::JoinHandle; use std::{path::PathBuf, thread::JoinHandle};
use ps_core::{ use ps_core::{
crossbeam_channel::unbounded, Config, DatabaseLike, Importerlike, Message, MessageReceiver, crossbeam_channel::unbounded, Config, DatabaseLike, FormatType, Importerlike, Message,
MessageReceiver,
}; };
pub struct Importer<Format: ImporterFormat> { pub struct Importer<Format: ImporterFormat> {
@ -65,3 +66,11 @@ pub fn applemail_importer(config: Config) -> Importer<formats::AppleMail> {
pub fn mbox_importer(config: Config) -> Importer<formats::Mbox> { pub fn mbox_importer(config: Config) -> Importer<formats::Mbox> {
Importer::new(config, formats::Mbox::default()) Importer::new(config, formats::Mbox::default())
} }
pub fn default_path(format: &FormatType) -> Option<PathBuf> {
match format {
FormatType::AppleMail => formats::AppleMail::default_path(),
FormatType::GmailVault => formats::Gmail::default_path(),
FormatType::Mbox => formats::Mbox::default_path(),
}
}

Loading…
Cancel
Save