use crate::channels::telegram::media::{
attachment_tmp_name, migrate_flat_attachments_in, sanitize_filename_component,
};
#[test]
fn document_name_leads_with_original_stem() {
let out = attachment_tmp_name(
Some("plan_mode_feature_de5e97b3.plan.md"),
"doc",
-1003,
1783,
"bin",
);
assert_eq!(out, "plan_mode_feature_de5e97b3.plan--1003-1783.md");
assert!(out.starts_with("plan_mode_feature_de5e97b3.plan"));
assert!(out.ends_with("-1003-1783.md"));
}
#[test]
fn missing_filename_falls_back_to_synthetic_stem() {
let out = attachment_tmp_name(None, "doc", 42, 99, "bin");
assert_eq!(out, "doc-42-99.bin");
}
#[test]
fn dotless_filename_uses_fallback_extension() {
let out = attachment_tmp_name(Some("README"), "doc", 7, 8, "bin");
assert_eq!(out, "README-7-8.bin");
}
#[test]
fn unsafe_characters_in_name_are_sanitized() {
let out = attachment_tmp_name(Some("my report v2/final.txt"), "doc", 1, 2, "bin");
assert_eq!(out, "my_report_v2_final-1-2.txt");
}
#[test]
fn audio_uses_the_same_scheme() {
let out = attachment_tmp_name(Some("song.final.mp3"), "audio", 5, 6, "ogg");
assert_eq!(out, "song.final-5-6.mp3");
}
#[test]
fn sanitize_never_yields_empty() {
assert_eq!(sanitize_filename_component("///"), "file");
assert_eq!(sanitize_filename_component(" "), "file");
assert_eq!(sanitize_filename_component("a.b-c_d"), "a.b-c_d");
}
#[test]
fn migration_sweeps_flat_files_into_platform_subdir() {
let base = tempfile::tempdir().expect("tempdir");
let base = base.path();
std::fs::write(base.join("uuid_report.md"), b"a").unwrap();
std::fs::write(base.join("uuid_photo.jpg"), b"b").unwrap();
std::fs::create_dir_all(base.join("slack")).unwrap();
std::fs::write(base.join("slack").join("keep.txt"), b"c").unwrap();
let moved = migrate_flat_attachments_in(base, "telegram");
assert_eq!(moved, 2, "both loose files move");
assert!(base.join("telegram").join("uuid_report.md").exists());
assert!(base.join("telegram").join("uuid_photo.jpg").exists());
assert!(!base.join("uuid_report.md").exists());
assert!(base.join("slack").join("keep.txt").exists());
assert_eq!(migrate_flat_attachments_in(base, "telegram"), 0);
}
#[test]
fn migration_keeps_original_on_name_clash() {
let base = tempfile::tempdir().expect("tempdir");
let base = base.path();
std::fs::create_dir_all(base.join("telegram")).unwrap();
std::fs::write(base.join("telegram").join("dup.md"), b"existing").unwrap();
std::fs::write(base.join("dup.md"), b"new").unwrap();
let moved = migrate_flat_attachments_in(base, "telegram");
assert_eq!(moved, 0, "clashing file is not moved");
assert_eq!(
std::fs::read(base.join("telegram").join("dup.md")).unwrap(),
b"existing"
);
assert!(base.join("dup.md").exists());
}