commit e97cf6c27689ae457e28527b9df0cbe4d4ad52e1
parent 6db9b48a418302ee4a70aa107dca9ca97a82f52b
Author: lash <dev@holbrook.no>
Date:   Sun, 25 Sep 2022 13:08:05 +0000
Add multi digest test for biblatex
Diffstat:
6 files changed, 86 insertions(+), 11 deletions(-)
diff --git a/src/biblatex.rs b/src/biblatex.rs
@@ -19,7 +19,14 @@ use crate::digest::RecordDigest;
 use crate::digest::from_urn;
 
 fn parse_digest(entry: &Entry) -> RecordDigest {
-    let note = entry.get("note").unwrap();
+    let note = match entry.get("note") {
+        Some(v) => {
+            v
+        },
+        None => {
+            return RecordDigest::Empty;
+        },
+    };
     let note_s = String::from_chunks(note).unwrap();
     let mut digest_val = note_s.split(":");
 
@@ -115,6 +122,9 @@ pub fn read_all(mut r: impl Read, digests: &Vec<RecordDigest>) -> Result<Vec<Met
 //            },
         }
 
+        for v in digests {
+            use_digests.push(v.clone());
+        }
         let title = e.title().unwrap();
         let title_s = String::from_chunks(title).unwrap();
 
@@ -142,3 +152,29 @@ pub fn read_all(mut r: impl Read, digests: &Vec<RecordDigest>) -> Result<Vec<Met
     }
     Ok(rr)
 }
