From 14afce47185d2593104850a6258396ecfa9b55c0 Mon Sep 17 00:00:00 2001 From: Blaine Heffron Date: Tue, 23 Jul 2024 11:39:32 -0400 Subject: [PATCH] add test case and update docs --- Cargo.lock | 1 + FULL_HELP_DOCS.md | 1 + cmd/soroban-cli/Cargo.toml | 1 + cmd/soroban-cli/src/commands/contract/init.rs | 64 ++++++++++++++++++- 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 4d70268b9..edab8bb9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4732,6 +4732,7 @@ dependencies = [ "tracing-subscriber", "ulid", "ureq", + "walkdir", "wasm-opt", "wasmparser 0.90.0", "which", diff --git a/FULL_HELP_DOCS.md b/FULL_HELP_DOCS.md index 8dea0e36b..167549cf1 100644 --- a/FULL_HELP_DOCS.md +++ b/FULL_HELP_DOCS.md @@ -424,6 +424,7 @@ Initialize a Soroban project with an example contract * `-f`, `--frontend-template ` — An optional flag to pass in a url for a frontend template repository. Default value: `` +* `-o`, `--overwrite` — Overwrite all existing files. diff --git a/cmd/soroban-cli/Cargo.toml b/cmd/soroban-cli/Cargo.toml index 3b0b90153..6d40ddd90 100644 --- a/cmd/soroban-cli/Cargo.toml +++ b/cmd/soroban-cli/Cargo.toml @@ -130,3 +130,4 @@ ureq = { version = "2.9.1", features = ["json"] } assert_cmd = "2.0.4" assert_fs = "1.0.7" predicates = "2.1.5" +walkdir = "2.5.0" diff --git a/cmd/soroban-cli/src/commands/contract/init.rs b/cmd/soroban-cli/src/commands/contract/init.rs index ac7e1e346..0428fac0a 100644 --- a/cmd/soroban-cli/src/commands/contract/init.rs +++ b/cmd/soroban-cli/src/commands/contract/init.rs @@ -478,7 +478,13 @@ fn get_merged_file_delimiter(file_path: &Path) -> String { #[cfg(test)] mod tests { use itertools::Itertools; - use std::fs::{self, read_to_string}; + use std::{ + collections::HashMap, + fs::{self, read_to_string}, + path::PathBuf, + time::SystemTime, + }; + use walkdir::WalkDir; use super::*; @@ -593,6 +599,62 @@ mod tests { temp_dir.close().unwrap(); } + #[test] + fn test_init_with_overwrite() { + let temp_dir = tempfile::tempdir().unwrap(); + let project_dir = temp_dir.path().join(TEST_PROJECT_NAME); + let with_examples = vec![]; + + // First initialization + init( + project_dir.as_path(), + "https://github.com/stellar/soroban-astro-template", + &with_examples, + false, + ) + .unwrap(); + + // Get initial modification times + let initial_mod_times = get_mod_times(&project_dir); + + // Second initialization with overwrite + init( + project_dir.as_path(), + "https://github.com/stellar/soroban-astro-template", + &with_examples, + true, // overwrite = true + ) + .unwrap(); + + // Get new modification times + let new_mod_times = get_mod_times(&project_dir); + + // Compare modification times + for (path, initial_time) in initial_mod_times { + let new_time = new_mod_times.get(&path).expect("File should still exist"); + assert!( + new_time > &initial_time, + "File {} should have a later modification time", + path.display() + ); + } + + temp_dir.close().unwrap(); + } + + fn get_mod_times(dir: &Path) -> HashMap { + let mut mod_times = HashMap::new(); + for entry in WalkDir::new(dir) { + let entry = entry.unwrap(); + if entry.file_type().is_file() { + let path = entry.path().to_owned(); + let metadata = fs::metadata(&path).unwrap(); + mod_times.insert(path, metadata.modified().unwrap()); + } + } + mod_times + } + #[test] fn test_init_from_within_an_existing_project() { let temp_dir = tempfile::tempdir().unwrap();