use crate::{
Uri,
fs::{
FileSystem,
UriPath,
physical::PhysicalFileSystem,
},
};
#[test]
fn test_file_uri_format_handling() {
let temp_dir = tempfile::Builder::new()
.prefix("laburnum-fs-test")
.tempdir()
.expect("Failed to create temp directory");
let temp_path = temp_dir.path();
let test_file_path = temp_path.join("test.txt");
let test_content = "test content";
std::fs::write(&test_file_path, test_content)
.expect("Failed to write test file");
let canonical_uri = Uri::from_file_path(&test_file_path).unwrap();
let localhost_uri = Uri::parse(
&canonical_uri
.as_str()
.replace("file:///", "file://localhost/"),
)
.unwrap();
println!("Canonical uri: {canonical_uri}");
println!("Localhost uri: {localhost_uri}");
assert_eq!(
canonical_uri.scheme(),
fluent_uri::component::Scheme::new_or_panic("file")
);
assert_eq!(
localhost_uri.scheme(),
fluent_uri::component::Scheme::new_or_panic("file")
);
let fs_from_canonical = PhysicalFileSystem::new(canonical_uri.clone())
.expect("Failed to create filesystem from canonical Uri");
let fs_from_localhost = PhysicalFileSystem::new(localhost_uri.clone())
.expect("Failed to create filesystem from localhost Uri");
let content1 = fs_from_canonical
.read(&canonical_uri)
.expect("Failed to read with canonical Uri");
let content2 = fs_from_localhost
.read(&localhost_uri)
.expect("Failed to read with localhost Uri");
let content3 = fs_from_canonical
.read(&localhost_uri)
.expect("Failed to read localhost Uri with canonical filesystem");
let content4 = fs_from_localhost
.read(&canonical_uri)
.expect("Failed to read canonical Uri with localhost filesystem");
assert_eq!(content1, test_content.as_bytes());
assert_eq!(content2, test_content.as_bytes());
assert_eq!(content3, test_content.as_bytes());
assert_eq!(content4, test_content.as_bytes());
}
#[test]
fn test_uri_path_operations_with_different_formats() {
let standard_uri = Uri::parse("file:///path/to/file.txt").unwrap();
let standard_parent = standard_uri.parent().unwrap();
assert!(standard_parent.as_str().contains("/path/to/"));
let localhost_uri = Uri::parse("file://localhost/path/to/file.txt").unwrap();
let localhost_parent = localhost_uri.parent().unwrap();
assert!(localhost_parent.as_str().contains("/path/to/"));
assert_eq!(standard_uri.file_name().unwrap(), "file.txt");
assert_eq!(localhost_uri.file_name().unwrap(), "file.txt");
let standard_joined = standard_uri
.parent()
.unwrap()
.join_path("other.txt")
.unwrap();
assert!(standard_joined.as_str().contains("/path/to/other.txt"));
let localhost_joined = localhost_uri
.parent()
.unwrap()
.join_path("other.txt")
.unwrap();
assert!(localhost_joined.as_str().contains("/path/to/other.txt"));
let uri_with_dots_standard =
Uri::parse("file:///path/./to/../to/file.txt").unwrap();
let standard_normalized = uri_with_dots_standard.normalize();
assert!(standard_normalized.as_str().contains("/path/to/file.txt"));
assert!(!standard_normalized.as_str().contains("/./"));
assert!(!standard_normalized.as_str().contains("/../"));
let uri_with_dots_localhost =
Uri::parse("file://localhost/path/./to/../to/file.txt").unwrap();
let localhost_normalized = uri_with_dots_localhost.normalize();
assert!(localhost_normalized.as_str().contains("/path/to/file.txt"));
assert!(!localhost_normalized.as_str().contains("/./"));
assert!(!localhost_normalized.as_str().contains("/../"));
}
#[test]
fn test_uri_to_path_conversion() {
let temp_dir = tempfile::Builder::new()
.prefix("laburnum-fs-test")
.tempdir()
.expect("Failed to create temp directory");
let test_path = temp_dir.path().join("test.txt");
std::fs::write(&test_path, "test").expect("Failed to write test file");
let canonical_uri = Uri::from_file_path(&test_path).unwrap();
println!("Canonical Uri from path: {canonical_uri}");
let localhost_uri_str = canonical_uri
.as_str()
.replace("file:///", "file://localhost/");
let localhost_uri = Uri::parse(&localhost_uri_str).unwrap();
println!("Canonical uri: {canonical_uri}");
println!("Localhost uri: {localhost_uri}");
let path_from_canonical = canonical_uri.to_file_path().unwrap();
let path_from_localhost = localhost_uri.to_file_path().unwrap();
assert_eq!(path_from_canonical, test_path);
assert_eq!(path_from_localhost, test_path);
let fs_canonical = PhysicalFileSystem::new(canonical_uri.clone()).unwrap();
let fs_localhost = PhysicalFileSystem::new(localhost_uri.clone()).unwrap();
assert!(fs_canonical.read(&canonical_uri).is_ok());
assert!(fs_localhost.read(&localhost_uri).is_ok());
assert!(fs_canonical.read(&localhost_uri).is_ok());
assert!(fs_localhost.read(&canonical_uri).is_ok());
}
#[test]
fn test_file_uri_localhost() {
let temp_dir = tempfile::Builder::new()
.prefix("laburnum-fs-test")
.tempdir()
.expect("Failed to create temp directory");
let test_path = temp_dir.path().join("test.txt");
let test_content = "localhost test";
std::fs::write(&test_path, test_content).expect("Failed to write test file");
let canonical_uri = Uri::from_file_path(&test_path).unwrap();
let localhost_str = if canonical_uri.as_str().starts_with("file:///") {
canonical_uri
.as_str()
.replace("file:///", "file://localhost/")
} else {
canonical_uri
.as_str()
.replace("file://", "file://localhost/")
};
let localhost_uri = Uri::parse(&localhost_str).unwrap();
println!("Canonical uri: {canonical_uri}");
println!("Localhost uri: {localhost_uri}");
let path1 = canonical_uri.to_file_path().unwrap();
let path2 = localhost_uri.to_file_path().unwrap();
assert_eq!(path1, test_path);
assert_eq!(path2, test_path);
let fs1 = PhysicalFileSystem::new(canonical_uri.clone()).unwrap();
let content1 = fs1.read(&canonical_uri).unwrap();
let content2 = fs1.read(&localhost_uri).unwrap();
assert_eq!(content1, test_content.as_bytes());
assert_eq!(content2, test_content.as_bytes());
}