LCOV - code coverage report
Current view: top level - dashql-core-session/src/visualize - tests.rs Coverage Total Hit
Test: DashQL 915828b Lines: 100.0 % 43 43
Test Date: 2026-11-06 19:30:32

            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 : }
        

Generated by: LCOV version 2.0-1