#![allow(clippy::unwrap_used)]
use std::process::Command;
fn cli() -> Command {
Command::new(env!("CARGO_BIN_EXE_fraiseql-cli"))
}
fn confiture_available() -> bool {
Command::new("confiture")
.arg("--version")
.stdout(std::process::Stdio::null())
.stderr(std::process::Stdio::null())
.status()
.is_ok_and(|s| s.success())
}
#[test]
fn migrate_help_exits_zero() {
let out = cli().args(["migrate", "--help"]).output().unwrap();
assert!(out.status.success(), "migrate --help must exit 0");
let text = String::from_utf8_lossy(&out.stdout);
assert!(
text.contains("up") || text.contains("down") || text.contains("status"),
"migrate --help must describe sub-commands; got: {text}"
);
}
#[test]
fn migrate_up_help_exits_zero() {
let out = cli().args(["migrate", "up", "--help"]).output().unwrap();
assert!(out.status.success(), "migrate up --help must exit 0");
}
#[test]
fn migrate_create_help_exits_zero() {
let out = cli().args(["migrate", "create", "--help"]).output().unwrap();
assert!(out.status.success(), "migrate create --help must exit 0");
}
#[test]
fn migrate_up_without_confiture_exits_nonzero() {
if confiture_available() {
return; }
let out = cli()
.args(["migrate", "up", "--database", "postgres://localhost/test"])
.output()
.unwrap();
assert!(!out.status.success(), "migrate up without confiture must exit non-zero");
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("confiture") || stderr.contains("install"),
"error message must mention confiture or install; got: {stderr}"
);
}
#[test]
fn migrate_status_no_database_url_exits_nonzero() {
if confiture_available() {
return; }
let tmp = tempfile::tempdir().unwrap();
let out = cli()
.current_dir(tmp.path())
.args(["migrate", "status"])
.env_remove("DATABASE_URL")
.output()
.unwrap();
assert!(
!out.status.success(),
"migrate status with no URL and no confiture must exit non-zero"
);
}
#[test]
fn migrate_create_without_confiture_exits_nonzero() {
if confiture_available() {
return; }
let tmp = tempfile::tempdir().unwrap();
let out = cli()
.args([
"migrate",
"create",
"add_posts_table",
"--dir",
tmp.path().to_str().unwrap(),
])
.output()
.unwrap();
assert!(!out.status.success(), "migrate create without confiture must exit non-zero");
}
#[test]
fn migrate_reads_database_url_from_toml() {
if confiture_available() {
return; }
let tmp = tempfile::tempdir().unwrap();
std::fs::write(
tmp.path().join("fraiseql.toml"),
"[database]\nurl = \"postgres://localhost/toml_test\"\n",
)
.unwrap();
let out = cli().current_dir(tmp.path()).args(["migrate", "up"]).output().unwrap();
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.contains("No database URL"),
"URL should have been resolved from fraiseql.toml; stderr: {stderr}"
);
}