From c9139fec68e486005e4b805ec243df5ad23c1943 Mon Sep 17 00:00:00 2001
From: Jiahao XU <Jiahao_XU@outlook.com>
Date: Wed, 27 Jul 2022 23:09:52 +1000
Subject: [PATCH] Add unit tests for `metafiles::binstall_v1`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
---
 src/metafiles/binstall_v1.rs | 73 ++++++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/src/metafiles/binstall_v1.rs b/src/metafiles/binstall_v1.rs
index a2fad509..26d46f57 100644
--- a/src/metafiles/binstall_v1.rs
+++ b/src/metafiles/binstall_v1.rs
@@ -208,3 +208,76 @@ impl<'a> IntoIterator for &'a Records {
         self.data.iter()
     }
 }
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use crate::target::TARGET;
+
+    use miette::Result;
+    use tempfile::TempDir;
+
+    macro_rules! assert_records_eq {
+        ($records:expr, $metadata_set:expr) => {
+            assert_eq!($records.len(), $metadata_set.len());
+            for (record, metadata) in $records.into_iter().zip($metadata_set.iter()) {
+                assert_eq!(record, metadata);
+            }
+        };
+    }
+
+    #[test]
+    fn rw_test() -> Result<()> {
+        let target = CompactString::from(TARGET);
+
+        let tempdir = TempDir::new().unwrap();
+        let path = tempdir.path().join("binstall-tests.json");
+
+        let metadata_vec = [
+            MetaData {
+                name: "a".into(),
+                version_req: "*".into(),
+                current_version: Version::new(0, 1, 0),
+                source: Source::cratesio_registry(),
+                target: target.clone(),
+                bins: vec!["1".into(), "2".into()],
+            },
+            MetaData {
+                name: "b".into(),
+                version_req: "0.1.0".into(),
+                current_version: Version::new(0, 1, 0),
+                source: Source::cratesio_registry(),
+                target: target.clone(),
+                bins: vec!["1".into(), "2".into()],
+            },
+            MetaData {
+                name: "a".into(),
+                version_req: "*".into(),
+                current_version: Version::new(0, 2, 0),
+                source: Source::cratesio_registry(),
+                target,
+                bins: vec!["1".into()],
+            },
+        ];
+
+        append_to_path(&path, metadata_vec.clone())?;
+
+        let mut iter = metadata_vec.into_iter();
+        iter.next().unwrap();
+
+        let mut metadata_set: BTreeSet<_> = iter.collect();
+
+        let mut records = Records::load_from_path(&path)?;
+        assert_records_eq!(&records, &metadata_set);
+
+        records.remove("b");
+        assert_eq!(records.len(), metadata_set.len() - 1);
+        records.overwrite()?;
+
+        metadata_set.remove("b");
+        let records = Records::load_from_path(&path)?;
+        assert_records_eq!(&records, &metadata_set);
+
+        Ok(())
+    }
+}