Line data Source code
1 : //! Unit tests of the renderer specs of `@vis` tags.
2 :
3 : use super::*;
4 : use dashql_core::analyzer::analyze;
5 : use dashql_core::catalog::Catalog;
6 : use dashql_buffers::analyzer::{AnalyzerErrorSeverity, AnalyzerErrorType};
7 : use dashql_parser::parser::{parse, ParsedScript};
8 : use dashql_parser::scanner::scan;
9 : use std::sync::Arc;
10 :
11 7 : fn parse_text(catalog: &Catalog, text: &str) -> Arc<ParsedScript> {
12 7 : Arc::new(parse(Arc::new(scan(text, 0, catalog.allocate_entry_id()))))
13 7 : }
14 :
15 7 : fn analyze_text(text: &str) -> AnalyzedScript {
16 7 : let catalog = Catalog::new();
17 7 : analyze(parse_text(&catalog, text), &catalog).unwrap()
18 7 : }
19 :
20 : #[test]
21 1 : fn select_source() {
22 1 : let analyzed = analyze_text("\n/* @vis vegalite {\"mark\": \"bar\"} */\nSELECT * FROM sales WHERE revenue > 0\n");
23 1 : assert!(!analyzed.visualization_specs.is_empty());
24 1 : let json = generate_vegalite_spec(&analyzed.visualization_specs[0], &analyzed);
25 1 : assert!(json.contains("\"$sql\": \"SELECT * FROM sales WHERE revenue > 0\""));
26 1 : assert!(!json.contains("@vis"));
27 1 : }
28 :
29 : #[test]
30 1 : fn normalizes_dashboard_layout_with_warnings() {
31 1 : let analyzed = analyze_text("/* @vis table\n @board row=-1 column=15 width=20 height=0 */\nSELECT 1 AS value");
32 1 : assert!(!analyzed.visualization_specs.is_empty());
33 1 : let dashboard = &analyzed.visualization_specs[0].dashboard;
34 1 : assert_eq!(dashboard.row, None);
35 1 : assert_eq!(dashboard.column, Some(0));
36 1 : assert_eq!(dashboard.width, 12);
37 1 : assert_eq!(dashboard.height, 1);
38 1 : assert_eq!(analyzed.errors.len(), 4);
39 4 : for warning in &analyzed.errors {
40 4 : assert_eq!(warning.error_type, AnalyzerErrorType::INVALID_DASHBOARD_LAYOUT);
41 4 : assert_eq!(warning.severity, AnalyzerErrorSeverity::WARNING);
42 : }
43 1 : }
44 :
45 : #[test]
46 1 : fn accepts_a_board_placement_for_every_renderer() {
47 3 : for renderer in ["vegalite {\"mark\": \"bar\"}", "markdown {{value}}", "table"] {
48 3 : let analyzed = analyze_text(&format!("/* @vis {renderer}\n @board width=7 */\nSELECT 1 AS value"));
49 3 : assert!(!analyzed.visualization_specs.is_empty(), "{renderer}");
50 3 : assert_eq!(analyzed.visualization_specs[0].dashboard.width, 7, "{renderer}");
51 : }
52 1 : }
53 :
54 : #[test]
55 1 : fn compiles_renderer_specs() {
56 1 : let analyzed = analyze_text("/* @vis table */ SELECT 1 AS value");
57 1 : assert!(compile_markdown_spec(&analyzed.visualization_specs[0]).is_none());
58 :
59 1 : let analyzed = analyze_text("/* @vis markdown ## {{product}} */ SELECT 'item' AS product");
60 1 : let spec = &analyzed.visualization_specs[0];
61 1 : let markdown = compile_markdown_spec(spec).unwrap();
62 1 : assert_eq!(markdown.template, "## {{product}}");
63 1 : assert_eq!(markdown.fields, vec!["product"]);
64 1 : assert_eq!(markdown.document.children.len(), 1);
65 1 : }
|