use oximedia_container::{BatchMetadataUpdate, BatchResult};
use std::path::PathBuf;
fn tmp_str(name: &str) -> String {
std::env::temp_dir()
.join(format!("oximedia-container-metadata-batch-{name}"))
.to_string_lossy()
.into_owned()
}
#[test]
fn batch_result_default_is_empty() {
let r = BatchResult::default();
assert!(r.ok.is_empty());
assert!(r.failed.is_empty());
assert_eq!(r.total(), 0);
assert!(r.all_succeeded());
}
#[test]
fn batch_result_total_is_sum_of_ok_and_failed() {
let mut r = BatchResult::default();
r.ok.push(PathBuf::from("a.flac"));
r.ok.push(PathBuf::from("b.flac"));
assert_eq!(r.total(), 2);
assert!(r.all_succeeded());
}
#[test]
fn batch_result_report_success_contains_count() {
let mut r = BatchResult::default();
r.ok.push(PathBuf::from("track01.flac"));
r.ok.push(PathBuf::from("track02.flac"));
r.ok.push(PathBuf::from("track03.flac"));
let report = r.into_report();
assert!(report.contains("3"), "report must mention count 3");
assert!(
report.contains("successfully"),
"report must say 'successfully'"
);
}
#[test]
fn builder_new_is_default() {
let b = BatchMetadataUpdate::new();
let r = b.apply();
assert_eq!(r.total(), 0);
assert!(r.all_succeeded());
}
#[test]
fn builder_add_file_then_no_tags_fails() {
let result = BatchMetadataUpdate::new()
.add_file(tmp_str("int_test_nonexistent_7x9k.flac"))
.set_tag("TITLE", "Integration Test")
.apply();
assert_eq!(result.ok.len(), 0);
assert_eq!(result.failed.len(), 1, "one non-existent file must fail");
}
#[test]
fn builder_multiple_nonexistent_files_all_fail() {
let result = BatchMetadataUpdate::new()
.add_file(tmp_str("int_missing_a.flac"))
.add_file(tmp_str("int_missing_b.flac"))
.add_file(tmp_str("int_missing_c.ogg"))
.set_tag("ALBUM", "Test Album")
.set_tag("DATE", "2026")
.apply();
assert_eq!(result.ok.len(), 0, "no files should succeed");
assert_eq!(result.failed.len(), 3, "all three missing files must fail");
assert!(!result.all_succeeded());
}
#[test]
fn builder_report_for_partial_failure_mentions_paths() {
let result = BatchMetadataUpdate::new()
.add_file(tmp_str("int_report_missing_x.wav"))
.add_file(tmp_str("int_report_missing_y.wav"))
.set_tag("GENRE", "Electronica")
.apply();
assert_eq!(result.failed.len(), 2);
let report = result.into_report();
assert!(
report.contains("int_report_missing_x.wav"),
"report must name the first failed path; got: {report}"
);
assert!(
report.contains("int_report_missing_y.wav"),
"report must name the second failed path; got: {report}"
);
}
#[test]
fn set_tag_multiple_keys_are_recorded() {
let result = BatchMetadataUpdate::new()
.set_tag("TITLE", "Hello")
.set_tag("ARTIST", "World")
.set_tag("DATE", "2026")
.apply();
assert_eq!(result.total(), 0);
assert!(result.all_succeeded());
}
#[test]
fn copy_from_nonexistent_source_fails_all_targets() {
let result = BatchMetadataUpdate::new()
.copy_from(
tmp_str("int_copy_source_missing.flac"),
vec!["TITLE".into(), "ARTIST".into()],
)
.add_file(tmp_str("int_copy_target_a.flac"))
.add_file(tmp_str("int_copy_target_b.flac"))
.apply();
assert_eq!(
result.ok.len(),
0,
"no targets should succeed when source is missing"
);
assert_eq!(result.failed.len(), 2, "both targets must fail");
}
#[test]
fn apply_no_files_returns_zero_total() {
let result = BatchMetadataUpdate::new()
.set_tag("COMMENT", "Unused tag, no files registered")
.apply();
assert_eq!(result.total(), 0);
let report = result.into_report();
assert!(!report.is_empty());
}
#[test]
fn all_succeeded_true_when_no_files() {
let result = BatchMetadataUpdate::new().apply();
assert!(
result.all_succeeded(),
"zero files processed = trivially succeeded"
);
}
#[test]
fn all_succeeded_false_when_any_fail() {
let result = BatchMetadataUpdate::new()
.add_file(tmp_str("int_any_fail.flac"))
.apply();
assert!(
!result.all_succeeded(),
"one failure means all_succeeded is false"
);
}