#![cfg(feature = "std")]
use graphitesql::Connection;
fn violation(setup: &str, failing: &str) -> String {
let mut c = Connection::open_memory().unwrap();
c.execute_batch(setup).unwrap();
c.execute(failing).unwrap_err().to_string()
}
#[test]
fn names_the_violated_columns() {
assert!(violation(
"CREATE TABLE t(id INTEGER PRIMARY KEY, x); INSERT INTO t VALUES (1, 'a')",
"INSERT INTO t VALUES (1, 'b')",
)
.contains("UNIQUE constraint failed: t.id"));
assert!(violation(
"CREATE TABLE t(a UNIQUE); INSERT INTO t VALUES (1)",
"INSERT INTO t VALUES (1)",
)
.contains("UNIQUE constraint failed: t.a"));
assert!(violation(
"CREATE TABLE t(a PRIMARY KEY); INSERT INTO t VALUES (1)",
"INSERT INTO t VALUES (1)",
)
.contains("UNIQUE constraint failed: t.a"));
assert!(violation(
"CREATE TABLE t(a, b, UNIQUE(a, b)); INSERT INTO t VALUES (1, 2)",
"INSERT INTO t VALUES (1, 2)",
)
.contains("UNIQUE constraint failed: t.a, t.b"));
assert!(violation(
"CREATE TABLE t(a, b); CREATE UNIQUE INDEX ix ON t(b); INSERT INTO t VALUES (1, 9)",
"INSERT INTO t VALUES (2, 9)",
)
.contains("UNIQUE constraint failed: t.b"));
}
#[test]
fn names_columns_for_without_rowid() {
assert!(violation(
"CREATE TABLE t(a TEXT PRIMARY KEY) WITHOUT ROWID; INSERT INTO t VALUES ('x')",
"INSERT INTO t VALUES ('x')",
)
.contains("UNIQUE constraint failed: t.a"));
assert!(violation(
"CREATE TABLE t(a, b, PRIMARY KEY(a, b)) WITHOUT ROWID; INSERT INTO t VALUES (1, 2)",
"INSERT INTO t VALUES (1, 2)",
)
.contains("UNIQUE constraint failed: t.a, t.b"));
}
#[test]
fn names_columns_on_update_conflict() {
let msg = violation(
"CREATE TABLE t(a UNIQUE); INSERT INTO t VALUES (1), (2)",
"UPDATE t SET a = 1 WHERE a = 2",
);
assert!(msg.contains("UNIQUE constraint failed: t.a"), "got: {msg}");
}