Wrote initial tests

pull/4/head
Benedikt Terhechte 3 years ago
parent d95a50d0f5
commit c4b21f1e79

@ -6,6 +6,7 @@ mod message_adapter;
use crate::types::Config;
pub use formats::shared::email::{EmailEntry, EmailMeta};
pub use importer::Importerlike;
pub use message_adapter::*;
use formats::ImporterFormat;

@ -9,7 +9,7 @@ pub mod database;
#[cfg(feature = "gui")]
pub mod gui;
pub mod importer;
mod model;
pub mod model;
pub mod types;
pub fn setup_tracing() {

@ -215,6 +215,19 @@ impl Engine {
pub fn is_busy(&self) -> bool {
self.link.is_processing() || self.segmentations.is_empty()
}
/// Blocking waiting until the current operation is done
/// This is useful for usage on a commandline or in unit tests
#[allow(unused)]
pub fn wait(&mut self) -> Result<()> {
loop {
self.process()?;
if !self.link.is_processing() {
break;
}
}
Ok(())
}
}
/// Return the default aggregation fields for each segmentation stack level

@ -5,6 +5,10 @@
//! This allows sending operations into `Link` and retrieving the contents
//! asynchronously without blocking the UI.
use std::sync::{
atomic::{AtomicUsize, Ordering},
Arc,
};
use std::{collections::HashSet, convert::TryInto};
use crossbeam_channel::{unbounded, Receiver, Sender};
@ -41,12 +45,12 @@ pub(super) struct Link<Context: Send + 'static> {
// There's also a delay between a request taken out of the input channel and being
// put into the output channel. In order to account for all of this, we employ a
// request counter to know how many requests are currently in the pipeline
request_counter: usize,
request_counter: Arc<AtomicUsize>,
}
impl<Context: Send + Sync + 'static> Link<Context> {
pub fn request(&mut self, query: &Query, context: Context) -> Result<()> {
self.request_counter += 1;
self.request_counter.fetch_add(1, Ordering::Relaxed);
self.input_sender.send((query.clone(), context))?;
Ok(())
}
@ -56,7 +60,7 @@ impl<Context: Send + Sync + 'static> Link<Context> {
// We received something
Ok(Ok(response)) => {
// Only subtract if we successfuly received a value
self.request_counter -= 1;
self.request_counter.fetch_sub(1, Ordering::Relaxed);
Ok(Some(response))
}
// We received nothing
@ -67,7 +71,11 @@ impl<Context: Send + Sync + 'static> Link<Context> {
}
pub fn is_processing(&self) -> bool {
self.request_counter > 0
self.request_counter.load(Ordering::Relaxed) > 0
}
pub fn request_counter(&self) -> Arc<AtomicUsize> {
self.request_counter.clone()
}
}
@ -80,7 +88,7 @@ pub(super) fn run<Context: Send + Sync + 'static>(config: &Config) -> Result<Lin
Ok(Link {
input_sender,
output_receiver,
request_counter: 0,
request_counter: Arc::new(AtomicUsize::new(0)),
})
}

