#![cfg(feature = "sqlite-vec")]
#![allow(clippy::expect_used, clippy::panic)]
use fathomdb::admin_ffi::{configure_embedding_json, configure_vec_kind_json};
use fathomdb::{Engine, EngineOptions};
use serde_json::Value;
use tempfile::TempDir;
fn open_engine() -> (TempDir, Engine) {
let dir = tempfile::tempdir().expect("tempdir");
let mut opts = EngineOptions::new(dir.path().join("test.db"));
opts.vector_dimension = Some(4);
let engine = Engine::open(opts).expect("engine opens");
(dir, engine)
}
#[test]
fn test_configure_embedding_json_activates_profile() {
let (_dir, engine) = open_engine();
let req = r#"{
"model_identity": "test-model",
"model_version": "1",
"dimensions": 4,
"normalization_policy": "none",
"max_tokens": 512,
"acknowledge_rebuild_impact": false
}"#;
let json = configure_embedding_json(&engine, req).expect("configure_embedding_json");
let v: Value = serde_json::from_str(&json).expect("parse outcome");
let outcome = v["outcome"].as_str().expect("outcome field");
assert!(
matches!(outcome, "activated" | "unchanged" | "replaced"),
"unexpected outcome: {outcome}"
);
}
#[test]
fn test_configure_vec_kind_json_chunks_roundtrip() {
let (_dir, engine) = open_engine();
let emb_req = r#"{
"model_identity": "test-model",
"model_version": "1",
"dimensions": 4,
"max_tokens": 512
}"#;
configure_embedding_json(&engine, emb_req).expect("configure_embedding_json");
let req = r#"{"kind": "KnowledgeItem", "source": "chunks"}"#;
let json = configure_vec_kind_json(&engine, req).expect("configure_vec_kind_json");
let v: Value = serde_json::from_str(&json).expect("parse outcome");
assert_eq!(v["kind"], "KnowledgeItem");
assert!(v.get("enqueued_backfill_rows").is_some());
assert!(v.get("was_already_enabled").is_some());
}
#[test]
fn test_configure_vec_kind_json_rejects_invalid_source() {
let (_dir, engine) = open_engine();
let req = r#"{"kind": "K", "source": "bogus"}"#;
let err = configure_vec_kind_json(&engine, req).expect_err("should reject bogus source");
let msg = format!("{err:?}");
assert!(
msg.contains("unsupported vector source mode") || msg.to_lowercase().contains("bogus"),
"unexpected error: {msg}"
);
}