summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/lockfile.rs145
1 files changed, 145 insertions, 0 deletions
diff --git a/cli/lockfile.rs b/cli/lockfile.rs
index 74e8dcde2..d2e79c031 100644
--- a/cli/lockfile.rs
+++ b/cli/lockfile.rs
@@ -82,3 +82,148 @@ impl Lockfile {
self.map.insert(specifier.to_string(), checksum);
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use deno_core::serde_json;
+ use deno_core::serde_json::json;
+ use std::fs::File;
+ use std::io::prelude::*;
+ use std::io::Write;
+ use tempfile::TempDir;
+
+ fn setup() -> (TempDir, String) {
+ let temp_dir = TempDir::new().expect("could not create temp dir");
+
+ let file_path = temp_dir.path().join("valid_lockfile.json");
+ let mut file = File::create(file_path).expect("write file fail");
+
+ let value: serde_json::Value = json!({
+ "https://deno.land/std@0.71.0/textproto/mod.ts": "3118d7a42c03c242c5a49c2ad91c8396110e14acca1324e7aaefd31a999b71a4",
+ "https://deno.land/std@0.71.0/async/delay.ts": "35957d585a6e3dd87706858fb1d6b551cb278271b03f52c5a2cb70e65e00c26a"
+ });
+
+ file.write_all(value.to_string().as_bytes()).unwrap();
+
+ let file_path_buf = temp_dir.path().join("valid_lockfile.json");
+ let file_path = file_path_buf.to_str().expect("file path fail").to_string();
+
+ (temp_dir, file_path)
+ }
+
+ fn teardown(temp_dir: TempDir) {
+ temp_dir.close().expect("file close error");
+ }
+
+ #[test]
+ fn new_nonexistent_lockfile() {
+ let file_path = String::from("nonexistent_lock_file.json");
+ assert!(Lockfile::new(file_path, false).is_err());
+ }
+
+ #[test]
+ fn new_valid_lockfile() {
+ let (temp_dir, file_path) = setup();
+
+ let result = Lockfile::new(file_path, false).unwrap();
+
+ let keys: Vec<String> = result.map.keys().cloned().collect();
+ let expected_keys = vec![
+ String::from("https://deno.land/std@0.71.0/async/delay.ts"),
+ String::from("https://deno.land/std@0.71.0/textproto/mod.ts"),
+ ];
+
+ assert_eq!(keys.len(), 2);
+ assert_eq!(keys, expected_keys);
+
+ teardown(temp_dir);
+ }
+
+ #[test]
+ fn new_lockfile_from_file_and_insert() {
+ let (temp_dir, file_path) = setup();
+
+ let mut lockfile = Lockfile::new(file_path, false).unwrap();
+
+ lockfile.insert(
+ "https://deno.land/std@0.71.0/io/util.ts",
+ "Here is some source code",
+ );
+
+ let keys: Vec<String> = lockfile.map.keys().cloned().collect();
+ let expected_keys = vec![
+ String::from("https://deno.land/std@0.71.0/async/delay.ts"),
+ String::from("https://deno.land/std@0.71.0/io/util.ts"),
+ String::from("https://deno.land/std@0.71.0/textproto/mod.ts"),
+ ];
+ assert_eq!(keys.len(), 3);
+ assert_eq!(keys, expected_keys);
+
+ teardown(temp_dir);
+ }
+
+ #[test]
+ fn new_lockfile_and_write() {
+ let (temp_dir, file_path) = setup();
+
+ let mut lockfile = Lockfile::new(file_path, true).unwrap();
+
+ lockfile.insert(
+ "https://deno.land/std@0.71.0/textproto/mod.ts",
+ "Here is some source code",
+ );
+ lockfile.insert(
+ "https://deno.land/std@0.71.0/io/util.ts",
+ "more source code here",
+ );
+ lockfile.insert(
+ "https://deno.land/std@0.71.0/async/delay.ts",
+ "this source is really exciting",
+ );
+
+ lockfile.write().expect("unable to write");
+
+ let file_path_buf = temp_dir.path().join("valid_lockfile.json");
+ let file_path = file_path_buf.to_str().expect("file path fail").to_string();
+
+ // read the file contents back into a string and check
+ let mut checkfile = File::open(file_path).expect("Unable to open the file");
+ let mut contents = String::new();
+ checkfile
+ .read_to_string(&mut contents)
+ .expect("Unable to read the file");
+
+ assert!(contents.contains(
+ "fedebba9bb82cce293196f54b21875b649e457f0eaf55556f1e318204947a28f"
+ )); // sha-256 hash of the source 'Here is some source code'
+
+ teardown(temp_dir);
+ }
+
+ #[test]
+ fn check_or_insert_lockfile_false() {
+ let (temp_dir, file_path) = setup();
+
+ let mut lockfile = Lockfile::new(file_path, false).unwrap();
+
+ lockfile.insert(
+ "https://deno.land/std@0.71.0/textproto/mod.ts",
+ "Here is some source code",
+ );
+
+ let check_true = lockfile.check_or_insert(
+ "https://deno.land/std@0.71.0/textproto/mod.ts",
+ "Here is some source code",
+ );
+ assert!(check_true);
+
+ let check_false = lockfile.check_or_insert(
+ "https://deno.land/std@0.71.0/textproto/mod.ts",
+ "This is new Source code",
+ );
+ assert!(!check_false);
+
+ teardown(temp_dir);
+ }
+}