#![cfg(any(feature = "export-csv", feature = "export-opml"))]
use things3_core::{DataExporter, ExportData, ExportFormat};
#[test]
fn test_export_empty_data() {
let exporter = DataExporter::new_default();
let data = ExportData::new(vec![], vec![], vec![]);
let json = exporter.export(&data, ExportFormat::Json).unwrap();
assert!(!json.is_empty(), "JSON should not be empty");
assert!(
json.contains("tasks") && json.contains("[]"),
"Should have empty arrays"
);
#[cfg(feature = "export-csv")]
{
let _csv = exporter.export(&data, ExportFormat::Csv).unwrap();
}
let markdown = exporter.export(&data, ExportFormat::Markdown).unwrap();
assert!(markdown.contains("# Things 3 Export"), "Should have title");
#[cfg(feature = "export-opml")]
{
let opml = exporter.export(&data, ExportFormat::Opml).unwrap();
assert!(opml.contains("<?xml"), "Should have XML header");
}
}
#[test]
#[cfg(feature = "test-utils")]
fn test_export_with_mock_data() {
use things3_core::test_utils::{create_mock_areas, create_mock_projects, create_mock_tasks};
let exporter = DataExporter::new_default();
let tasks = create_mock_tasks();
let projects = create_mock_projects();
let areas = create_mock_areas();
let data = ExportData::new(tasks, projects, areas);
let json = exporter.export(&data, ExportFormat::Json).unwrap();
assert!(!json.is_empty(), "JSON should contain data");
#[cfg(feature = "export-csv")]
{
let csv = exporter.export(&data, ExportFormat::Csv).unwrap();
assert!(!csv.is_empty(), "CSV should contain data");
}
let markdown = exporter.export(&data, ExportFormat::Markdown).unwrap();
assert!(markdown.contains("# Things 3 Export"), "Should have title");
}
#[test]
#[cfg(feature = "test-utils")]
fn test_export_large_dataset() {
use things3_core::test_utils::create_mock_tasks;
let exporter = DataExporter::new_default();
let mut tasks = vec![];
for _ in 0..100 {
tasks.extend(create_mock_tasks());
}
let data = ExportData::new(tasks, vec![], vec![]);
let json = exporter.export(&data, ExportFormat::Json).unwrap();
assert!(json.len() > 1000, "JSON should be substantial");
#[cfg(feature = "export-csv")]
{
let csv = exporter.export(&data, ExportFormat::Csv).unwrap();
assert!(csv.lines().count() > 100, "CSV should have many lines");
}
let markdown = exporter.export(&data, ExportFormat::Markdown).unwrap();
assert!(markdown.contains("Total Items:"), "Should show item count");
}
#[test]
fn test_export_only_empty_data() {
let exporter = DataExporter::new_default();
let data = ExportData::new(vec![], vec![], vec![]);
let json = exporter.export(&data, ExportFormat::Json).unwrap();
assert!(!json.is_empty(), "JSON should handle empty data");
#[cfg(feature = "export-csv")]
{
let _csv = exporter.export(&data, ExportFormat::Csv).unwrap();
}
let markdown = exporter.export(&data, ExportFormat::Markdown).unwrap();
assert!(!markdown.is_empty(), "Markdown should handle empty data");
assert!(markdown.contains("Total Items"), "Should show item count");
}
#[test]
fn test_json_export_validity() {
let exporter = DataExporter::new_default();
let data = ExportData::new(vec![], vec![], vec![]);
let json = exporter.export(&data, ExportFormat::Json).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert!(parsed.is_object(), "Should be a JSON object");
assert!(parsed.get("tasks").is_some(), "Should have tasks field");
assert!(
parsed.get("projects").is_some(),
"Should have projects field"
);
assert!(parsed.get("areas").is_some(), "Should have areas field");
}
#[test]
#[cfg(feature = "export-csv")]
fn test_csv_export_format() {
let exporter = DataExporter::new_default();
let data = ExportData::new(vec![], vec![], vec![]);
let _csv = exporter.export(&data, ExportFormat::Csv).unwrap();
}
#[test]
#[cfg(feature = "test-utils")]
fn test_export_mixed_data() {
use things3_core::test_utils::{create_mock_areas, create_mock_projects, create_mock_tasks};
let exporter = DataExporter::new_default();
let tasks = create_mock_tasks();
let projects = create_mock_projects();
let areas = create_mock_areas();
let data = ExportData::new(tasks, projects, areas);
let json = exporter.export(&data, ExportFormat::Json).unwrap();
assert!(!json.is_empty());
#[cfg(feature = "export-csv")]
{
let csv = exporter.export(&data, ExportFormat::Csv).unwrap();
assert!(!csv.is_empty());
}
let markdown = exporter.export(&data, ExportFormat::Markdown).unwrap();
assert!(!markdown.is_empty());
}
#[test]
fn test_export_format_parsing() {
use std::str::FromStr;
assert!(matches!(
ExportFormat::from_str("json"),
Ok(ExportFormat::Json)
));
assert!(matches!(
ExportFormat::from_str("JSON"),
Ok(ExportFormat::Json)
));
assert!(matches!(
ExportFormat::from_str("csv"),
Ok(ExportFormat::Csv)
));
assert!(matches!(
ExportFormat::from_str("markdown"),
Ok(ExportFormat::Markdown)
));
assert!(matches!(
ExportFormat::from_str("md"),
Ok(ExportFormat::Markdown)
));
assert!(matches!(
ExportFormat::from_str("opml"),
Ok(ExportFormat::Opml)
));
assert!(ExportFormat::from_str("invalid").is_err());
}