Improve INSERT tests

De-duplicate and check for specific error in `parse_insert_invalid`.
This commit is contained in:
Nickolay Ponomarev 2019-05-02 20:05:12 +03:00
parent d58bbb8f9f
commit fe635350f0

View file

@ -21,77 +21,44 @@ fn test_prev_index() {
} }
#[test] #[test]
fn parse_simple_insert() { fn parse_insert_values() {
let sql = String::from("INSERT INTO customer VALUES(1, 2, 3)"); let sql = "INSERT INTO customer VALUES(1, 2, 3)";
match verified_stmt(&sql) { check_one(sql, "customer", vec![]);
SQLStatement::SQLInsert {
table_name,
columns,
values,
..
} => {
assert_eq!(table_name.to_string(), "customer");
assert!(columns.is_empty());
assert_eq!(
vec![vec![
ASTNode::SQLValue(Value::Long(1)),
ASTNode::SQLValue(Value::Long(2)),
ASTNode::SQLValue(Value::Long(3))
]],
values
);
}
_ => unreachable!(),
}
}
#[test] let sql = "INSERT INTO public.customer VALUES(1, 2, 3)";
fn parse_common_insert() { check_one(sql, "public.customer", vec![]);
let sql = String::from("INSERT INTO public.customer VALUES(1, 2, 3)");
match verified_stmt(&sql) {
SQLStatement::SQLInsert {
table_name,
columns,
values,
..
} => {
assert_eq!(table_name.to_string(), "public.customer");
assert!(columns.is_empty());
assert_eq!(
vec![vec![
ASTNode::SQLValue(Value::Long(1)),
ASTNode::SQLValue(Value::Long(2)),
ASTNode::SQLValue(Value::Long(3))
]],
values
);
}
_ => unreachable!(),
}
}
#[test] let sql = "INSERT INTO db.public.customer VALUES(1, 2, 3)";
fn parse_complex_insert() { check_one(sql, "db.public.customer", vec![]);
let sql = String::from("INSERT INTO db.public.customer VALUES(1, 2, 3)");
match verified_stmt(&sql) { let sql = "INSERT INTO public.customer (id, name, active) VALUES(1, 2, 3)";
SQLStatement::SQLInsert { check_one(
table_name, sql,
columns, "public.customer",
values, vec!["id".to_string(), "name".to_string(), "active".to_string()],
.. );
} => {
assert_eq!(table_name.to_string(), "db.public.customer"); fn check_one(sql: &str, expected_table_name: &str, expected_columns: Vec<String>) {
assert!(columns.is_empty()); match verified_stmt(sql) {
assert_eq!( SQLStatement::SQLInsert {
vec![vec![ table_name,
ASTNode::SQLValue(Value::Long(1)), columns,
ASTNode::SQLValue(Value::Long(2)), values,
ASTNode::SQLValue(Value::Long(3)) ..
]], } => {
values assert_eq!(table_name.to_string(), expected_table_name);
); assert_eq!(columns, expected_columns);
assert_eq!(
vec![vec![
ASTNode::SQLValue(Value::Long(1)),
ASTNode::SQLValue(Value::Long(2)),
ASTNode::SQLValue(Value::Long(3))
]],
values
);
}
_ => unreachable!(),
} }
_ => unreachable!(),
} }
} }
@ -109,41 +76,14 @@ fn parse_no_table_name() {
assert!(ast.is_err()); assert!(ast.is_err());
} }
#[test]
fn parse_insert_with_columns() {
let sql = String::from("INSERT INTO public.customer (id, name, active) VALUES(1, 2, 3)");
match verified_stmt(&sql) {
SQLStatement::SQLInsert {
table_name,
columns,
values,
..
} => {
assert_eq!(table_name.to_string(), "public.customer");
assert_eq!(
columns,
vec!["id".to_string(), "name".to_string(), "active".to_string()]
);
assert_eq!(
vec![vec![
ASTNode::SQLValue(Value::Long(1)),
ASTNode::SQLValue(Value::Long(2)),
ASTNode::SQLValue(Value::Long(3))
]],
values
);
}
_ => unreachable!(),
}
}
#[test] #[test]
fn parse_insert_invalid() { fn parse_insert_invalid() {
let sql = String::from("INSERT public.customer (id, name, active) VALUES (1, 2, 3)"); let sql = "INSERT public.customer (id, name, active) VALUES (1, 2, 3)";
match Parser::parse_sql(&PostgreSqlDialect {}, sql) { let res = parse_sql_statements(sql);
Err(_) => {} assert_eq!(
_ => unreachable!(), ParserError::ParserError("Expected INTO, found: public".to_string()),
} res.unwrap_err()
);
} }
#[test] #[test]