test: Unit-Tests für clean_filename() hinzugefügt
- 8 Tests für verschiedene Edge-Cases: - Basis-Funktionalität (Spaces, Klammern) - Versteckte Dateien (.gitignore, .my config) - Umlaute (Müller → Mueller) - Extensions (.tar.gz, mehrfache Punkte) - Spezial-Identifier (C++, C#) - Apostrophe (O'Reilly → OReilly) - Leere Dateinamen nach Bereinigung - Dateien die keine Änderung benötigen Alle Tests bestehen ✓ Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
0972ca4d6b
commit
608acaffc6
1 changed files with 166 additions and 0 deletions
166
src/sanitizer.rs
166
src/sanitizer.rs
|
|
@ -192,3 +192,169 @@ pub fn is_safe_rename(src: &Path, dst: &Path, force: bool) -> bool {
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use std::ffi::OsStr;
|
||||||
|
|
||||||
|
fn make_test_config() -> Config {
|
||||||
|
let mut replacements = std::collections::HashMap::new();
|
||||||
|
replacements.insert("ä".to_string(), "ae".to_string());
|
||||||
|
replacements.insert("ö".to_string(), "oe".to_string());
|
||||||
|
replacements.insert("ü".to_string(), "ue".to_string());
|
||||||
|
replacements.insert("ß".to_string(), "ss".to_string());
|
||||||
|
Config { replacements }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clean_filename_basic() {
|
||||||
|
let config = Config::default();
|
||||||
|
|
||||||
|
// Spaces should become underscores
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("test file.txt"), &config, false),
|
||||||
|
Some("test_file.txt".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Parentheses should become underscores
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("file (1).txt"), &config, false),
|
||||||
|
Some("file_1.txt".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Multiple underscores should be collapsed
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("test__file.txt"), &config, false),
|
||||||
|
Some("test_file.txt".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clean_filename_hidden_files() {
|
||||||
|
let config = Config::default();
|
||||||
|
|
||||||
|
// Hidden files should keep their leading dot
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new(".gitignore"), &config, false),
|
||||||
|
None // No change needed
|
||||||
|
);
|
||||||
|
|
||||||
|
// Hidden files with spaces
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new(".my config"), &config, false),
|
||||||
|
Some(".my_config".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Hidden files with extension
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new(".test file.txt"), &config, false),
|
||||||
|
Some(".test_file.txt".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Multiple leading dots
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("...strange"), &config, false),
|
||||||
|
Some(".unnamed.strange".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clean_filename_umlauts() {
|
||||||
|
let config = make_test_config();
|
||||||
|
|
||||||
|
// German umlauts
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("Müller.pdf"), &config, false),
|
||||||
|
Some("Mueller.pdf".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("schön.txt"), &config, false),
|
||||||
|
Some("schoen.txt".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("Größe.doc"), &config, false),
|
||||||
|
Some("Groesse.doc".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clean_filename_extensions() {
|
||||||
|
let config = Config::default();
|
||||||
|
|
||||||
|
// Single extension
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("test file.txt"), &config, false),
|
||||||
|
Some("test_file.txt".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
// Double extension (currently only keeps last)
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("archive.tar.gz"), &config, false),
|
||||||
|
None // No special chars to clean
|
||||||
|
);
|
||||||
|
|
||||||
|
// Multiple dots
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("foo..bar.txt"), &config, false),
|
||||||
|
Some("foo.bar.txt".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clean_filename_special_identifiers() {
|
||||||
|
let config = Config::default();
|
||||||
|
|
||||||
|
// C++ should be preserved
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("test C++.txt"), &config, false),
|
||||||
|
Some("test_C++.txt".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
// C# should be preserved
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("guide C#.pdf"), &config, false),
|
||||||
|
Some("guide_C#.pdf".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clean_filename_no_change_needed() {
|
||||||
|
let config = Config::default();
|
||||||
|
|
||||||
|
// Already clean filenames should return None
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("clean_file.txt"), &config, false),
|
||||||
|
None
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("another-file.pdf"), &config, false),
|
||||||
|
None
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clean_filename_empty_after_cleaning() {
|
||||||
|
let config = Config::default();
|
||||||
|
|
||||||
|
// File with only special chars should become "unnamed"
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("###.txt"), &config, false),
|
||||||
|
Some("unnamed.txt".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clean_filename_apostrophe() {
|
||||||
|
let config = Config::default();
|
||||||
|
|
||||||
|
// Apostrophes should be removed (not replaced with underscore)
|
||||||
|
assert_eq!(
|
||||||
|
clean_filename(OsStr::new("O'Reilly.pdf"), &config, false),
|
||||||
|
Some("OReilly.pdf".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue