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 #![allow(clippy::unwrap_used)]
15 use super::*;
16 use std::collections::HashMap;
17
18 #[test]
19 fn test_data_spec_creation() {
20 let spec = DataSpec {
21 provider: "inline".to_string(),
22 rows: Some(vec![serde_json::json!({"x": 1})]),
23 url: None,
24 endpoint: None,
25 };
26 assert_eq!(spec.provider, "inline");
27 assert!(spec.rows.is_some());
28 assert_eq!(spec.rows.unwrap().len(), 1);
29 assert!(spec.url.is_none());
30 assert!(spec.endpoint.is_none());
31 }
32
33 #[test]
34 fn test_chart_config_creation() {
35 use crate::spec::VisualizeSpec;
36
37 let visualize: VisualizeSpec = serde_yaml::from_str(
38 r#"
39 type: bar
40 columns: month
41 rows: revenue
42 "#,
43 )
44 .unwrap();
45
46 let config = ChartConfig {
47 visualize,
48 title: Some("Test Chart".to_string()),
49 width: 800.0,
50 height: 600.0,
51 colors: vec!["#ff0000".to_string(), "#00ff00".to_string()],
52 theme: crate::theme::Theme::default(),
53 };
54 assert_eq!(config.title, Some("Test Chart".to_string()));
55 assert_eq!(config.width, 800.0);
56 assert_eq!(config.height, 600.0);
57 assert_eq!(config.colors.len(), 2);
58 }
59
60 #[test]
61 fn test_transform_result_creation() {
62 use crate::data::DataTable;
63
64 let mut metadata = HashMap::new();
65 metadata.insert("row_count".to_string(), serde_json::json!(5));
66
67 let result = TransformResult {
68 data: DataTable::from_rows(&[]).unwrap(),
69 metadata,
70 };
71 assert!(result.data.is_empty());
72 assert_eq!(result.metadata.len(), 1);
73 assert_eq!(result.metadata["row_count"], serde_json::json!(5));
74 }
75
76 #[test]
77 fn test_fetch_options_default() {
78 let options = FetchOptions::default();
79 assert!(options.cache_ttl.is_none());
80 }
81}