darq 0.1.0

darq CLI + TUI — autonomous issue → PR pipeline with SAT and a learning loop.
Documentation
//! Integration tests for daemon JSON-RPC protocol.
//!
//! Tests verify serialization, deserialization, and roundtrip behavior
//! of Request/Response types without requiring a running daemon.

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"),
    }
}