#![cfg(feature = "slow-tests")]
use assert_cmd::Command;
use serde_json::Value;
use serial_test::serial;
use tempfile::TempDir;
#[path = "common/mod.rs"]
mod common;
fn sgr_cmd() -> Command {
let mock_dir = common::mock_llm_path();
let mut c = Command::cargo_bin("sqlite-graphrag").expect("sqlite-graphrag binary not found");
c.env("PATH", common::prepend_path(&mock_dir));
c
}
fn cmd_base(tmp: &TempDir) -> Command {
let mut c = sgr_cmd();
c.env("SQLITE_GRAPHRAG_DB_PATH", tmp.path().join("test.sqlite"));
c.env("SQLITE_GRAPHRAG_CACHE_DIR", tmp.path().join("cache"));
c.env("SQLITE_GRAPHRAG_LOG_LEVEL", "error");
c.arg("--skip-memory-guard");
c
}
#[test]
#[serial]
fn llm_backend_none_without_embedding_aborts_exit11() {
let tmp = TempDir::new().expect("tempdir");
let assert = cmd_base(&tmp)
.arg("remember")
.arg("--name")
.arg("smoke-none")
.arg("--type")
.arg("note")
.arg("--description")
.arg("BUG-11 none backend")
.arg("--body")
.arg("body without LLM call")
.arg("--llm-backend")
.arg("none")
.arg("--json")
.assert()
.failure()
.code(11);
let stderr = String::from_utf8_lossy(&assert.get_output().stderr).to_string();
assert!(
stderr.contains("no LLM backends available"),
"expected the BUG-11 fallback-exhausted guard, got stderr: {stderr}"
);
}
#[test]
#[serial]
fn llm_backend_codex_is_accepted_on_command_line() {
let tmp = TempDir::new().expect("tempdir");
let out = cmd_base(&tmp)
.arg("remember")
.arg("--name")
.arg("smoke-codex")
.arg("--type")
.arg("note")
.arg("--description")
.arg("GAP-003 codex backend")
.arg("--body")
.arg("body via mock codex")
.arg("--llm-backend")
.arg("codex")
.arg("--json")
.output()
.expect("invoke");
let stdout = String::from_utf8_lossy(&out.stdout);
let parsed: Result<Value, _> = serde_json::from_str(&stdout);
assert!(parsed.is_ok(), "stdout must be valid JSON, got: {stdout}");
}
#[test]
#[serial]
fn llm_backend_none_via_env_var_aborts() {
let tmp = TempDir::new().expect("tempdir");
let assert = cmd_base(&tmp)
.env("SQLITE_GRAPHRAG_LLM_BACKEND", "none")
.arg("remember")
.arg("--name")
.arg("smoke-env-none")
.arg("--type")
.arg("note")
.arg("--description")
.arg("BUG-11 env override")
.arg("--body")
.arg("body via env var")
.arg("--json")
.assert()
.failure()
.code(11);
let stderr = String::from_utf8_lossy(&assert.get_output().stderr).to_string();
assert!(
stderr.contains("no LLM backends available"),
"expected the BUG-11 fallback-exhausted guard, got stderr: {stderr}"
);
}
#[test]
#[serial]
fn llm_backend_rejects_unknown_value() {
let tmp = TempDir::new().expect("tempdir");
cmd_base(&tmp)
.arg("remember")
.arg("--name")
.arg("smoke-invalid")
.arg("--type")
.arg("note")
.arg("--description")
.arg("GAP-003 invalid value")
.arg("--body")
.arg("x")
.arg("--llm-backend")
.arg("totally-bogus")
.arg("--json")
.assert()
.failure()
.code(2);
}