pub struct Strategy {}
-use std::path::PathBuf;
use std::fs::{copy, create_dir_all};
+use std::path::Path;
-use crate::file_handler::{File, FileType, FileHandlerStrategy};
+use crate::file_handler::{File, FileType, Strategy as FileHandlerStrategy};
impl Strategy {
- fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File) {
- let relative_path = file.path.strip_prefix(&source).unwrap();
+ fn handle(source: &Path, destination: &Path, file: &File) {
+ let relative_path = file.path.strip_prefix(source).unwrap();
let complete_destination = destination.join(relative_path);
let destination_parent = complete_destination.parent().unwrap();
create_dir_all(destination_parent).unwrap();
}
impl FileHandlerStrategy for Strategy {
- fn is(&self, path: &PathBuf) -> bool {
+ fn is(&self, path: &Path) -> bool {
!path.is_dir()
}
}
fn can_handle(&self, file_type: &FileType) -> bool {
- match file_type {
- FileType::File => true,
- _ => false,
- }
+ matches!(file_type, FileType::File)
}
- fn handle_html(&self, source: &PathBuf, destination: &PathBuf, file: &File, _l: &str) {
- return self.handle(source, destination, file);
+ fn handle_html(&self, source: &Path, destination: &Path, file: &File, _l: &str) {
+ Strategy::handle(source, destination, file);
}
- fn handle_gemini(&self, source: &PathBuf, destination: &PathBuf, file: &File) {
- return self.handle(source, destination, file);
+ fn handle_gemini(&self, source: &Path, destination: &Path, file: &File) {
+ Strategy::handle(source, destination, file);
}
}
#[cfg(test)]
mod tests {
- use super::*;
use std::fs;
- fn setup() -> Strategy {
- Strategy {}
- }
+ use super::*;
- fn fixtures_dir() -> PathBuf {
- PathBuf::from("tests/fixtures")
- }
+ use test_utilities::*;
- fn fixture_path(filename: &str) -> PathBuf {
- fixtures_dir().join(filename)
+ #[test]
+ fn identifies_regular_files() {
+ let test_dir = setup_test_dir();
+ create_test_file(&test_dir.join("image.png"), "");
+ create_test_file(&test_dir.join("style.css"), "");
+ let strategy = Strategy {};
+ assert!(strategy.is(&test_dir.join("image.png")));
+ assert!(strategy.is(&test_dir.join("style.css")));
}
- mod file_type_tests {
- use super::*;
-
- #[test]
- fn identifies_regular_files() {
- let strategy = setup();
- assert!(strategy.is(&fixture_path("image.png")));
- assert!(strategy.is(&fixture_path("style.css")));
- assert!(!strategy.is(&fixtures_dir()));
- }
-
- #[test]
- fn identifies_file_type() {
- let strategy = setup();
- assert!(matches!(strategy.identify(), FileType::File));
- }
-
- #[test]
- fn handles_correct_file_type() {
- let strategy = setup();
- assert!(strategy.can_handle(&FileType::File));
- assert!(!strategy.can_handle(&FileType::Layout));
- assert!(!strategy.can_handle(&FileType::Gemini));
- assert!(!strategy.can_handle(&FileType::Unknown));
- }
+ #[test]
+ fn rejects_directories() {
+ let test_dir = setup_test_dir();
+ let strategy = Strategy {};
+ assert!(!strategy.is(&test_dir));
}
- mod file_handling_tests {
- use super::*;
-
- #[test]
- fn copies_single_file() {
- let strategy = setup();
- let source = fixtures_dir();
- let output = fixture_path("output");
-
- let file = File {
- path: fixture_path("image.png"),
- file_type: FileType::File,
- };
-
- strategy.handle(&source, &output, &file);
-
- let copied_path = output.join("image.png");
- assert!(copied_path.exists());
-
- // Verify file contents are identical
- let original = fs::read(&file.path).unwrap();
- let copied = fs::read(&copied_path).unwrap();
- assert_eq!(original, copied);
-
- // Cleanup
- let _ = fs::remove_file(copied_path);
- }
-
- #[test]
- fn copies_nested_file() {
- let strategy = setup();
- let source = fixtures_dir();
- let output = fixture_path("output");
-
- let file = File {
- path: fixture_path("assets/style.css"),
- file_type: FileType::File,
- };
-
- strategy.handle(&source, &output, &file);
-
- let copied_path = output.join("assets").join("style.css");
- assert!(copied_path.exists());
-
- // Verify file contents are identical
- let original = fs::read(&file.path).unwrap();
- let copied = fs::read(&copied_path).unwrap();
- assert_eq!(original, copied);
-
- // Cleanup
- let _ = fs::remove_file(copied_path);
- let _ = fs::remove_dir(output.join("assets"));
- }
-
- #[test]
- fn handle_html_copies_file() {
- let strategy = setup();
- let source = fixtures_dir();
- let output = fixture_path("output_html");
-
- let file = File {
- path: fixture_path("image.png"),
- file_type: FileType::File,
- };
-
- strategy.handle_html(&source, &output, &file, "unused layout");
-
- let copied_path = output.join("image.png");
- assert!(copied_path.exists());
+ #[test]
+ fn identifies_file_type() {
+ let strategy = Strategy {};
+ assert!(matches!(strategy.identify(), FileType::File));
+ }
- // Cleanup
- let _ = fs::remove_file(copied_path);
- }
+ #[test]
+ fn handles_file_type() {
+ let strategy = Strategy {};
+ assert!(strategy.can_handle(&FileType::File));
+ }
- #[test]
- fn handle_gemini_copies_file() {
- let strategy = setup();
- let source = fixtures_dir();
- let output = fixture_path("output_gemini");
+ #[test]
+ fn rejects_non_file_types() {
+ let strategy = Strategy {};
+ assert!(!strategy.can_handle(&FileType::Layout));
+ assert!(!strategy.can_handle(&FileType::Gemini));
+ assert!(!strategy.can_handle(&FileType::Unknown));
+ }
- let file = File {
- path: fixture_path("image.png"),
- file_type: FileType::File,
- };
+ #[test]
+ fn copies_single_file() {
+ let test_dir = setup_test_dir();
+ let source_dir = test_dir.join("source");
+ let output_dir = test_dir.join("output");
+ create_dir_all(&source_dir).expect("Could not create source test directory");
+ create_dir_all(&output_dir).expect("Could not create output test directory");
+ create_test_file(&source_dir.join("image.png"), "A fish playing the banjo");
+
+ let file = File {
+ path: source_dir.join("image.png"),
+ file_type: FileType::File,
+ };
+
+ Strategy::handle(&source_dir, &output_dir, &file);
+
+ let copied_path = &output_dir.join("image.png");
+ assert!(copied_path.exists());
+
+ // Verify file contents are identical
+ let original = fs::read(&file.path).unwrap();
+ let copied = fs::read(copied_path).unwrap();
+ assert_eq!(original, copied);
+ }
- strategy.handle_gemini(&source, &output, &file);
+ #[test]
+ fn copies_nested_file() {
+ let test_dir = setup_test_dir();
+ let source_dir = test_dir.join("source");
+ let output_dir = test_dir.join("output");
+ create_dir_all(&source_dir).expect("Could not create source test directory");
+ create_dir_all(&output_dir).expect("Could not create output test directory");
+ create_dir_all(source_dir.join("nested")).expect("Could not create source test directory");
+ create_test_file(
+ &source_dir.join("nested/style.css"),
+ "* { margin: 0; padding: 0 }",
+ );
+
+ let file = File {
+ path: source_dir.join("nested/style.css"),
+ file_type: FileType::File,
+ };
+
+ Strategy::handle(&source_dir, &output_dir, &file);
+
+ let copied_path = output_dir.join("nested/style.css");
+ assert!(copied_path.exists());
+
+ // Verify file contents are identical
+ let original = fs::read(&file.path).unwrap();
+ let copied = fs::read(&copied_path).unwrap();
+ assert_eq!(original, copied);
+ }
- let copied_path = output.join("image.png");
- assert!(copied_path.exists());
+ #[test]
+ fn handle_html_copies_file() {
+ let test_dir = setup_test_dir();
+ let source_dir = test_dir.join("source");
+ let output_dir = test_dir.join("output");
+ create_dir_all(&source_dir).expect("Could not create source test directory");
+ create_dir_all(&output_dir).expect("Could not create output test directory");
+ create_test_file(&source_dir.join("image.png"), "A fish playing the banjo");
+ let strategy = Strategy {};
+
+ let file = File {
+ path: source_dir.join("image.png"),
+ file_type: FileType::File,
+ };
+
+ strategy.handle_html(&source_dir, &output_dir, &file, "unused layout");
+
+ let copied_path = &output_dir.join("image.png");
+ assert!(copied_path.exists());
+
+ // Verify file contents are identical
+ let original = fs::read(&file.path).unwrap();
+ let copied = fs::read(copied_path).unwrap();
+ assert_eq!(original, copied);
+ }
- // Cleanup
- let _ = fs::remove_file(copied_path);
- }
+ #[test]
+ fn handle_gemini_copies_file() {
+ let test_dir = setup_test_dir();
+ let source_dir = test_dir.join("source");
+ let output_dir = test_dir.join("output");
+ create_dir_all(&source_dir).expect("Could not create source test directory");
+ create_dir_all(&output_dir).expect("Could not create output test directory");
+ create_test_file(&source_dir.join("image.png"), "A fish playing the banjo");
+ let strategy = Strategy {};
+
+ let file = File {
+ path: source_dir.join("image.png"),
+ file_type: FileType::File,
+ };
+
+ strategy.handle_gemini(&source_dir, &output_dir, &file);
+
+ let copied_path = &output_dir.join("image.png");
+ assert!(copied_path.exists());
+
+ // Verify file contents are identical
+ let original = fs::read(&file.path).unwrap();
+ let copied = fs::read(copied_path).unwrap();
+ assert_eq!(original, copied);
}
}