+
+#[cfg(test)]
+mod tests {
+    use super::read_all;
+    use crate::digest;
+    use env_logger;
+
+    #[test]
+    fn test_multi_digest() {
+        let d_hex = "acbd18db4cc2f85cedef654fccc4a4d8";
+        let d = digest::RecordDigest::MD5(hex::decode(d_hex).unwrap());
+        let d_sha_hex = "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7";
+        let d_sha = digest::from_vec(hex::decode(d_sha_hex).unwrap()).unwrap();
+
+        let biblatex_src = "@article{
+    foo,
+    title={bar},
+    author={Guybrush Threepwood},
+}
+";
+        let digests = vec!(d, d_sha);
+        let r = read_all(biblatex_src.as_bytes(), &digests).unwrap();
+
+        assert_eq!(r.len(), 2);
+    }
+}
diff --git a/src/digest.rs b/src/digest.rs
@@ -1,3 +1,5 @@
+use std::marker::Copy;
+
 use crate::error::ParseError;
 
 use sha2::{
@@ -17,6 +19,27 @@ pub enum RecordDigest {
     Empty,
 }
 
+impl Clone for RecordDigest {
+    fn clone(&self) -> RecordDigest {
+        match self {
+            RecordDigest::Empty => {
+                RecordDigest::Empty
+            },
+            RecordDigest::Sha512(v) => {
+                RecordDigest::Sha512(v.to_vec())
+            },
+            RecordDigest::Sha256(v) => {
+                RecordDigest::Sha256(v.to_vec())
+            },
+            RecordDigest::MD5(v) => {
+                RecordDigest::MD5(v.to_vec())
+            },
+            RecordDigest::SwarmHash(v) => {
+                RecordDigest::SwarmHash(v.to_vec())
+            },
+        }
+    }
+}
 
 
 /// Create a [RecordDigest::Sha512](RecordDigest::Sha512) instance from the raw digest data.
diff --git a/src/meta.rs b/src/meta.rs
@@ -216,13 +216,13 @@ impl MetaData {
                 return String::new();
             },
             digest::RecordDigest::Sha512(v) => {
-                return hex::encode(&v);
+                return String::from("sha512:") + hex::encode(&v).as_str();
             },
             digest::RecordDigest::Sha256(v) => {
-                return hex::encode(&v);
+                return String::from("sha256:") + hex::encode(&v).as_str();
             },
             digest::RecordDigest::MD5(v) => {
-                return hex::encode(&v);
+                return String::from("md5:") + hex::encode(&v).as_str();
             },
             digest::RecordDigest::SwarmHash(v) => {
                 return hex::encode(&v);
@@ -500,6 +500,7 @@ mod tests {
         File,
         write
     };
+    use crate::digest;
     use env_logger;
 
     #[test]
@@ -508,7 +509,7 @@ mod tests {
         let meta = MetaData::from_xattr(s).unwrap();
         assert_eq!(meta.dc.title, "Bitcoin: A Peer-to-Peer Electronic Cash System");
         assert_eq!(meta.dc.author, "Satoshi Nakamoto");
-        assert_eq!(meta.fingerprint(), String::from("2ac531ee521cf93f8419c2018f770fbb42c65396178e079a416e7038d3f9ab9fc2c35c4d838bc8b5dd68f4c13759fe9cdf90a46528412fefe1294cb26beabf4e"));
+        assert_eq!(meta.fingerprint(), String::from("sha512:2ac531ee521cf93f8419c2018f770fbb42c65396178e079a416e7038d3f9ab9fc2c35c4d838bc8b5dd68f4c13759fe9cdf90a46528412fefe1294cb26beabf4e"));
     }
 
     #[test]
@@ -520,7 +521,8 @@ mod tests {
         let fp = f.path();
         let fps = String::from(fp.to_str().unwrap());
 
-        let mut m = MetaData::new("foo", "bar", EntryType::Article, digest, Some(fps));
+        let digest_sha = digest::from_vec(digest).unwrap();
+        let mut m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, Some(fps));
         m.set_subject("baz");
         m.set_mime_str("foo/bar");
         m.set_language("nb-NO");
@@ -529,7 +531,7 @@ mod tests {
         let m_check = MetaData::from_xattr(fp).unwrap();
         assert_eq!(m_check.title(), "foo");
         assert_eq!(m_check.author(), "bar");
-        assert_eq!(m_check.fingerprint(), digest_hex);
+        assert_eq!(m_check.fingerprint(), String::from("sha512:") + digest_hex);
         assert_eq!(m_check.typ(), EntryType::Article);
         assert_eq!(m_check.subject().unwrap(), "baz");
         assert_eq!(m_check.mime().unwrap(), "foo/bar");
@@ -559,7 +561,14 @@ mod tests {
             let f = NamedTempFile::new_in(".").unwrap();
             let fp = f.path();
             write(&f, &[0, 1, 2, 3]);
-            let meta_empty = MetaData::from_xattr(fp).unwrap();
+            let meta_empty = match MetaData::from_xattr(fp) {
+                Ok(v) => {
+                    v
+                },
+                Err(e) => {
+                    panic!("{:?}", e);
+                },
+            };
             assert_eq!(meta_empty.mime().unwrap(), "application/octet-stream"); 
         }
     }
diff --git a/src/rdf.rs b/src/rdf.rs
@@ -272,6 +272,7 @@ mod tests {
         read,
     };
     use super::MetaData;
+    use crate::digest;
     use std::io::stdout;
     use std::fs::File;
     use std::default::Default;
@@ -282,7 +283,8 @@ mod tests {
     fn test_turtle_write() {
         let mut digest = Vec::with_capacity(64);
         digest.resize(64, 0x2a);
-        let mut m = MetaData::new("foo", "bar", EntryType::Article, Vec::from(digest), None);
+        let digest_sha = digest::from_vec(Vec::from(digest)).unwrap();
+        let mut m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, None);
         m.set_subject("baz");
         m.set_mime_str("foo/bar");
         m.set_language("nb-NO");
diff --git a/src/store.rs b/src/store.rs
@@ -35,13 +35,15 @@ mod tests {
         FileStore,
         MetaData,
     };
+    use crate::digest;
     use std::io::Write;
 
     #[test]
     fn test_writer() {
         let mut digest = Vec::with_capacity(64);
         digest.resize(64, 0x2a);
-        let m = MetaData::new("foo", "bar", EntryType::Article, Vec::from(digest), None);
+        let digest_sha = digest::from_vec(Vec::from(digest)).unwrap();
+        let m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, None);
         let dir = tempdir().unwrap();
         let fp = dir.path();
         let fs = FileStore::new(&fp);
diff --git a/tests/rdf_test.rs b/tests/rdf_test.rs
@@ -8,6 +8,8 @@ use biblatex::EntryType;
 use kitab::rdf::write as rdf_write;
 use kitab::meta::MetaData;
 
+use kitab::digest;
+
 
 #[test]
 fn test_rdf_dump() {
@@ -15,6 +17,7 @@ fn test_rdf_dump() {
     let w = BufWriter::new(v);
     let mut digest: Vec<u8> = Vec::new();
     digest.resize(64, 0);
-    let metadata = MetaData::new("foo", "Bar Baz", EntryType::Article, digest, None);
+    let digest_sha = digest::from_vec(Vec::from(digest)).unwrap();
+    let metadata = MetaData::new("foo", "Bar Baz", EntryType::Article, digest_sha, None);
     let r = rdf_write(&metadata, w);
 }