use grex_mcp::tools::sync::SyncParams;
use serde_json::json;
use std::path::PathBuf;
fn params_with(pack: Option<&str>, workspace: Option<&str>) -> SyncParams {
let mut obj = serde_json::Map::new();
obj.insert("packRoot".into(), json!("/tmp/grex-mcp-sync-pack-fixture"));
if let Some(p) = pack {
obj.insert("pack".into(), json!(p));
}
if let Some(w) = workspace {
obj.insert("workspace".into(), json!(w));
}
serde_json::from_value(serde_json::Value::Object(obj))
.expect("SyncParams deserialises from camelCase JSON")
}
fn resolved(p: &SyncParams) -> Option<PathBuf> {
p.pack.clone().or_else(|| p.workspace.clone())
}
#[test]
fn mcp_sync_pack_field_overrides_workspace() {
let p = params_with(Some("/tmp/grex-pack-wins"), Some("/tmp/grex-workspace-loses"));
assert_eq!(
resolved(&p),
Some(PathBuf::from("/tmp/grex-pack-wins")),
"v1.3.0 precedence: `pack` MUST override `workspace` when both are present"
);
}
#[test]
fn mcp_sync_pack_only_resolves_to_pack() {
let p = params_with(Some("/tmp/grex-pack-only"), None);
assert_eq!(
resolved(&p),
Some(PathBuf::from("/tmp/grex-pack-only")),
"v1.3.0: `pack` alone MUST resolve to the pack value"
);
}
#[test]
fn mcp_sync_workspace_only_resolves_to_workspace_back_compat() {
let p = params_with(None, Some("/tmp/grex-workspace-back-compat"));
assert_eq!(
resolved(&p),
Some(PathBuf::from("/tmp/grex-workspace-back-compat")),
"v1.3.0 back-compat: `workspace` alone MUST still resolve (pre-v1.3.0 callers)"
);
}
#[test]
fn mcp_sync_neither_resolves_to_none() {
let p = params_with(None, None);
assert_eq!(resolved(&p), None, "v1.3.0: neither field present MUST resolve to None");
}