summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNora <nora.widdecke@tu-bs.de>2019-02-04 22:50:33 +0100
committerNora <nora.widdecke@tu-bs.de>2019-02-04 22:50:51 +0100
commitd0cf0a35472b9d2905f94b95e8addbeec67d882e (patch)
treeb006a0e6d68d3c8f81f8be725cbf9745d6bf1be3
parent1b67e6f8b610a2bafd34aca70c5f7cbb63ca4231 (diff)
khline: when parsing from string, check if file actually exists
-rw-r--r--src/actions/cursor.rs4
-rw-r--r--src/khline.rs51
-rw-r--r--src/testutils.rs9
-rw-r--r--testdata/testdir_with_cursor/cursor2
-rw-r--r--testdata/testdir_with_seq_and_cursor/cursor2
-rw-r--r--testdata/testdir_with_seq_and_cursor/seq4
6 files changed, 56 insertions, 16 deletions
diff --git a/src/actions/cursor.rs b/src/actions/cursor.rs
index c8313f4..3ee7615 100644
--- a/src/actions/cursor.rs
+++ b/src/actions/cursor.rs
@@ -97,7 +97,7 @@ mod integration {
let testdir = testutils::prepare_testdir("testdir_with_seq_and_cursor");
do_cursor(&["next"]).unwrap();
- let out = "1182988800 .khaleesi/cal/rfc_multi_day_allday.ics";
+ let out = "1182988800 rfc_multi_day_allday.ics";
let predicate = predicate::str::similar(out);
testdir.child(".khaleesi/cursor").assert(predicate);
}
@@ -107,7 +107,7 @@ mod integration {
let testdir = testutils::prepare_testdir("testdir_with_seq_and_cursor");
do_cursor(&["prev"]).unwrap();
- let out = "1544740200 .khaleesi/cal/twodaysacrossbuckets.ics\n";
+ let out = "1544740200 twodaysacrossbuckets.ics\n";
let predicate = predicate::str::similar(out);
testdir.child(".khaleesi/cursor").assert(predicate);
}
diff --git a/src/khline.rs b/src/khline.rs
index 2cf6cac..351f78d 100644
--- a/src/khline.rs
+++ b/src/khline.rs
@@ -91,15 +91,25 @@ impl FromStr for KhLine {
fn from_str(s: &str) -> Result<Self, Self::Err> {
let parts: Vec<&str> = s.splitn(2, ' ').collect();
if let Some(time) = dateutil::datetime_from_timestamp(parts[0]) {
- let path = PathBuf::from(parts[1]);
+ let path = to_filepath_checked(parts[1])?;
Ok(Self::new(&path, Some(time.into())))
} else {
- let path = PathBuf::from(parts[0]);
+ let path = to_filepath_checked(parts[0])?;
Ok(Self::new(&path, None))
}
}
}
+fn to_filepath_checked(path_str: &str) -> Result<PathBuf, String> {
+
+ let path = PathBuf::from(path_str);
+ if defaults::get_caldir().join(path.clone()).is_file() {
+ Ok(path)
+ } else {
+ Err("path is not a file".to_string())
+ }
+}
+
#[cfg(test)]
mod tests {
use super::*;
@@ -112,22 +122,28 @@ mod tests {
#[test]
fn test_parse_absolute() {
- let khline_str = "1182988800 /x/y/z.ics";
+ let testdir = prepare_testdir_empty();
+ let khline_str = "1182988800 ".to_string() + &testdir.path().to_string_lossy() + "/x/y/z.ics";
+
+ let testfile = touch_testfile(&testdir, &PathBuf::from("x/y/z.ics")).unwrap();
let khline = khline_str.parse::<KhLine>().unwrap();
- assert_eq!(PathBuf::from("/x/y/z.ics"), khline.path);
+ assert_eq!(testfile.path(), khline.path);
assert_eq!(1182988800, khline.get_time().unwrap().timestamp());
assert_eq!(khline_str, khline.to_string());
}
#[test]
fn test_parse_absolute_no_timestamp() {
- let khline_str = "/x/y/z.ics";
+ let testdir = prepare_testdir_empty();
+ let khline_str = testdir.path().to_string_lossy() + "/x/y/z.ics";
+
+ let testfile = touch_testfile(&testdir, &PathBuf::from("x/y/z.ics")).unwrap();
let khline = khline_str.parse::<KhLine>().unwrap();
- assert_eq!(PathBuf::from("/x/y/z.ics"), khline.path);
+ assert_eq!(testfile.path(), khline.path);
assert_eq!(None, khline.time);
assert_eq!(khline_str, khline.to_string());
}
@@ -137,9 +153,14 @@ mod tests {
let testdir = prepare_testdir_empty();
let khline_str = "x/y.ics";
+ let mut path = PathBuf::from(defaults::DATADIR);
+ path.push(defaults::CALDIR);
+ path.push(khline_str);
+ let testfile = touch_testfile(&testdir, &path).unwrap();
+
let khline = khline_str.parse::<KhLine>().unwrap();
- assert_eq!(testdir.child(".khaleesi/cal/x/y.ics").path(), khline.path);
+ assert_eq!(testfile.path(), khline.path);
assert_eq!(None, khline.time);
assert_eq!(khline_str, khline.to_string());
}
@@ -147,11 +168,17 @@ mod tests {
#[test]
fn test_parse_relative_timestamp() {
let testdir = prepare_testdir_empty();
- let khline_str = "1182988800 x/y.ics";
+ let filepath = "x/y.ics";
+ let khline_str = "1182988800 ".to_owned() + filepath;
+
+ let mut path = PathBuf::from(defaults::DATADIR);
+ path.push(defaults::CALDIR);
+ path.push(filepath);
+ let testfile = touch_testfile(&testdir, &path).unwrap();
let khline = khline_str.parse::<KhLine>().unwrap();
- assert_eq!(testdir.child(".khaleesi/cal/x/y.ics").path(), khline.path);
+ assert_eq!(testfile.path(), khline.path);
assert_eq!(1182988800, khline.get_time().unwrap().timestamp());
assert_eq!(khline_str, khline.to_string());
}
@@ -177,6 +204,12 @@ mod tests {
}
#[test]
+ fn test_empty_string() {
+ let khline = "".parse::<KhLine>();
+ assert!(khline.is_err());
+ }
+
+ #[test]
fn test_matches() {
let path = PathBuf::from("test/path");
let cal = IcalVCalendar::from_str(testdata::TEST_EVENT_MULTIDAY_ALLDAY, Some(&path)).unwrap();
diff --git a/src/testutils.rs b/src/testutils.rs
index 42fa765..7b78a96 100644
--- a/src/testutils.rs
+++ b/src/testutils.rs
@@ -1,6 +1,7 @@
use assert_fs::prelude::*;
use assert_fs::TempDir;
-use std::path::PathBuf;
+use assert_fs::fixture::{ChildPath, FixtureError};
+use std::path::{PathBuf,Path};
use std::fs;
use defaults;
@@ -21,3 +22,9 @@ pub fn prepare_testdir(template: &str) -> TempDir {
testdir.child(".khaleesi/").copy_from(path_to(template), &["*"]).unwrap();
testdir
}
+
+pub fn touch_testfile(testdir: &TempDir, relative_path: &Path) -> Result<ChildPath, FixtureError> {
+ let testfile = testdir.child(relative_path);
+ testfile.touch()?;
+ Ok(testfile)
+}
diff --git a/testdata/testdir_with_cursor/cursor b/testdata/testdir_with_cursor/cursor
index bfa5234..204ff7a 100644
--- a/testdata/testdir_with_cursor/cursor
+++ b/testdata/testdir_with_cursor/cursor
@@ -1 +1 @@
-1544740200 .khaleesi/cal/twodaysacrossbuckets.ics
+1544740200 twodaysacrossbuckets.ics
diff --git a/testdata/testdir_with_seq_and_cursor/cursor b/testdata/testdir_with_seq_and_cursor/cursor
index bfa5234..204ff7a 100644
--- a/testdata/testdir_with_seq_and_cursor/cursor
+++ b/testdata/testdir_with_seq_and_cursor/cursor
@@ -1 +1 @@
-1544740200 .khaleesi/cal/twodaysacrossbuckets.ics
+1544740200 twodaysacrossbuckets.ics
diff --git a/testdata/testdir_with_seq_and_cursor/seq b/testdata/testdir_with_seq_and_cursor/seq
index 85187e4..b202623 100644
--- a/testdata/testdir_with_seq_and_cursor/seq
+++ b/testdata/testdir_with_seq_and_cursor/seq
@@ -1,2 +1,2 @@
-1544740200 .khaleesi/cal/twodaysacrossbuckets.ics
-1182988800 .khaleesi/cal/rfc_multi_day_allday.ics
+1544740200 twodaysacrossbuckets.ics
+1182988800 rfc_multi_day_allday.ics