diff options
author | Nora <nora.widdecke@tu-bs.de> | 2019-02-04 22:50:33 +0100 |
---|---|---|
committer | Nora <nora.widdecke@tu-bs.de> | 2019-02-04 22:50:51 +0100 |
commit | d0cf0a35472b9d2905f94b95e8addbeec67d882e (patch) | |
tree | b006a0e6d68d3c8f81f8be725cbf9745d6bf1be3 | |
parent | 1b67e6f8b610a2bafd34aca70c5f7cbb63ca4231 (diff) |
khline: when parsing from string, check if file actually exists
-rw-r--r-- | src/actions/cursor.rs | 4 | ||||
-rw-r--r-- | src/khline.rs | 51 | ||||
-rw-r--r-- | src/testutils.rs | 9 | ||||
-rw-r--r-- | testdata/testdir_with_cursor/cursor | 2 | ||||
-rw-r--r-- | testdata/testdir_with_seq_and_cursor/cursor | 2 | ||||
-rw-r--r-- | testdata/testdir_with_seq_and_cursor/seq | 4 |
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 |