99 lines
3.5 KiB
Rust
99 lines
3.5 KiB
Rust
|
|
//! Integration tests for Apple iWork format extractors.
|
||
|
|
//!
|
||
|
|
//! These tests verify that .pages, .numbers, and .key files can be
|
||
|
|
//! opened, parsed, and produce non-empty text output.
|
||
|
|
|
||
|
|
#[cfg(feature = "iwork")]
|
||
|
|
mod iwork_tests {
|
||
|
|
use kreuzberg::core::config::ExtractionConfig;
|
||
|
|
use std::path::PathBuf;
|
||
|
|
|
||
|
|
fn test_doc_path(name: &str) -> PathBuf {
|
||
|
|
let manifest = env!("CARGO_MANIFEST_DIR");
|
||
|
|
PathBuf::from(manifest).join("../../test_documents/iwork").join(name)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── MIME type detection integration tests ───────────────────────────
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_mime_detection_numbers_file() {
|
||
|
|
let path = test_doc_path("test.numbers");
|
||
|
|
if !path.exists() {
|
||
|
|
eprintln!("Skipping: test.numbers not found at {:?}", path);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
let mime = kreuzberg::core::mime::detect_mime_type(&path, true).unwrap();
|
||
|
|
assert_eq!(
|
||
|
|
mime, "application/x-iwork-numbers-sffnumbers",
|
||
|
|
"Should detect .numbers MIME type from extension"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_mime_detection_pages_file() {
|
||
|
|
let path = test_doc_path("test.pages");
|
||
|
|
if !path.exists() {
|
||
|
|
eprintln!("Skipping: test.pages not found at {:?}", path);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
let mime = kreuzberg::core::mime::detect_mime_type(&path, true).unwrap();
|
||
|
|
assert_eq!(
|
||
|
|
mime, "application/x-iwork-pages-sffpages",
|
||
|
|
"Should detect .pages MIME type from extension"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Extraction integration tests ─────────────────────────────────────
|
||
|
|
|
||
|
|
#[tokio::test]
|
||
|
|
#[cfg(feature = "tokio-runtime")]
|
||
|
|
async fn test_extract_numbers_document() {
|
||
|
|
let path = test_doc_path("test.numbers");
|
||
|
|
if !path.exists() {
|
||
|
|
eprintln!("Skipping: test.numbers not found at {:?}", path);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
let content = std::fs::read(&path).expect("Failed to read test.numbers");
|
||
|
|
let config = ExtractionConfig::default();
|
||
|
|
|
||
|
|
let result = kreuzberg::extract_bytes(&content, "application/x-iwork-numbers-sffnumbers", &config)
|
||
|
|
.await
|
||
|
|
.expect("Extraction should not fail on valid file");
|
||
|
|
|
||
|
|
// A valid Numbers file should produce some text output
|
||
|
|
assert!(
|
||
|
|
!result.content.is_empty(),
|
||
|
|
"Numbers extraction should produce non-empty text. Got: {:?}",
|
||
|
|
&result.content[..result.content.len().min(200)]
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[tokio::test]
|
||
|
|
#[cfg(feature = "tokio-runtime")]
|
||
|
|
async fn test_extract_pages_document() {
|
||
|
|
let path = test_doc_path("test.pages");
|
||
|
|
if !path.exists() {
|
||
|
|
eprintln!("Skipping: test.pages not found at {:?}", path);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
let content = std::fs::read(&path).expect("Failed to read test.pages");
|
||
|
|
let config = ExtractionConfig::default();
|
||
|
|
|
||
|
|
// Extraction should not panic — it may produce empty content if the
|
||
|
|
// fixture is a stub (non-Snappy compressed IWA), but should not error.
|
||
|
|
let result = kreuzberg::extract_bytes(&content, "application/x-iwork-pages-sffpages", &config)
|
||
|
|
.await
|
||
|
|
.expect("Extraction should not fail on valid ZIP file");
|
||
|
|
|
||
|
|
// For any valid .pages file, extraction should succeed (even if empty)
|
||
|
|
assert!(
|
||
|
|
result.mime_type.as_ref() == "application/x-iwork-pages-sffpages",
|
||
|
|
"MIME type should be preserved in result"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|