use darq::daemon::protocol::{Method, Request, Response};
#[test]
fn test_workflow_chain_request_serializes() {
let req = Request {
id: "test-001".into(),
method: Method::WorkflowChain,
params: serde_json::json!({
"issue_number": 42,
"start_workflow": "plan_issue"
}),
};
let json = serde_json::to_string(&req).unwrap();
assert!(json.contains("\"method\":\"workflow_chain\""));
assert!(json.contains("\"id\":\"test-001\""));
assert!(json.contains("42"));
let parsed: Request = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.method, Method::WorkflowChain);
assert_eq!(parsed.id, "test-001");
}
#[test]
fn test_sweep_request_serializes() {
let req = Request {
id: "test-002".into(),
method: Method::Sweep,
params: serde_json::json!({
"milestone": "v1.0",
"dry_run": false
}),
};
let json = serde_json::to_string(&req).unwrap();
assert!(json.contains("\"method\":\"sweep\""));
assert!(json.contains("\"id\":\"test-002\""));
assert!(json.contains("v1.0"));
let parsed: Request = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.method, Method::Sweep);
assert_eq!(parsed.params["milestone"], "v1.0");
}
#[test]
fn test_all_methods_roundtrip() {
let methods = [
Method::Status,
Method::RunList,
Method::RunShow,
Method::RunApprove,
Method::RunCancel,
Method::WorkflowStart,
Method::WorkflowChain,
Method::Sweep,
Method::Subscribe,
Method::Stats,
Method::Shutdown,
];
for method in methods {
let req = Request {
id: "roundtrip-test".into(),
method,
params: serde_json::json!({}),
};
let json = serde_json::to_string(&req).unwrap();
let parsed: Request = serde_json::from_str(&json).unwrap();
assert_eq!(
parsed.method, method,
"method roundtrip failed for {:?}",
method
);
assert_eq!(parsed.id, "roundtrip-test");
}
}
#[test]
fn test_response_success_roundtrip() {
let resp = Response::success("resp-001".into(), serde_json::json!({ "running": 3 }));
let json = serde_json::to_string(&resp).unwrap();
let parsed: Response = serde_json::from_str(&json).unwrap();
match parsed {
Response::Success { id, result } => {
assert_eq!(id, "resp-001");
assert_eq!(result["running"], 3);
}
_ => panic!("expected Success variant"),
}
}
#[test]
fn test_response_error_roundtrip() {
let resp = Response::error("resp-002".into(), "workflow not found");
let json = serde_json::to_string(&resp).unwrap();
let parsed: Response = serde_json::from_str(&json).unwrap();
match parsed {
Response::Error { id, error } => {
assert_eq!(id, "resp-002");
assert_eq!(error, "workflow not found");
}
_ => panic!("expected Error variant"),
}
}
#[test]
fn test_request_response_full_exchange() {
let req = Request {
id: "exchange-001".into(),
method: Method::WorkflowChain,
params: serde_json::json!({ "issue_number": 1 }),
};
let req_json = serde_json::to_string(&req).unwrap();
let parsed_req: Request = serde_json::from_str(&req_json).unwrap();
assert_eq!(parsed_req.method, Method::WorkflowChain);
let resp = Response::success(
parsed_req.id.clone(),
serde_json::json!({ "run_id": "abc" }),
);
let resp_json = serde_json::to_string(&resp).unwrap();
let parsed_resp: Response = serde_json::from_str(&resp_json).unwrap();
match parsed_resp {
Response::Success { id, result } => {
assert_eq!(id, "exchange-001");
assert_eq!(result["run_id"], "abc");
}
_ => panic!("expected success response"),
}
}