@ -0,0 +1,376 @@
17829
Return-Path: <philipp@philippkatz.de>
X-Original-To: philipp@philippkatz.de
Delivered-To: m0137cc3@dd34906.kasserver.com
Received: from liliput4.fritz.box (port-92-195-65-145.dynamic.qsc.de [92.195.65.145])
by dd34906.kasserver.com (Postfix) with ESMTPSA id 1E8EF1700426
for <philipp@philippkatz.de>; Fri, 26 Jan 2018 22:01:17 +0100 (CET)
From: Philipp Katz <philipp@philippkatz.de>
Content-Type: multipart/alternative;
boundary="Apple-Mail=_F073CB14-2AA7-40E0-88F6-8C1A8748438B"
Mime-Version: 1.0 (Mac OS X Mail 10.3 \(3273\))
Subject: Fwd: Lorem ipsum
Message-Id: <4BBE1408-23D6-49EB-A4E9-86D9871F7719@philippkatz.de>
References: <6CA3DEF1-B7E5-44B5-A36E-12E03F2D5531@philippkatz.de>
To: Philipp Katz <philipp@philippkatz.de>
Date: Fri, 26 Jan 2018 22:01:16 +0100
X-Mailer: Apple Mail (2.3273)
X-KasLoop: m0137cc3
--Apple-Mail=_F073CB14-2AA7-40E0-88F6-8C1A8748438B
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=us-ascii
> Anfang der weitergeleiteten Nachricht:
>=20
> Von: Philipp Katz <philipp@philippkatz.de>
> Betreff: Wtr: Lorem ipsum
> Datum: 26. Januar 2018 um 17:34:59 MEZ
> An: Philipp Katz <philipp@philippkatz.de>
>=20
>=20
>=20
>=20
>> Anfang der weitergeleiteten Nachricht:
>>=20
>> Von: Philipp Katz <philipp@philippkatz.de =
<mailto:philipp@philippkatz.de>>
>> Betreff: Wtr: Lorem ipsum
>> Datum: 26. Januar 2018 um 17:32:21 MEZ
>> An: Philipp Katz <philipp@philippkatz.de =
<mailto:philipp@philippkatz.de>>
>>=20
>> But I must explain to you how all this mistaken idea of denouncing =
pleasure and praising pain was born and I will give you a complete =
account of the system, and expound the actual teachings of the great =
explorer of the truth, the master-builder of human happiness. No one =
rejects, dislikes, or avoids pleasure itself, because it is pleasure, =
but because those who do not know how to pursue pleasure rationally =
encounter consequences that are extremely painful. Nor again is there =
anyone who loves or pursues or desires to obtain pain of itself, because =
it is pain, but because occasionally circumstances occur in which toil =
and pain can procure him some great pleasure. To take a trivial example, =
which of us ever undertakes laborious physical exercise, except to =
obtain some advantage from it? But who has any right to find fault with =
a man who chooses to enjoy a pleasure that has no annoying consequences, =
or one who avoids a pain that produces no resultant pleasure?=20
>>=20
>=20
>>=20
>>=20
>>> Anfang der weitergeleiteten Nachricht:
>>>=20
>>> Von: Philipp Katz <philipp@philippkatz.de =
<mailto:philipp@philippkatz.de>>
>>> Betreff: Lorem ipsum
>>> Datum: 26. Januar 2018 um 17:28:24 MEZ
>>> An: Philipp Katz <philipp@philippkatz.de =
<mailto:philipp@philippkatz.de>>
>>>=20
>>> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam =
nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, =
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea =
rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem =
ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing =
elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna =
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo =
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus =
est Lorem ipsum dolor sit amet.
>>>=20
>>> http://example.com <http://example.com/>
>>>=20
>>>=20
>=20
>>>=20
>>>=20
>>=20
>=20
--Apple-Mail=_F073CB14-2AA7-40E0-88F6-8C1A8748438B
Content-Type: multipart/mixed;
boundary="Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886"
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: 7bit
Content-Type: text/html;
charset=us-ascii
<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""></body></html>
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=short.txt
Content-Type: text/plain;
name=short.txt;
x-unix-mode=0644
X-Apple-Content-Length: 12
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=us-ascii
<html><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;"><head><meta =
http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dus-ascii"></head><br class=3D"">
<div><br class=3D""><blockquote type=3D"cite" class=3D""><div =
class=3D"">Anfang der weitergeleiteten Nachricht:</div><br =
class=3D"Apple-interchange-newline"><div style=3D"margin-top: 0px; =
margin-right: 0px; margin-bottom: 0px; margin-left: 0px;" class=3D""><span=
style=3D"font-family: -webkit-system-font, Helvetica Neue, Helvetica, =
sans-serif; color:rgba(0, 0, 0, 1.0);" class=3D""><b class=3D"">Von: =
</b></span><span style=3D"font-family: -webkit-system-font, Helvetica =
Neue, Helvetica, sans-serif;" class=3D"">Philipp Katz &lt;<a =
href=3D"mailto:philipp@philippkatz.de" =
class=3D"">philipp@philippkatz.de</a>&gt;<br class=3D""></span></div><div =
style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; =
margin-left: 0px;" class=3D""><span style=3D"font-family: =
-webkit-system-font, Helvetica Neue, Helvetica, sans-serif; =
color:rgba(0, 0, 0, 1.0);" class=3D""><b class=3D"">Betreff: =
</b></span><span style=3D"font-family: -webkit-system-font, Helvetica =
Neue, Helvetica, sans-serif;" class=3D""><b class=3D"">Wtr: Lorem =
ipsum</b><br class=3D""></span></div><div style=3D"margin-top: 0px; =
margin-right: 0px; margin-bottom: 0px; margin-left: 0px;" class=3D""><span=
style=3D"font-family: -webkit-system-font, Helvetica Neue, Helvetica, =
sans-serif; color:rgba(0, 0, 0, 1.0);" class=3D""><b class=3D"">Datum: =
</b></span><span style=3D"font-family: -webkit-system-font, Helvetica =
Neue, Helvetica, sans-serif;" class=3D"">26. Januar 2018 um 17:34:59 =
MEZ<br class=3D""></span></div><div style=3D"margin-top: 0px; =
margin-right: 0px; margin-bottom: 0px; margin-left: 0px;" class=3D""><span=
style=3D"font-family: -webkit-system-font, Helvetica Neue, Helvetica, =
sans-serif; color:rgba(0, 0, 0, 1.0);" class=3D""><b class=3D"">An: =
</b></span><span style=3D"font-family: -webkit-system-font, Helvetica =
Neue, Helvetica, sans-serif;" class=3D"">Philipp Katz &lt;<a =
href=3D"mailto:philipp@philippkatz.de" =
class=3D"">philipp@philippkatz.de</a>&gt;<br class=3D""></span></div><br =
class=3D""><div class=3D""><meta http-equiv=3D"Content-Type" =
content=3D"text/html charset=3Dus-ascii" class=3D""><div =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" =
class=3D""></div></div></blockquote></div></body></html>=
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename=original.doc
Content-Type: application/msword;
name=original.doc;
x-unix-mode=0666
X-Apple-Content-Length: 35967
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=us-ascii
<html><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;"><head><meta =
http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dus-ascii"></head><div =
class=3D"AppleOriginalContents"><blockquote type=3D"cite"><div><div =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" class=3D""><meta =
http-equiv=3D"Content-Type" content=3D"text/html charset=3Dus-ascii" =
class=3D""><br class=3D"">
<div class=3D""><br class=3D""><blockquote type=3D"cite" class=3D""><div =
class=3D"">Anfang der weitergeleiteten Nachricht:</div><br =
class=3D"Apple-interchange-newline"><div style=3D"margin-top: 0px; =
margin-right: 0px; margin-bottom: 0px; margin-left: 0px;" class=3D""><span=
style=3D"font-family: -webkit-system-font, 'Helvetica Neue', Helvetica, =
sans-serif;" class=3D""><b class=3D"">Von: </b></span><span =
style=3D"font-family: -webkit-system-font, Helvetica Neue, Helvetica, =
sans-serif;" class=3D"">Philipp Katz &lt;<a =
href=3D"mailto:philipp@philippkatz.de" =
class=3D"">philipp@philippkatz.de</a>&gt;<br class=3D""></span></div><div =
style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; =
margin-left: 0px;" class=3D""><span style=3D"font-family: =
-webkit-system-font, 'Helvetica Neue', Helvetica, sans-serif;" =
class=3D""><b class=3D"">Betreff: </b></span><span style=3D"font-family: =
-webkit-system-font, Helvetica Neue, Helvetica, sans-serif;" class=3D""><b=
class=3D"">Wtr: Lorem ipsum</b><br class=3D""></span></div><div =
style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; =
margin-left: 0px;" class=3D""><span style=3D"font-family: =
-webkit-system-font, 'Helvetica Neue', Helvetica, sans-serif;" =
class=3D""><b class=3D"">Datum: </b></span><span style=3D"font-family: =
-webkit-system-font, Helvetica Neue, Helvetica, sans-serif;" =
class=3D"">26. Januar 2018 um 17:32:21 MEZ<br class=3D""></span></div><div=
style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; =
margin-left: 0px;" class=3D""><span style=3D"font-family: =
-webkit-system-font, 'Helvetica Neue', Helvetica, sans-serif;" =
class=3D""><b class=3D"">An: </b></span><span style=3D"font-family: =
-webkit-system-font, Helvetica Neue, Helvetica, sans-serif;" =
class=3D"">Philipp Katz &lt;<a href=3D"mailto:philipp@philippkatz.de" =
class=3D"">philipp@philippkatz.de</a>&gt;<br class=3D""></span></div><br =
class=3D""><div class=3D""><meta http-equiv=3D"Content-Type" =
content=3D"text/html charset=3Dus-ascii" class=3D""><div =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" class=3D"">But I must explain to =
you how all this mistaken idea of denouncing pleasure and praising =
pain&nbsp;was born and I will give you a complete account of the system, =
and expound the actual&nbsp;teachings of the great explorer of the =
truth, the master-builder of human happiness. No one&nbsp;rejects, =
dislikes, or avoids pleasure itself, because it is pleasure, but because =
those who do not&nbsp;know how to pursue pleasure rationally encounter =
consequences that are extremely painful. Nor&nbsp;again is there anyone =
who loves or pursues or desires to obtain pain of itself, because it is =
pain,&nbsp;but because occasionally circumstances occur in which toil =
and pain can procure him some great&nbsp;pleasure. To take a trivial =
example, which of us ever undertakes laborious physical =
exercise,&nbsp;except to obtain some advantage from it? But who has any =
right to find fault with a man who&nbsp;chooses to enjoy a pleasure that =
has no annoying consequences, or one who avoids a pain =
that&nbsp;produces no resultant pleasure?&nbsp;<br class=3D""><br =
class=3D""></div></div></blockquote></div></div></div></blockquote></div><=
/body></html>=
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename=text.txt
Content-Type: text/plain;
name=text.txt;
x-unix-mode=0644
X-Apple-Content-Length: 2146
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=us-ascii
<html><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;"><head><meta =
http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dus-ascii"></head><div =
class=3D"AppleOriginalContents"><blockquote type=3D"cite"><div><div =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" class=3D""><meta =
http-equiv=3D"Content-Type" content=3D"text/html charset=3Dus-ascii" =
class=3D""><div class=3D""><blockquote type=3D"cite" class=3D""><div =
class=3D""><div style=3D"word-wrap: break-word; -webkit-nbsp-mode: =
space; -webkit-line-break: after-white-space;" class=3D""><meta =
http-equiv=3D"Content-Type" content=3D"text/html charset=3Dus-ascii" =
class=3D""><br class=3D"">
<div class=3D""><br class=3D""><blockquote type=3D"cite" class=3D""><div =
class=3D"">Anfang der weitergeleiteten Nachricht:</div><br =
class=3D"Apple-interchange-newline"><div style=3D"margin-top: 0px; =
margin-right: 0px; margin-bottom: 0px; margin-left: 0px;" class=3D""><span=
style=3D"font-family: -webkit-system-font, 'Helvetica Neue', Helvetica, =
sans-serif;" class=3D""><b class=3D"">Von: </b></span><span =
style=3D"font-family: -webkit-system-font, Helvetica Neue, Helvetica, =
sans-serif;" class=3D"">Philipp Katz &lt;<a =
href=3D"mailto:philipp@philippkatz.de" =
class=3D"">philipp@philippkatz.de</a>&gt;<br class=3D""></span></div><div =
style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; =
margin-left: 0px;" class=3D""><span style=3D"font-family: =
-webkit-system-font, 'Helvetica Neue', Helvetica, sans-serif;" =
class=3D""><b class=3D"">Betreff: </b></span><span style=3D"font-family: =
-webkit-system-font, Helvetica Neue, Helvetica, sans-serif;" class=3D""><b=
class=3D"">Lorem ipsum</b><br class=3D""></span></div><div =
style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; =
margin-left: 0px;" class=3D""><span style=3D"font-family: =
-webkit-system-font, 'Helvetica Neue', Helvetica, sans-serif;" =
class=3D""><b class=3D"">Datum: </b></span><span style=3D"font-family: =
-webkit-system-font, Helvetica Neue, Helvetica, sans-serif;" =
class=3D"">26. Januar 2018 um 17:28:24 MEZ<br class=3D""></span></div><div=
style=3D"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; =
margin-left: 0px;" class=3D""><span style=3D"font-family: =
-webkit-system-font, 'Helvetica Neue', Helvetica, sans-serif;" =
class=3D""><b class=3D"">An: </b></span><span style=3D"font-family: =
-webkit-system-font, Helvetica Neue, Helvetica, sans-serif;" =
class=3D"">Philipp Katz &lt;<a href=3D"mailto:philipp@philippkatz.de" =
class=3D"">philipp@philippkatz.de</a>&gt;<br class=3D""></span></div><br =
class=3D""><div class=3D""><meta http-equiv=3D"Content-Type" =
content=3D"text/html charset=3Dus-ascii" class=3D""><div =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" class=3D""><div dir=3D"auto" =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" class=3D"">Lorem ipsum dolor sit =
amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor =
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At =
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd =
gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem =
ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy =
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam =
voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet =
clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit =
amet.</div><div dir=3D"auto" style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" =
class=3D""><br class=3D""></div><div dir=3D"auto" style=3D"word-wrap: =
break-word; -webkit-nbsp-mode: space; -webkit-line-break: =
after-white-space;" class=3D""><a href=3D"http://example.com/" =
class=3D"">http://example.com</a></div><div dir=3D"auto" =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" class=3D""><br =
class=3D""></div><div dir=3D"auto" style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" =
class=3D""><br class=3D""></div><div dir=3D"auto" style=3D"word-wrap: =
break-word; -webkit-nbsp-mode: space; -webkit-line-break: =
after-white-space;" =
class=3D""></div></div></div></blockquote></div></div></div></blockquote><=
/div></div></div></blockquote></div></body></html>=
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename=image001.png
Content-Type: image/png;
name=image001.png;
x-unix-mode=0644
X-Apple-Content-Length: 101404
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=us-ascii
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dus-ascii"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" =
class=3D""><div><blockquote type=3D"cite" class=3D""><div class=3D""><meta=
http-equiv=3D"Content-Type" content=3D"text/html charset=3Dus-ascii" =
class=3D""><div style=3D"word-wrap: break-word; -webkit-nbsp-mode: =
space; -webkit-line-break: after-white-space;" class=3D""><div =
class=3D""><blockquote type=3D"cite" class=3D""><div class=3D""><meta =
http-equiv=3D"Content-Type" content=3D"text/html charset=3Dus-ascii" =
class=3D""><div style=3D"word-wrap: break-word; -webkit-nbsp-mode: =
space; -webkit-line-break: after-white-space;" class=3D""><div =
class=3D""><blockquote type=3D"cite" class=3D""><div class=3D""><div =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" class=3D""><div dir=3D"auto" =
style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
-webkit-line-break: after-white-space;" class=3D""><br class=3D"">
<br class=3D""></div></div></div></blockquote></div><br =
class=3D""></div></div></blockquote></div><br =
class=3D""></div></div></blockquote></div><br class=3D""></body></html>=
--Apple-Mail=_199BBC0B-37DE-426E-862E-2207565E5886--
--Apple-Mail=_F073CB14-2AA7-40E0-88F6-8C1A8748438B--
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>color</key>
<string>000000</string>
<key>date-last-viewed</key>
<integer>1517000482</integer>
<key>date-received</key>
<integer>1517000478</integer>
<key>flags</key>
<integer>8623689857</integer>
<key>remote-id</key>
<string>50758</string>
</dict>
</plist>

