mod sql_injection {
use tinyquant_pgvector::PgvectorAdapter;
fn validate(name: &str) -> bool {
PgvectorAdapter::new(name).is_ok()
}
#[test]
fn table_name_accepts_valid() {
assert!(validate("users"));
}
#[test]
fn table_name_accepts_underscore_prefix() {
assert!(validate("_my_table"));
}
#[test]
fn table_name_rejects_sql_injection() {
assert!(!validate("users; DROP TABLE users; --"));
}
#[test]
fn table_name_rejects_leading_digit() {
assert!(!validate("1users"));
}
#[test]
fn table_name_rejects_dollar() {
assert!(!validate("u$ers"));
}
#[test]
fn table_name_rejects_too_long() {
let name = "a".repeat(64);
assert!(!validate(&name));
}
#[test]
fn table_name_accepts_max_length() {
let name = "a".repeat(63);
assert!(validate(&name));
}
}
mod wire_format {
use std::sync::Arc;
use tinyquant_core::backend::SearchBackend;
use tinyquant_pgvector::{BackendError, PgvectorAdapter};
#[test]
fn wire_encode_round_trip() {
}
#[test]
fn wire_encode_rejects_nan() {
let mut adapter = PgvectorAdapter::new("test_nan").unwrap();
let id: Arc<str> = Arc::from("nan-vec");
let vec_with_nan = vec![1.0_f32, f32::NAN];
let err = adapter.ingest(&[(id, vec_with_nan)]).unwrap_err();
assert!(
matches!(err, BackendError::Adapter(_)),
"expected Adapter error for NaN, got {err:?}"
);
}
#[test]
fn wire_encode_rejects_inf() {
let mut adapter = PgvectorAdapter::new("test_inf").unwrap();
let id: Arc<str> = Arc::from("inf-vec");
let vec_with_inf = vec![1.0_f32, f32::INFINITY];
let err = adapter.ingest(&[(id, vec_with_inf)]).unwrap_err();
assert!(
matches!(err, BackendError::Adapter(_)),
"expected Adapter error for Inf, got {err:?}"
);
}
}
#[cfg(feature = "test-containers")]
mod integration {
#[test]
fn placeholder_integration_test() {
}
}