chartml_core/plugin/
mod.rs1pub mod data_source;
2pub mod transform;
3pub mod renderer;
4pub mod resolver;
5
6pub use data_source::{DataSource, DataSpec, FetchOptions};
7pub use transform::{TransformMiddleware, TransformContext, TransformResult};
8pub use renderer::{ChartRenderer, ChartConfig};
9pub use resolver::{DatasourceResolver, ConnectionConfig};
10
11
12#[cfg(test)]
13mod tests {
14 use super::*;
15 use std::collections::HashMap;
16
17 #[test]
18 fn test_data_spec_creation() {
19 let spec = DataSpec {
20 provider: "inline".to_string(),
21 rows: Some(vec![serde_json::json!({"x": 1})]),
22 url: None,
23 endpoint: None,
24 };
25 assert_eq!(spec.provider, "inline");
26 assert!(spec.rows.is_some());
27 assert_eq!(spec.rows.unwrap().len(), 1);
28 assert!(spec.url.is_none());
29 assert!(spec.endpoint.is_none());
30 }
31
32 #[test]
33 fn test_chart_config_creation() {
34 use crate::spec::VisualizeSpec;
35
36 let visualize: VisualizeSpec = serde_yaml::from_str(
37 r#"
38 type: bar
39 columns: month
40 rows: revenue
41 "#,
42 )
43 .unwrap();
44
45 let config = ChartConfig {
46 visualize,
47 title: Some("Test Chart".to_string()),
48 width: 800.0,
49 height: 600.0,
50 colors: vec!["#ff0000".to_string(), "#00ff00".to_string()],
51 };
52 assert_eq!(config.title, Some("Test Chart".to_string()));
53 assert_eq!(config.width, 800.0);
54 assert_eq!(config.height, 600.0);
55 assert_eq!(config.colors.len(), 2);
56 }
57
58 #[test]
59 fn test_transform_result_creation() {
60 use crate::data::DataTable;
61
62 let mut metadata = HashMap::new();
63 metadata.insert("row_count".to_string(), serde_json::json!(5));
64
65 let result = TransformResult {
66 data: DataTable::from_rows(&[]).unwrap(),
67 metadata,
68 };
69 assert!(result.data.is_empty());
70 assert_eq!(result.metadata.len(), 1);
71 assert_eq!(result.metadata["row_count"], serde_json::json!(5));
72 }
73
74 #[test]
75 fn test_fetch_options_default() {
76 let options = FetchOptions::default();
77 assert!(options.cache_ttl.is_none());
78 }
79}