@ -0,0 +1,34 @@
497
Subject: Re: Emlx library
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8
From: Michael <michael@example.com>
In-Reply-To: <6FA2F219-2B7C-4962-9724-E9399409CCBE@example.com>
Date: Thu, 6 Feb 2020 15:39:55 +0200
Content-Transfer-Encoding: quoted-printable
Message-Id: <7A129E26-2C1F-4517-B6B5-39460ED50E12@example.com>
References: <6FA2F219-2B7C-4962-9724-E9399409CCBE@example.com>
To: Python <python@example.com>
You're welcome. :)
> Python <python@example.com> wrote:
>
> Thank you!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>conversation-id</key>
<integer>123456</integer>
<key>date-last-viewed</key>
<integer>1581111111</integer>
<key>date-received</key>
<integer>1581000000</integer>
<key>flags</key>
<integer>8623489089</integer>
<key>remote-id</key>
<string>789</string>
</dict>
</plist>

@ -0,0 +1,28 @@
639
Subject: Re: Emlx library
Mime-Version: 1.0
Content-Type: text/html; charset=utf-8
From: Michael <michael@example.com>
Date: Mon, 29 Mar 2021 18:52:23 +0200
Content-Transfer-Encoding: 7bit
Message-Id: <83E25460-8C9A-45AD-87BA-B3D70DFBC2E7@example.com>
References: <6FA2F219-2B7C-4962-9724-E9399409CCBE@example.com>
To: Python <python@example.com>
<html><head></head><body dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div><div>You're welcome. :)</div><div><br></div><div>&gt; Python &lt;python@example.com&gt; wrote:</div><div>&gt;</div><div>&gt; Thank you!</div></div></body></html>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>conversation-id</key>
<integer>123457</integer>
<key>date-last-viewed</key>
<integer>1617036766</integer>
<key>date-received</key>
<integer>1617036743</integer>
<key>flags</key>
<integer>8623489089</integer>
<key>remote-id</key>
<string>790</string>
</dict>
</plist>

