mod helpers;
use helpers::{extract_bytes_document, extract_uri_document};
#[cfg(feature = "tokio-runtime")]
use std::time::Instant;
use xberg::XbergError;
use xberg::core::config::ExtractionConfig;
#[cfg(feature = "tokio-runtime")]
#[tokio::test]
async fn test_extract_bytes_zero_timeout_returns_timeout_error() {
let config = ExtractionConfig {
extraction_timeout_secs: Some(0),
..Default::default()
};
let content = b"Hello world, this is a plain-text document.";
let result = extract_bytes_document(content, "text/plain", &config).await;
match result {
Err(XbergError::Timeout { limit_ms, .. }) => {
assert_eq!(limit_ms, 0, "limit_ms should reflect the configured 0-second timeout");
}
Ok(_) => {}
Err(e) => panic!("Expected Ok or Timeout, got: {e:?}"),
}
}
#[cfg(feature = "tokio-runtime")]
#[tokio::test]
async fn test_extract_file_zero_timeout_returns_timeout_error() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("hello.txt");
std::fs::write(&path, b"Hello world").expect("write");
let config = ExtractionConfig {
extraction_timeout_secs: Some(0),
..Default::default()
};
let result = extract_uri_document(&path, None, &config).await;
match result {
Err(XbergError::Timeout { limit_ms, .. }) => {
assert_eq!(limit_ms, 0);
}
Ok(_) => {}
Err(e) => panic!("Expected Ok or Timeout, got: {e:?}"),
}
}
#[cfg(feature = "tokio-runtime")]
#[tokio::test]
async fn test_extract_bytes_no_timeout_succeeds() {
let config = ExtractionConfig::default();
let content = b"No timeout configured.";
let result = extract_bytes_document(content, "text/plain", &config).await;
assert!(result.is_ok(), "extraction without timeout should succeed: {result:?}");
}
#[cfg(feature = "tokio-runtime")]
#[tokio::test]
async fn test_extract_file_no_timeout_succeeds() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("test.txt");
std::fs::write(&path, b"No timeout configured.").expect("write");
let config = ExtractionConfig::default();
let result = extract_uri_document(&path, None, &config).await;
assert!(result.is_ok(), "extraction without timeout should succeed: {result:?}");
}
#[cfg(feature = "tokio-runtime")]
#[tokio::test]
async fn test_extract_bytes_timeout_elapsed_is_plausible() {
let config = ExtractionConfig {
extraction_timeout_secs: Some(0),
..Default::default()
};
let content = b"timing check";
let start = Instant::now();
let _ = extract_bytes_document(content, "text/plain", &config).await;
let wall_ms = start.elapsed().as_millis() as u64;
assert!(
wall_ms < 1000,
"single-file extraction with 0s timeout took too long: {wall_ms}ms"
);
}
#[cfg(not(feature = "tokio-runtime"))]
#[tokio::test]
async fn test_extract_bytes_timeout_without_tokio_returns_validation_error() {
let config = ExtractionConfig {
extraction_timeout_secs: Some(5),
..Default::default()
};
let content = b"testing";
let result = extract_bytes_document(content, "text/plain", &config).await;
match result {
Err(XbergError::Validation { message, .. }) => {
assert!(message.contains("requires the 'tokio-runtime' feature"));
}
other => panic!("Expected Validation error, got {other:?}"),
}
}
#[cfg(not(feature = "tokio-runtime"))]
#[tokio::test]
async fn test_extract_file_timeout_without_tokio_returns_validation_error() {
let dir = tempfile::tempdir().expect("tempdir");
let file_path = dir.path().join("test.txt");
std::fs::write(&file_path, b"testing").unwrap();
let config = ExtractionConfig {
extraction_timeout_secs: Some(5),
..Default::default()
};
let result = extract_uri_document(&file_path, Some("text/plain"), &config).await;
match result {
Err(XbergError::Validation { message, .. }) => {
assert!(message.contains("requires the 'tokio-runtime' feature"));
}
other => panic!("Expected Validation error, got {other:?}"),
}
}