sql-bridge 0.2.0

SQL bridge for sqlx-repo
Documentation
use sql_bridge::{Error, MySqlDialect, PostgreSqlDialect, SQLiteDialect, parse};
use sqlparser::ast::ObjectType;

#[test]
fn drop_index() {
    let input = "DROP INDEX idx ON tbl";
    let mut ast = parse(input).unwrap();
    assert!(ast.len() == 1);
    let ast = ast.pop().unwrap();

    assert_eq!(
        ast.to_sql(&MySqlDialect {}).unwrap(),
        "DROP INDEX `idx` ON `tbl`"
    );

    assert_eq!(
        ast.to_sql(&PostgreSqlDialect {}).unwrap(),
        "DROP INDEX \"idx\"",
    );

    assert_eq!(ast.to_sql(&SQLiteDialect {}).unwrap(), "DROP INDEX `idx`",);
}

#[test]
fn drop_multiple_index() {
    let input = "DROP INDEX idx1, idx2";
    let err = parse(input).unwrap_err();
    assert!(
        matches!(
            err,
            Error::Drop {
                reason: "multiple names",
                object_type: None
            }
        ),
        "{:?}",
        err
    );
}

#[test]
fn drop_table() {
    let input = "DROP TABLE test";
    let mut ast = parse(input).unwrap();
    assert!(ast.len() == 1);
    let ast = ast.pop().unwrap();

    assert_eq!(ast.to_sql(&MySqlDialect {}).unwrap(), "DROP TABLE `test`");

    assert_eq!(
        ast.to_sql(&PostgreSqlDialect {}).unwrap(),
        "DROP TABLE \"test\""
    );

    assert_eq!(ast.to_sql(&SQLiteDialect {}).unwrap(), "DROP TABLE `test`");
}

#[test]
fn drop_multiple_table() {
    let input = "DROP TABLE test1, test2";
    let err = parse(input).unwrap_err();
    assert!(matches!(
        err,
        Error::Drop {
            reason: "multiple names",
            object_type: None
        }
    ));
    assert_eq!(err.to_string(), "unsupported drop: multiple names");
}

#[test]
fn drop_index_if_exists() {
    let input = "DROP INDEX IF EXISTS idx ON tbl";
    let mut ast = parse(input).unwrap();
    assert!(ast.len() == 1);
    let ast = ast.pop().unwrap();

    assert_eq!(
        ast.to_sql(&MySqlDialect {}).unwrap(),
        "DROP INDEX IF EXISTS `idx` ON `tbl`"
    );

    assert_eq!(
        ast.to_sql(&PostgreSqlDialect {}).unwrap(),
        "DROP INDEX IF EXISTS \"idx\"",
    );

    assert_eq!(
        ast.to_sql(&SQLiteDialect {}).unwrap(),
        "DROP INDEX IF EXISTS `idx`",
    );
}

#[test]
fn drop_table_if_exists() {
    let input = "DROP TABLE IF EXISTS test";
    let mut ast = parse(input).unwrap();
    assert!(ast.len() == 1);
    let ast = ast.pop().unwrap();

    assert_eq!(
        ast.to_sql(&MySqlDialect {}).unwrap(),
        "DROP TABLE IF EXISTS `test`"
    );

    assert_eq!(
        ast.to_sql(&PostgreSqlDialect {}).unwrap(),
        "DROP TABLE IF EXISTS \"test\""
    );

    assert_eq!(
        ast.to_sql(&SQLiteDialect {}).unwrap(),
        "DROP TABLE IF EXISTS `test`"
    );
}

#[test]
fn drop_index_no_table_name() {
    let input = "DROP INDEX foo_idx";
    let err = parse(input).unwrap_err();
    assert!(matches!(
        err,
        Error::DropIndex {
            reason: "table name required",
        }
    ));
    assert_eq!(
        err.to_string(),
        "unsupported drop index: table name required"
    )
}

#[test]
fn drop_view() {
    let input = "DROP VIEW foo_view";
    let err = parse(input).unwrap_err();
    assert!(
        matches!(
            err,
            Error::Drop {
                reason: "object type",
                object_type: Some(ObjectType::View)
            }
        ),
        "{err:?}",
    );
    assert_eq!(err.to_string(), "unsupported drop: object type View")
}