use crate::logger::file_handler::file_manager::{CompressFileError, FileManager};
use crate::Level;
use crate::{logger, Config};
use std::fs;
use std::path::Path;
fn dummy_config() -> Config {
Config {
level: Level::INFO,
file_manager: None,
..Default::default()
}
}
fn get_dummy_file_manager() -> FileManager {
let config = dummy_config();
let fm_opt = FileManager::init_from_string("test_log_{date}_{time}.txt", config.clone());
assert!(
fm_opt.is_ok(),
"FileManager initialization failed with a valid format"
);
fm_opt.unwrap()
}
#[test]
fn test_init_from_string_valid() {
let config = dummy_config();
let fm = FileManager::init_from_string("log_{date}_{time}.txt", config);
assert!(
fm.is_ok(),
"Expected valid FileManager from a correct file format"
);
}
#[test]
fn test_init_from_string_invalid() {
let config = dummy_config();
let fm = FileManager::init_from_string("log_{date}_{time}<.txt", config);
assert!(
fm.is_err(),
"Expected failure when using forbidden characters in the format"
);
}
#[test]
fn test_remove_rotations() {
let mut fm = get_dummy_file_manager();
let added = fm.add_rotation("1 day");
assert!(
added,
"Expected add_rotation to succeed for a valid rotation definition"
);
fm.remove_rotations();
let fm_debug = format!("{:?}", fm);
assert!(
fm_debug.contains("rotation: []"),
"Expected rotations to be removed (empty list)"
);
}
#[test]
fn test_add_rotation() {
let mut fm = get_dummy_file_manager();
let valid = fm.add_rotation("1 day");
assert!(valid, "Expected add_rotation to succeed with '1 day'");
let invalid = fm.add_rotation("invalid");
assert!(
!invalid,
"Expected add_rotation to fail with an invalid rotation string"
);
}
#[test]
fn test_set_and_remove_compression() {
let mut fm = get_dummy_file_manager();
let set_ok = fm.set_compression("zip");
assert!(set_ok, "Expected set_compression to accept 'zip'");
fm.remove_compression();
let result = fm.compress_file("nonexistent.txt");
match result {
Err(CompressFileError::UnableToGetCompressionSettings) => {}
_ => panic!("Expected an error for missing compression settings after removal"),
}
}
#[test]
fn test_create_new_file() {
let mut fm = get_dummy_file_manager();
let config = dummy_config();
let res = fm.create_new_file(&config);
assert!(res.is_ok(), "Expected create_new_file to succeed");
let file_name = fm.get_file_name();
assert!(
Path::new(&file_name).exists(),
"Created file does not exist on disk"
);
let _ = fs::remove_file(&file_name);
}
#[test]
fn test_delete_file() {
let temp_file = "temp_test_file.txt";
fs::File::create(temp_file).expect("Failed to create temporary file");
assert!(Path::new(temp_file).exists(), "Temporary file should exist");
let res = FileManager::delete_file(temp_file);
assert!(res.is_ok(), "Expected delete_file to succeed");
assert!(
!Path::new(temp_file).exists(),
"Temporary file should have been deleted"
);
}
#[test]
fn test_write_log_success() {
let mut fm = get_dummy_file_manager();
let config = dummy_config();
fm.create_new_file(&config)
.expect("Expected file creation to succeed");
let file_name = fm.get_file_name();
let log_message = "Test log message";
let write_res = fm.write_log(log_message, config);
assert!(write_res.is_ok(), "Expected write_log to succeed");
let content = fs::read_to_string(&file_name).unwrap_or_else(|_| String::new());
assert!(
content.contains(log_message),
"Log file does not contain the written message"
);
let _ = fs::remove_file(&file_name);
}
#[test]
fn test_compress_file() {
let mut fm = get_dummy_file_manager();
let config = dummy_config();
fm.create_new_file(&config)
.expect("Expected file creation to succeed");
let file_name = fm.get_file_name();
fs::write(&file_name, "Dummy log content").expect("Failed to write dummy log content");
assert!(
fm.set_compression("zip"),
"Expected setting compression to succeed"
);
assert!(logger::set_archive_dir("loggit_archives").is_ok());
let comp_res = fm.compress_file(&file_name);
assert!(comp_res.is_ok(), "Expected compress_file to succeed");
let zip_file = format!("./loggit_archives/{}.zip", file_name);
assert!(
Path::new(&zip_file).exists(),
"Expected the zip archive to exist"
);
let _ = fs::remove_file(&file_name);
let _ = fs::remove_file(&zip_file);
let _ = fs::remove_dir_all("./loggit_archives/");
}
#[test]
fn rotation_by_size_triggers_compression() {
let mut fm = FileManager::init_from_string("big_{date}_{time}.log", dummy_config()).unwrap();
fm.add_rotation("1 KB"); fm.set_compression("zip"); logger::set_archive_dir("loggit_archives").unwrap();
fm.create_new_file(&dummy_config()).unwrap();
let file_name = fm.get_file_name();
std::fs::write(&file_name, vec![0u8; 1500]).unwrap();
let outcome = fm.write_log("hello", dummy_config()).unwrap();
assert!(matches!(
outcome,
logger::file_handler::file_manager::VerifyConstraintsRes::NewFileCreated
));
let archived = format!("loggit_archives/{}.zip", file_name);
assert!(
std::path::Path::new(&archived).exists(),
"expected {} to exist",
archived
);
let _ = std::fs::remove_file(&archived);
let _ = std::fs::remove_dir_all("loggit_archives");
}