Support hidden files for tests

This commit is contained in:
Josh Megnauth 2024-02-01 23:31:50 -05:00 • committed by Jeremy Soller
parent cfc354b7ad
commit 5d51190169
2 changed files with 41 additions and 9 deletions

View file

@ -1080,18 +1080,19 @@ pub(crate) mod test_utils {
// Default number of files, directories, and nested directories for test file system // Default number of files, directories, and nested directories for test file system
pub const NUM_FILES: usize = 2; pub const NUM_FILES: usize = 2;
pub const NUM_HIDDEN: usize = 1;
pub const NUM_DIRS: usize = 2; pub const NUM_DIRS: usize = 2;
pub const NUM_NESTED: usize = 1; pub const NUM_NESTED: usize = 1;
pub const NAME_LEN: usize = 5; pub const NAME_LEN: usize = 5;
/// Add `n` temporary files in `dir` /// Add `n` temporary files in `dir`
/// ///
/// Each file is assigned a numeric name from [0, n). /// Each file is assigned a numeric name from [0, n) with a prefix.
pub fn file_flat_hier<D: AsRef<Path>>(dir: D, n: usize) -> io::Result<Vec<File>> { pub fn file_flat_hier<D: AsRef<Path>>(dir: D, n: usize, prefix: &str) -> io::Result<Vec<File>> {
let dir = dir.as_ref(); let dir = dir.as_ref();
(0..n) (0..n)
.map(|i| -> io::Result<File> { .map(|i| -> io::Result<File> {
let name = i.to_string(); let name = format!("{prefix}{i}");
let path = dir.join(&name); let path = dir.join(&name);
let mut file = File::create(path)?; let mut file = File::create(path)?;
@ -1108,8 +1109,17 @@ pub(crate) mod test_utils {
} }
/// Create a small, temporary file hierarchy. /// Create a small, temporary file hierarchy.
///
/// # Arguments
///
/// * `files` - Number of files to create in temp directories
/// * `hidden` - Number of hidden files to create
/// * `dirs` - Number of directories to create
/// * `nested` - Number of nested directories to create in new dirs
/// * `name_len` - Length of randomized directory names
pub fn simple_fs( pub fn simple_fs(
files: usize, files: usize,
hidden: usize,
dirs: usize, dirs: usize,
nested: usize, nested: usize,
name_len: usize, name_len: usize,
@ -1118,6 +1128,7 @@ pub(crate) mod test_utils {
// TempDir won't leak resources as long as the destructor runs // TempDir won't leak resources as long as the destructor runs
let root = tempdir()?; let root = tempdir()?;
debug!("Root temp directory: {}", root.as_ref().display()); debug!("Root temp directory: {}", root.as_ref().display());
trace!("Creating {files} files and {hidden} hidden files in {dirs} temp dirs with {nested} nested temp dirs");
// All paths for directories and nested directories // All paths for directories and nested directories
let paths = (0..dirs).flat_map(|_| { let paths = (0..dirs).flat_map(|_| {
@ -1132,7 +1143,11 @@ pub(crate) mod test_utils {
// Create directories from `paths` and add a few files // Create directories from `paths` and add a few files
for path in paths { for path in paths {
fs::create_dir_all(&path)?; fs::create_dir_all(&path)?;
file_flat_hier(&path, files)?;
// Normal files
file_flat_hier(&path, files, "")?;
// Hidden files
file_flat_hier(&path, hidden, ".")?;
for entry in path.read_dir()? { for entry in path.read_dir()? {
let entry = entry?; let entry = entry?;
@ -1179,8 +1194,24 @@ pub(crate) mod test_utils {
.expect("temp entries should have names") .expect("temp entries should have names")
.to_str() .to_str()
.expect("temp entries should be valid UTF-8"); .expect("temp entries should be valid UTF-8");
let metadata = path.is_dir(); let is_dir = path.is_dir();
name == item.name && metadata == item.metadata.is_dir() && path == item.path // NOTE: I don't want to change `tab::hidden_attribute` to `pub(crate)` for
// tests without asking
#[cfg(not(target_os = "windows"))]
let is_hidden = name.starts_with('.');
#[cfg(target_os = "windows")]
let is_hidden = {
use std::os::windows::fs::MetadataExt;
const FILE_ATTRIBUTE_HIDDEN: u32 = 2;
let metadata = path.metadata().expect("fetching file metadata");
metadata.file_attributes() & FILE_ATTRIBUTE_HIDDEN == FILE_ATTRIBUTE_HIDDEN
};
name == item.name
&& is_dir == item.metadata.is_dir()
&& path == item.path
&& is_hidden == item.hidden
} }
} }

View file

@ -1043,12 +1043,13 @@ mod tests {
use super::scan_path; use super::scan_path;
use crate::app::test_utils::{ use crate::app::test_utils::{
empty_fs, eq_path_item, simple_fs, sort_files, NAME_LEN, NUM_DIRS, NUM_FILES, NUM_NESTED, empty_fs, eq_path_item, simple_fs, sort_files, NAME_LEN, NUM_DIRS, NUM_FILES, NUM_HIDDEN,
NUM_NESTED,
}; };
#[test] #[test]
fn scan_path_succeeds_on_valid_path() -> io::Result<()> { fn scan_path_succeeds_on_valid_path() -> io::Result<()> {
let fs = simple_fs(NUM_FILES, NUM_DIRS, NUM_NESTED, NAME_LEN)?; let fs = simple_fs(NUM_FILES, NUM_HIDDEN, NUM_DIRS, NUM_NESTED, NAME_LEN)?;
let path = fs.path(); let path = fs.path();
let mut entries: Vec<_> = path let mut entries: Vec<_> = path
@ -1074,7 +1075,7 @@ mod tests {
#[test] #[test]
fn scan_path_returns_empty_vec_for_invalid_path() -> io::Result<()> { fn scan_path_returns_empty_vec_for_invalid_path() -> io::Result<()> {
let fs = simple_fs(NUM_FILES, NUM_DIRS, NUM_NESTED, NAME_LEN)?; let fs = simple_fs(NUM_FILES, NUM_NESTED, NUM_DIRS, NUM_NESTED, NAME_LEN)?;
let path = fs.path(); let path = fs.path();
// A nonexisting path within the temp dir // A nonexisting path within the temp dir