#![allow(clippy::unwrap_used, clippy::expect_used)]
#![allow(clippy::doc_markdown)]
use sqlite_core::{Database, Value};
const DB: &[u8] = include_bytes!("../../tests/data/places.db");
const MOZ_PLACES_ROOT: u32 = 2;
const MOZ_PLACES_COLS: usize = 6;
#[test]
fn header_parses_real_db() {
let db = Database::open(DB.to_vec()).expect("real db header must parse");
let h = db.header();
assert_eq!(h.page_size, 4096, "page size from PRAGMA page_size");
assert_eq!(h.reserved, 0);
}
#[test]
fn rejects_non_sqlite_bytes() {
let err = Database::open(b"not a sqlite file at all, padding..............".to_vec());
assert!(err.is_err());
}
#[test]
fn walks_moz_places_rows_matching_sqlite3() {
let db = Database::open(DB.to_vec()).expect("open");
let rows = db
.read_table(MOZ_PLACES_ROOT, MOZ_PLACES_COLS)
.expect("walk moz_places");
assert_eq!(rows.len(), 5, "five inserted rows");
assert_eq!(rows[0].rowid, 1);
assert_eq!(rows[0].values[0], Value::Integer(1)); assert_eq!(
rows[0].values[1],
Value::Text("https://www.rust-lang.org/".into())
);
assert_eq!(
rows[0].values[2],
Value::Text("Rust Programming Language".into())
);
assert_eq!(rows[0].values[3], Value::Integer(5));
assert_eq!(rows[0].values[4], Value::Integer(1_700_000_000_000_000));
assert_eq!(rows[0].values[5], Value::Real(2000.5));
assert_eq!(rows[1].values[1], Value::Text("https://github.com/".into()));
assert_eq!(rows[1].values[3], Value::Integer(12));
assert_eq!(rows[1].values[5], Value::Integer(5500));
assert_eq!(rows[2].values[2], Value::Text("Hacker News".into()));
assert_eq!(rows[2].values[4], Value::Null);
assert_eq!(rows[2].values[5], Value::Integer(-1));
assert_eq!(rows[3].values[2], Value::Text("SQLite - Wikipedia".into()));
assert_eq!(rows[3].values[3], Value::Integer(1));
assert_eq!(rows[3].values[5], Value::Null);
assert_eq!(rows[4].values[2], Value::Null);
assert_eq!(rows[4].values[3], Value::Integer(0));
assert_eq!(rows[4].values[5], Value::Integer(0));
}
#[test]
fn never_panics_on_truncated_input() {
for len in 0..DB.len().min(4200) {
let bytes = DB[..len].to_vec();
if let Ok(db) = Database::open(bytes) {
let _ = db.read_table(MOZ_PLACES_ROOT, MOZ_PLACES_COLS);
}
}
}