aboutsummaryrefslogtreecommitdiff
path: root/src/command/update.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/update.rs')
-rw-r--r--src/command/update.rs223
1 files changed, 223 insertions, 0 deletions
diff --git a/src/command/update.rs b/src/command/update.rs
index 54005f8..fedec13 100644
--- a/src/command/update.rs
+++ b/src/command/update.rs
@@ -40,6 +40,7 @@ impl Update {
let entry_target = target.join(entry_name);
if entry_type.is_dir() {
+ create_dir_all(&entry_target)?;
Update::archive(&entry_source, &entry_target)?;
} else {
copy(&entry_source, &entry_target)?;
@@ -110,3 +111,225 @@ impl super::Command for Update {
"<path_to_post>\t\tUpdates latest blog post"
}
}
+
+#[cfg(test)]
+mod tests {
+ use std::fs::{create_dir_all, read_dir};
+ use std::path::PathBuf;
+
+ use super::*;
+ use crate::command::Command;
+ use crate::configuration::Configuration;
+
+ use test_utilities::*;
+
+ #[test]
+ fn test_update_command() {
+ let update = Update::new();
+
+ // Create all directories
+ let test_dir = setup_test_dir();
+
+ // Reference but don't create the directories
+ let posts_dir = test_dir.join("posts");
+ let archive_dir = test_dir.join("archive");
+
+ // Create configuration
+ let mut configuration = Configuration::new();
+ configuration.posts_directory = posts_dir.clone();
+ configuration.archive_directory = archive_dir.clone();
+
+ // Create Test File
+ let test_file = test_dir.join("cool-test-file-😎.gmi");
+ let test_file_string = test_file.display().to_string();
+ create_test_file(&test_file, "# I try.");
+
+ // Update 1 of 2
+ update.execute(Some(&test_file_string), &configuration, "update")
+ .expect("Could not update a .gmi");
+ assert!(&posts_dir.join("0").exists());
+ assert_file_contents(&posts_dir.join("0/cool-test-file-😎.gmi"), "# I try.");
+
+ let entries = read_dir(&archive_dir)
+ .expect("Could not read archive");
+ let mut found_path = PathBuf::new();
+ for entry in entries {
+ let entry = entry
+ .expect("Could not read entry");
+ found_path = entry.path();
+ assert_file_contents(&found_path.join("cool-test-file-😎.gmi"), "# I try.");
+ assert!(&found_path.join("metadata.json").exists());
+ }
+
+ // Create Second Test File
+ let second_test_file = test_dir.join("cooler-test-file-😎.gmi");
+ let second_test_file_string = second_test_file.display().to_string();
+ create_test_file(&second_test_file, "# I REALLY try.");
+
+ // Update 2 of 2
+ update.execute(Some(&second_test_file_string), &configuration, "update")
+ .expect("Could not update a .gmi");
+ assert_file_contents(&posts_dir.join("0/cooler-test-file-😎.gmi"), "# I REALLY try.");
+ assert_file_contents(&found_path.join("cooler-test-file-😎.gmi"), "# I REALLY try.");
+
+ cleanup_test_dir(&test_dir);
+ }
+
+ #[test]
+ fn test_write_metadata_fail() {
+ // Create all directories
+ let test_dir = setup_test_dir();
+
+ // Reference but don't create the directories
+ let metadata_dir = test_dir.join("metadata/nested/cannot/write");
+
+ // Create metadata
+ let metadata = Metadata {
+ id: "1234".to_string(),
+ created_on: 1234
+ };
+
+ // Update 1 of 2
+ let result = Update::write_metadata(&metadata, &metadata_dir);
+ assert!(result.is_err());
+
+ cleanup_test_dir(&test_dir);
+ }
+
+ #[test]
+ fn test_recursive_archive() {
+ // Create all directories
+ let test_dir = setup_test_dir();
+
+ // Create the directories
+ let source_dir = test_dir.join("source");
+ let target_dir = test_dir.join("target");
+ let nested_dir = source_dir.join("nested");
+ create_dir_all(&nested_dir).expect("Could not create source dir.");
+ create_dir_all(&target_dir).expect("Could not create target dir.");
+
+ // Create the two test files.
+ let test_file = source_dir.join("not_nested.gmi");
+ let nested_test_file = nested_dir.join("very_much_nested.gmi");
+ create_test_file(&test_file, "# Unlike a Bird");
+ create_test_file(&nested_test_file, "# Very much like a Bird");
+
+ Update::archive(&source_dir, &target_dir)
+ .expect("Could not archive the test directories");
+
+ assert_file_contents(&target_dir.join("not_nested.gmi"), "# Unlike a Bird");
+ assert_file_contents(&target_dir.join("nested/very_much_nested.gmi"), "# Very much like a Bird");
+
+ cleanup_test_dir(&test_dir);
+ }
+
+ #[test]
+ fn test_update_fails_on_directory() {
+ let update = Update::new();
+
+ // Create all directories
+ let test_dir = setup_test_dir();
+
+ // Reference but don't create the directories
+ let nested_dir = test_dir.join("nested");
+ let posts_dir = test_dir.join("posts");
+ let archive_dir = test_dir.join("archive");
+ create_dir_all(&nested_dir).expect("Could not create nested dir.");
+
+ // Create configuration
+ let mut configuration = Configuration::new();
+ configuration.posts_directory = posts_dir.clone();
+ configuration.archive_directory = archive_dir.clone();
+
+ // Create Test File
+ let test_file = nested_dir.join("cool-test-file-😎.gmi");
+ create_test_file(&test_file, "# I try.");
+ let nested_string = nested_dir.display().to_string();
+
+ let result = update.execute(Some(&nested_string), &configuration, "update");
+ assert!(result.is_err());
+ cleanup_test_dir(&test_dir);
+ }
+
+ #[test]
+ fn test_update_fails_on_missing_input() {
+ let update = Update::new();
+
+ // Create all directories
+ let test_dir = setup_test_dir();
+
+ // Reference but don't create the directories
+ let posts_dir = test_dir.join("posts");
+ let archive_dir = test_dir.join("archive");
+
+ // Create configuration
+ let mut configuration = Configuration::new();
+ configuration.posts_directory = posts_dir.clone();
+ configuration.archive_directory = archive_dir.clone();
+
+ // Add 1 of 3
+ let result = update.execute(None, &configuration, "update");
+ assert!(result.is_err());
+ cleanup_test_dir(&test_dir);
+ }
+
+ #[test]
+ fn test_update_fails_if_file_does_not_exist() {
+ let update = Update::new();
+
+ // Create all directories
+ let test_dir = setup_test_dir();
+
+ // Reference but don't create the directories
+ let posts_dir = test_dir.join("posts");
+ let archive_dir = test_dir.join("archive");
+
+ // Create configuration
+ let mut configuration = Configuration::new();
+ configuration.posts_directory = posts_dir.clone();
+ configuration.archive_directory = archive_dir.clone();
+
+ // Create Test File
+ let test_file = test_dir.join("cool-secret-test-file-😎.gmi");
+ let test_file_string = test_file.display().to_string();
+
+ // Add 1 of 3
+ let result = update.execute(Some(&test_file_string), &configuration, "update");
+ assert!(result.is_err());
+
+ cleanup_test_dir(&test_dir);
+ }
+
+ #[test]
+ fn update_before_dependencies() {
+ let update = Update::new();
+ let dependencies = update.before_dependencies();
+
+ assert_eq!(dependencies.len(), 1);
+ assert_eq!(dependencies[0].command(), "sync-down");
+ }
+
+ #[test]
+ fn update_after_dependencies() {
+ let update = Update::new();
+ let dependencies = update.after_dependencies();
+
+ assert_eq!(dependencies.len(), 2);
+ assert_eq!(dependencies[0].command(), "generate");
+ assert_eq!(dependencies[1].command(), "sync-up");
+ }
+
+ // These two tests feel pointless but I'm doing it for the coverage :p
+
+ #[test]
+ fn update_command_output() {
+ let update = Update::new();
+ update.command();
+ }
+
+ #[test]
+ fn update_help_output() {
+ let update = Update::new();
+ update.help();
+ }
+}