sqrust-rules 0.1.4

Fast SQL linter written in Rust — the Ruff for SQL
Documentation
use sqrust_core::FileContext;
use sqrust_core::Rule;
use sqrust_rules::lint::duplicate_condition::DuplicateCondition;

fn check(sql: &str) -> Vec<sqrust_core::Diagnostic> {
    let ctx = FileContext::from_source(sql, "test.sql");
    DuplicateCondition.check(&ctx)
}

#[test]
fn rule_name_is_correct() {
    assert_eq!(DuplicateCondition.name(), "Lint/DuplicateCondition");
}

#[test]
fn no_duplicate_no_violation() {
    let sql = "SELECT * FROM t WHERE a = 1 AND b = 2";
    let diags = check(sql);
    assert!(diags.is_empty());
}

#[test]
fn duplicate_and_condition_one_violation() {
    let sql = "SELECT * FROM t WHERE a = 1 AND b = 2 AND a = 1";
    let diags = check(sql);
    assert_eq!(diags.len(), 1);
}

#[test]
fn duplicate_or_condition_one_violation() {
    let sql = "SELECT * FROM t WHERE a = 1 OR b = 2 OR a = 1";
    let diags = check(sql);
    assert_eq!(diags.len(), 1);
}

#[test]
fn case_insensitive_duplicate_flagged() {
    let sql = "SELECT * FROM t WHERE A = 1 AND a = 1";
    let diags = check(sql);
    assert_eq!(diags.len(), 1);
}

#[test]
fn whitespace_normalized_duplicate_flagged() {
    let sql = "SELECT * FROM t WHERE a  =  1 AND a = 1";
    let diags = check(sql);
    assert_eq!(diags.len(), 1);
}

#[test]
fn no_duplicate_different_values_no_violation() {
    let sql = "SELECT * FROM t WHERE a = 1 AND a = 2";
    let diags = check(sql);
    assert!(diags.is_empty());
}

#[test]
fn single_condition_no_violation() {
    let sql = "SELECT * FROM t WHERE a = 1";
    let diags = check(sql);
    assert!(diags.is_empty());
}

#[test]
fn no_where_clause_no_violation() {
    let sql = "SELECT 1";
    let diags = check(sql);
    assert!(diags.is_empty());
}

#[test]
fn duplicate_in_having_flagged() {
    let sql = "SELECT dept, COUNT(*) FROM emp GROUP BY dept HAVING count(*) > 0 AND count(*) > 0";
    let diags = check(sql);
    assert_eq!(diags.len(), 1);
}

#[test]
fn message_mentions_duplicate() {
    let sql = "SELECT * FROM t WHERE a = 1 AND a = 1";
    let diags = check(sql);
    assert_eq!(diags.len(), 1);
    assert!(
        diags[0].message.to_lowercase().contains("duplicate"),
        "message should mention 'duplicate': {}",
        diags[0].message
    );
}

#[test]
fn line_nonzero() {
    let sql = "SELECT * FROM t WHERE a = 1 AND a = 1";
    let diags = check(sql);
    assert_eq!(diags.len(), 1);
    assert!(diags[0].line >= 1);
}

#[test]
fn col_nonzero() {
    let sql = "SELECT * FROM t WHERE a = 1 AND a = 1";
    let diags = check(sql);
    assert_eq!(diags.len(), 1);
    assert!(diags[0].col >= 1);
}