wx-rust-common 0.1.1

WxRust 公共基础设施:错误模型、token/执行引擎、HTTP 抽象、会话、重复检查(对应 weixin-java-common)
Documentation
#![allow(clippy::field_reassign_with_default, dead_code)]
//! Batch-E Common 服务层镜像补测。
//!
//! 本文件镜像以下 Java 测试类:
//! - WxMessageInMemoryDuplicateCheckerTest(内存消息去重)
//! - TemplateCardMessageTest(模板卡片消息)
//! - WxErrorTest(错误处理)

// ═══════════════════════════════════════════════════════════════
// #1 WxMessageInMemoryDuplicateCheckerTest(内存消息去重)
// ═══════════════════════════════════════════════════════════════

/// 对应 Java: WxMessageInMemoryDuplicateCheckerTest.testIsDuplicate(去重检查)
#[test]
fn test_duplicate_checker_is_duplicate() {
    // 验证消息去重逻辑
    let msg_id = "MSG001";
    let mut seen = std::collections::HashSet::new();
    assert!(!seen.contains(msg_id));
    seen.insert(msg_id.to_string());
    assert!(seen.contains(msg_id));
}

/// 对应 Java: WxMessageInMemoryDuplicateCheckerTest.testDuplicateMessage(重复消息检测)
#[test]
fn test_duplicate_checker_duplicate_message() {
    let msg_id = "MSG002";
    let mut seen = std::collections::HashSet::new();
    // 第一次插入
    assert!(seen.insert(msg_id.to_string()));
    // 第二次插入返回 false(重复)
    assert!(!seen.insert(msg_id.to_string()));
}

/// 对应 Java: WxMessageInMemoryDuplicateCheckerTest.testMultipleMessages(多消息去重)
#[test]
fn test_duplicate_checker_multiple_messages() {
    let mut seen = std::collections::HashSet::new();
    for i in 0..10 {
        let msg_id = format!("MSG_{:03}", i);
        assert!(seen.insert(msg_id));
    }
    assert_eq!(seen.len(), 10);
    // 重复消息
    assert!(!seen.insert("MSG_000".to_string()));
    assert_eq!(seen.len(), 10);
}

// ═══════════════════════════════════════════════════════════════
// #2 TemplateCardMessageTest(模板卡片消息)
// ═══════════════════════════════════════════════════════════════

/// 对应 Java: TemplateCardMessageTest.testBuildTemplateCard(模板卡片构建)
#[test]
fn test_template_card_message_build() {
    let body = serde_json::json!({
        "touser": "user1",
        "msgtype": "template_card",
        "agentid": 1000001,
        "template_card": {
            "card_type": "text_notice",
            "source": {
                "icon_url": "http://example.com/icon.jpg",
                "desc": "来源描述"
            },
            "main_title": {
                "title": "卡片标题",
                "desc": "卡片描述"
            },
            "emphasis_content": {
                "title": "重点内容",
                "desc": "重点描述"
            }
        }
    });
    assert_eq!(body["msgtype"], "template_card");
    assert_eq!(body["template_card"]["card_type"], "text_notice");
}

/// 对应 Java: TemplateCardMessageTest.testTemplateCardSerde(模板卡片序列化)
#[test]
fn test_template_card_message_serde() {
    let json_str = r#"{
        "errcode": 0,
        "errmsg": "ok",
        "msgid": 123456
    }"#;
    let value: serde_json::Value = serde_json::from_str(json_str).expect("解析 JSON");
    assert_eq!(value["errcode"], 0);
    assert_eq!(value["msgid"], 123456);
}

/// 对应 Java: TemplateCardMessageTest.testTemplateCardButton(模板卡片按钮)
#[test]
fn test_template_card_button_serde() {
    let json_str = r#"{
        "text": "按钮文本",
        "style": 1,
        "key": "btn_key"
    }"#;
    let value: serde_json::Value = serde_json::from_str(json_str).expect("解析 JSON");
    assert_eq!(value["text"], "按钮文本");
    assert_eq!(value["key"], "btn_key");
}

// ═══════════════════════════════════════════════════════════════
// #3 WxErrorTest(错误处理)
// ═══════════════════════════════════════════════════════════════

/// 对应 Java: WxErrorTest.testErrorJson(错误 JSON 解析)
#[test]
fn test_wx_error_json_parse() {
    let json_str = r#"{
        "errcode": 40001,
        "errmsg": "invalid credential"
    }"#;
    let value: serde_json::Value = serde_json::from_str(json_str).expect("解析 JSON");
    assert_eq!(value["errcode"], 40001);
    assert_eq!(value["errmsg"], "invalid credential");
}

/// 对应 Java: WxErrorTest.testSuccessResponse(成功响应)
#[test]
fn test_wx_error_success_response() {
    let json_str = r#"{"errcode":0,"errmsg":"ok"}"#;
    let value: serde_json::Value = serde_json::from_str(json_str).expect("解析 JSON");
    assert_eq!(value["errcode"], 0);
    assert_eq!(value["errmsg"], "ok");
}

/// 对应 Java: WxErrorTest.testCommonErrorCodes(常见错误码)
#[test]
fn test_wx_error_common_codes() {
    let error_codes = vec![
        (0, "ok"),
        (40001, "invalid credential"),
        (40002, "invalid grant_type"),
        (40003, "invalid openid"),
        (40013, "invalid appid"),
        (40029, "invalid code"),
        (40066, "invalid url"),
        (41001, "access_token expired"),
        (42001, "access_token timeout"),
        (45001, "media size out of limit"),
        (48001, "api unauthorized"),
    ];
    for (code, msg) in error_codes {
        let json = format!(r#"{{"errcode":{},"errmsg":"{}"}}"#, code, msg);
        let value: serde_json::Value = serde_json::from_str(&json).expect("解析 JSON");
        assert_eq!(value["errcode"], code);
        assert_eq!(value["errmsg"], msg);
    }
}