@ -0,0 +1,252 @@
16062
Received: from ha17112345212@126.com (unknown [101.229.174.243:57513])
by IMAP (Coremail) with SMTP id ZeVRDAAHgUNRQEpd;
Wed, 07 Aug 2019 11:26:30 +0800 (CST)
From: kpc <ha17112345212@126.com>
Content-Type: multipart/alternative;
boundary="Apple-Mail=_6F8B7CD2-7D4F-4BF1-8AC6-1CE5B9CA3980"
Message-Id: <23CC1A87-AE0C-4206-AAED-4FBED372F69E@163.com>
Mime-Version: 1.0 (Mac OS X Mail 9.1 \(3096.5\))
X-Smtp-Server: 9681E158-CB69-430E-A675-74120513E980
Date: Wed, 7 Aug 2019 11:26:26 +0800
Subject: =?utf-8?B?5paH5pys4p6V5Y2V54Wn54mH?=
Bcc: 2671239312@qq.com
X-Universally-Unique-Identifier: 34AEFBC3-42F1-4DC9-863C-689C4EFB5906
Cc: 1512347812@qq.com
To: cxymenghao@forenddd.cn
--Apple-Mail=_6F8B7CD2-7D4F-4BF1-8AC6-1CE5B9CA3980
Content-Transfer-Encoding: base64
Content-Type: text/plain;
charset=utf-8
5aW955yL55qE5ZGA5bCP54uX8J+QtuKAlOKAlDguNw==
--Apple-Mail=_6F8B7CD2-7D4F-4BF1-8AC6-1CE5B9CA3980
Content-Type: multipart/related;
type="text/html";
boundary="Apple-Mail=_E3CF9E2E-167D-471E-BC41-4BC4E698C09B"
--Apple-Mail=_E3CF9E2E-167D-471E-BC41-4BC4E698C09B
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=utf-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html =
charset=3Dutf-8"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" =
class=3D""><img apple-inline=3D"yes" =
id=3D"94CFEF0C-35C4-4395-9D18-1984DC7AC237" height=3D"320" width=3D"180" =
apple-width=3D"yes" apple-height=3D"yes" =
src=3D"cid:91AF50D6-6DB5-47E7-890C-42943483AA03@localdomain" =
class=3D"">=E5=A5=BD=E7=9C=8B=E7=9A=84=E5=91=80=E5=B0=8F=E7=8B=97=F0=9F=90=
=B6=E2=80=94=E2=80=948.7</body></html>=
--Apple-Mail=_E3CF9E2E-167D-471E-BC41-4BC4E698C09B
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename*0=magazine-unlock-05-2.3.1417-29eba6ac323848b7aca161fdb67290cf.jpe;
filename*1=g
Content-Type: image/jpeg;
name="magazine-unlock-05-2.3.1417-29eba6ac323848b7aca161fdb67290cf.jpeg"
Content-Id: <91AF50D6-6DB5-47E7-890C-42943483AA03@localdomain>
/9j/4AAQSkZJRgABAQAASABIAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUA
AAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgBQAC0AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAA
AAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQy
gZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVm
Z2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS
09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYH
CAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1Lw
FWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5
eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj
5OXm5+jp6vLz9PX29/j5+v/bAEMAAgICAgICAwICAwUDAwMFBgUFBQUGCAYGBgYGCAoICAgICAgK
CgoKCgoKCgwMDAwMDA4ODg4ODw8PDw8PDw8PD//bAEMBAgICBAQEBwQEBxALCQsQEBAQEBAQEBAQ
EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/dAAQADP/aAAwDAQACEQMR
AD8A/JgCnik7Uor54/QUh3anZ7UgpwFSyhRTqMcU7pzSGJ7ilHNL1FGOaAF60tApQOtAxRUgNNAp
1QykhRTweaaMYpw9aRSFop2OKAKBiClFLRzzQJDe9PApBUmKAY0CnUuKSgBKOf8AIoozRYep/9D8
maeAKTGaeOK+dP0NDu1KMUvagVI7DqWjqKdQVYOlLxQBmpMUmwSDFKBSiipKDilFAp4pDDFOHWgU
4CgYuOKSnUlAWDJ596CKKcOaBXEA5p9NHWnUA0A4oopKB2FopMCjAoCx/9H8nMU4fzpKUdeK+dP0
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
fMFHmCiwcxpic0vnmszzFo8xaLBc/9k=
--Apple-Mail=_E3CF9E2E-167D-471E-BC41-4BC4E698C09B--
--Apple-Mail=_6F8B7CD2-7D4F-4BF1-8AC6-1CE5B9CA3980--
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>date-last-viewed</key>
<real>0.0</real>
<key>date-received</key>
<real>1565148386</real>
<key>flags</key>
<integer>8590132225</integer>
<key>remote-id</key>
<string>1561088045</string>
</dict>
</plist>

