use gossan_graph::schema::SCHEMA_VERSION;
use gossan_graph::store::sqlite::SqliteBackend;
use gossan_graph::store::GraphBackend;
use rusqlite::Connection;
use tempfile::TempDir;
#[test]
fn old_schema_version_triggers_migration_to_current() {
let dir = TempDir::new().unwrap();
let path = dir.path().join("graph.sqlite");
{
let mut backend = SqliteBackend::open(&path).expect("first open");
backend.init().expect("init");
}
{
let conn = Connection::open(&path).expect("downgrade open");
conn.execute("DELETE FROM schema_version", [])
.expect("clear");
conn.execute("INSERT INTO schema_version (version) VALUES (0)", [])
.expect("insert v0");
}
let _backend = SqliteBackend::open(&path).expect("reopen-after-downgrade");
let conn = Connection::open(&path).unwrap();
let max_v: i64 = conn
.query_row(
"SELECT version FROM schema_version ORDER BY version DESC LIMIT 1",
[],
|row| row.get(0),
)
.expect("query max version");
assert_eq!(max_v, i64::from(SCHEMA_VERSION));
}
#[test]
fn newer_schema_version_is_rejected() {
let dir = TempDir::new().unwrap();
let path = dir.path().join("graph.sqlite");
{
let mut backend = SqliteBackend::open(&path).expect("first open");
backend.init().expect("init");
}
let conn = Connection::open(&path).unwrap();
conn.execute("DELETE FROM schema_version", []).unwrap();
conn.execute(
"INSERT INTO schema_version (version) VALUES (?1)",
rusqlite::params![SCHEMA_VERSION + 100],
)
.unwrap();
drop(conn);
let r = SqliteBackend::open(&path);
assert!(
r.is_err(),
"opening DB with future schema must fail (refuse to corrupt data)"
);
}