From 4431e8e0476e4eb8da5652dba4dfbeff2bbf6d30 Mon Sep 17 00:00:00 2001 From: Gabriel Simonetto Date: Fri, 1 Oct 2021 23:10:07 -0300 Subject: [PATCH] Create failing test --- tests/compress_empty_dir.rs | 92 +++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 tests/compress_empty_dir.rs diff --git a/tests/compress_empty_dir.rs b/tests/compress_empty_dir.rs new file mode 100644 index 0000000..438565a --- /dev/null +++ b/tests/compress_empty_dir.rs @@ -0,0 +1,92 @@ +use std::{ + env, fs, + path::{Path, PathBuf}, +}; + +use ouch::{cli::Command, commands::run, oof}; + +#[test] +fn test_compress_decompress_with_empty_dir() { + // System temporary directory depends on the platform, for linux it's /tmp + let system_tmp = env::temp_dir(); + + // Create a temporary testing folder that will be deleted on scope drop + let testing_dir = + tempfile::Builder::new().prefix("ouch-testing").tempdir_in(system_tmp).expect("Could not create testing_dir"); + + let testing_dir_path = testing_dir.path(); + + let empty_dir_path: PathBuf = create_empty_dir(&testing_dir_path, "dummy_empty_dir_name"); + + let mut file_paths: Vec = vec![empty_dir_path]; + + let format = "zip"; + + let compressed_archive_path: PathBuf = compress_files(&testing_dir_path, &file_paths, &format); + + let mut extracted_paths = extract_files(&compressed_archive_path); + + // // DEBUG UTIL: + // // Uncomment line below to freeze the code and see compressed and extracted files in + // // the temporary directory before their auto-destruction. + // std::thread::sleep(std::time::Duration::from_secs(10)); + + // no need to sort a unitary value vector but i will keep this + // for retrocompatibility, for now. + file_paths.sort(); + extracted_paths.sort(); + + assert_correct_paths(&file_paths, &extracted_paths, format); +} + +fn create_empty_dir(at: &Path, filename: &str) -> PathBuf { + let dirname = Path::new(filename); + let full_path = at.join(dirname); + + fs::create_dir(&full_path).expect("Failed to create an empty directory"); + + full_path +} + +fn compress_files(at: &Path, paths_to_compress: &[PathBuf], format: &str) -> PathBuf { + let archive_path = String::from("archive.") + format; + let archive_path = at.join(archive_path); + + let command = Command::Compress { files: paths_to_compress.to_vec(), output_path: archive_path.to_path_buf() }; + run(command, &oof::Flags::default()).expect("Failed to compress test dummy files"); + + archive_path +} + +fn extract_files(archive_path: &Path) -> Vec { + // We will extract in the same folder as the archive + // If the archive is at: + // /tmp/ouch-testing-tar.Rbq4DusBrtF8/archive.tar + // Then the extraction_output_folder will be: + // /tmp/ouch-testing-tar.Rbq4DusBrtF8/extraction_results/ + let mut extraction_output_folder = archive_path.to_path_buf(); + // Remove the name of the extracted archive + assert!(extraction_output_folder.pop()); + // Add the suffix "results" + extraction_output_folder.push("extraction_results"); + + let command = Command::Decompress { + files: vec![archive_path.to_owned()], + output_folder: Some(extraction_output_folder.clone()), + }; + run(command, &oof::Flags::default()).expect("Failed to extract"); + + fs::read_dir(extraction_output_folder).unwrap().map(Result::unwrap).map(|entry| entry.path()).collect() +} + +fn assert_correct_paths(original: &[PathBuf], extracted: &[PathBuf], format: &str) { + assert_eq!( + original.len(), + extracted.len(), + "Number of compressed files does not match number of decompressed when testing archive format '{:?}'.", + format + ); + for (original, extracted) in original.iter().zip(extracted) { + assert_eq!(original.file_name(), extracted.file_name(), ""); + } +}