@ -0,0 +1,73 @@
use eframe::egui;
use postsack::{
self,
database::query::{Field, Filter, ValueField},
importer::Importerlike,
model::{self, Engine},
types::Config,
types::FormatType,
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_engine_all() {
let config = create_database();
let mut engine = Engine::new(&config).expect("Expected Engine");
engine.start().expect("Expect to start engine");
engine.wait().expect("Expected working wait");
let segment = {
let segments =
model::segmentations::layouted_segments(&mut engine, default_rect()).unwrap();
assert_eq!(segments.len(), 5);
segments[0].clone()
};
// add another aggregation level
engine
.push(segment)
.expect("Expect being able to push another segment");
engine.wait().expect("Expected working wait");
// Validate
let segments =
model::segmentations::layouted_segments(&mut engine, default_rect()).unwrap();
assert_eq!(segments.len(), 2);
// Limit to only one egment
model::segmentations::set_segments_range(&mut engine, Some(0..=1));
// Validate
let segments =
model::segmentations::layouted_segments(&mut engine, default_rect()).unwrap();
assert_eq!(segments.len(), 1);
// Add a filter
let filter = Filter::Is(ValueField::bool(&Field::IsSend, true));
model::segmentations::set_filters(&mut engine, &vec![filter])
.expect("Expect setting filters");
engine.wait().expect("");
let segments =
model::segmentations::layouted_segments(&mut engine, default_rect()).unwrap();
assert_eq!(segments.len(), 0);
}
}
fn default_rect() -> egui::Rect {
egui::Rect::from_min_size(
egui::Pos2 { x: 50.0, y: 50.0 },
egui::Vec2 { x: 500.0, y: 500.0 },
)
}
fn create_database() -> Config {
let path = "tests/resources/mbox";
let config = postsack::types::Config::new(None, path, vec!["".to_string()], FormatType::Mbox)
.expect("Config");
let importer = postsack::importer::mbox_importer(config.clone());
let (_receiver, handle) = importer.import().unwrap();
handle.join().expect("").expect("");
config
}

