mod common;
use common::graph;
use graphrefly_core::HandleId;
use serde_json::json;
#[test]
fn tag_factory_surfaces_factory_and_factory_args_at_top_of_describe() {
let (rt, g) = graph("root");
g.state(rt.core(), "a", Some(HandleId::new(1))).unwrap();
g.tag_factory(
"rateLimiter",
Some(json!({ "maxBuffer": 10, "mode": "shrink" })),
);
let d = g.describe(rt.core());
assert_eq!(d.factory.as_deref(), Some("rateLimiter"));
assert_eq!(
d.factory_args,
Some(json!({ "maxBuffer": 10, "mode": "shrink" }))
);
}
#[test]
fn second_call_without_args_clears_stale_args() {
let (rt, g) = graph("root");
g.state(rt.core(), "a", Some(HandleId::new(1))).unwrap();
g.tag_factory("rateLimiter", Some(json!({ "x": 1 })));
let d1 = g.describe(rt.core());
assert_eq!(d1.factory.as_deref(), Some("rateLimiter"));
assert_eq!(d1.factory_args, Some(json!({ "x": 1 })));
g.tag_factory("circuitBreaker", None);
let d2 = g.describe(rt.core());
assert_eq!(d2.factory.as_deref(), Some("circuitBreaker"));
assert_eq!(d2.factory_args, None);
}
#[test]
fn cold_call_without_args_omits_factory_args_key_from_json() {
let (rt, g) = graph("root");
g.state(rt.core(), "a", Some(HandleId::new(1))).unwrap();
g.tag_factory("compileSpec", None);
let d = g.describe(rt.core());
assert_eq!(d.factory.as_deref(), Some("compileSpec"));
assert_eq!(d.factory_args, None);
let json_str = serde_json::to_string(&d).unwrap();
assert!(
!json_str.contains("\"factoryArgs\""),
"factoryArgs key should be omitted (skip_serializing_if), got: {json_str}"
);
assert!(
json_str.contains("\"factory\":\"compileSpec\""),
"factory key should be present, got: {json_str}"
);
}
#[test]
fn cold_describe_before_any_tag_factory_omits_both_keys() {
let (rt, g) = graph("root");
g.state(rt.core(), "a", Some(HandleId::new(1))).unwrap();
let d = g.describe(rt.core());
assert!(d.factory.is_none());
assert!(d.factory_args.is_none());
let json_str = serde_json::to_string(&d).unwrap();
assert!(!json_str.contains("\"factory\""));
assert!(!json_str.contains("\"factoryArgs\""));
}
#[test]
fn json_uses_camel_case_factory_args_key() {
let (rt, g) = graph("root");
g.tag_factory("foo", Some(json!({ "k": "v" })));
let d = g.describe(rt.core());
let json_str = serde_json::to_string(&d).unwrap();
assert!(
json_str.contains("\"factoryArgs\""),
"JSON should use camelCase `factoryArgs`, got: {json_str}"
);
assert!(
!json_str.contains("\"factory_args\""),
"JSON should NOT use snake_case `factory_args`, got: {json_str}"
);
}