use rusqlite::{Connection, params};
use sqlite_err_parser::{InterpretedError, deconstruct_error};
#[test]
fn primary() {
let conn = Connection::open_in_memory().unwrap();
conn
.execute(
"CREATE TABLE agents (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL
)",
()
)
.unwrap();
conn
.execute(
"INSERT INTO agents (id, name) VALUES (?, ?)",
params![1, "frank"]
)
.unwrap();
let Err(err) = conn.execute(
"INSERT INTO agents (id, name) VALUES (?, ?)",
params![1, "bill"]
) else {
panic!("Unexpectedly not Err()");
};
let Some(InterpretedError::NotUnique(v)) = deconstruct_error(&err) else {
panic!("Not treated as InterpretedError::NotUnique(); {err}");
};
assert_eq!(&v, &[("agents", "id")]);
}
#[test]
fn simple_name() {
let conn = Connection::open_in_memory().unwrap();
conn
.execute(
"CREATE TABLE agents (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL
)",
()
)
.unwrap();
conn
.execute("INSERT INTO agents (name) VALUES (?)", ["frank"])
.unwrap();
let Err(err) =
conn.execute("INSERT INTO agents (name) VALUES (?)", ["frank"])
else {
panic!("Unexpectedly not Err()");
};
let Some(InterpretedError::NotUnique(v)) = deconstruct_error(&err) else {
panic!("Not treated as InterpretedError::NotUnique(); {err}");
};
assert_eq!(&v, &[("agents", "name")]);
}
#[test]
fn pair() {
let conn = Connection::open_in_memory().unwrap();
conn
.execute(
"CREATE TABLE agents (
id INTEGER PRIMARY KEY,
role TEXT NOT NULL,
name TEXT NOT NULL,
UNIQUE(role,name)
)",
()
)
.unwrap();
conn
.execute(
"INSERT INTO agents (role,name) VALUES (?, ?)",
["janitor", "frank"]
)
.unwrap();
let Err(err) = conn.execute(
"INSERT INTO agents (role,name) VALUES (?, ?)",
["janitor", "frank"]
) else {
panic!("Unexpectedly not Err()");
};
let Some(InterpretedError::NotUnique(v)) = deconstruct_error(&err) else {
panic!("Not treated as InterpretedError::NotUnique(); {err}");
};
assert_eq!(&v, &[("agents", "name"), ("agents", "role")]);
}