@ -0,0 +1,53 @@
use postsack::{
self,
database::{query, query_result, Database},
importer::Importerlike,
types::FormatType,
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
/// Test that the mbox importer works
fn test_mbox_import() {
let path = "tests/resources/mbox";
let config =
postsack::types::Config::new(None, path, vec!["".to_string()], FormatType::Mbox)
.expect("Config");
let importer = postsack::importer::mbox_importer(config.clone());
let (_receiver, handle) = importer.import().unwrap();
handle.join().expect("").expect("");
// The temporary database path
let db = Database::new(&config.database_path).unwrap();
let mails = db.query(&query::Query::Normal {
fields: vec![query::Field::Subject],
filters: Vec::new(),
range: 0..10,
});
let mails = mails.expect("Expected Mails");
assert_eq!(mails.len(), 10);
}
/// Test that the AppleMail importer works
#[test]
fn test_applemail_importer() {
let path = "tests/resources/applemail";
let config =
postsack::types::Config::new(None, path, vec!["".to_string()], FormatType::AppleMail)
.expect("Config");
let importer = postsack::importer::applemail_importer(config.clone());
let (_receiver, handle) = importer.import().unwrap();
handle.join().expect("").expect("");
// The temporary database path
let db = Database::new(&config.database_path).unwrap();
let mails = db.query(&query::Query::Normal {
fields: vec![query::Field::Subject],
filters: Vec::new(),
range: 0..10,
});
let mails = mails.expect("Expected Mails");
assert_eq!(mails.len(), 4);
}
}
Loading…
Cancel
Save