use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct MeituanConvertResponse {
#[serde(default)]
pub status: Option<i32>,
#[serde(default)]
pub des: Option<String>,
#[serde(default)]
pub data: Option<String>,
#[serde(default, rename = "wx_mini_pic")]
pub wx_mini_pic: Option<String>,
#[serde(default, rename = "qrcode_chang_pic")]
pub qrcode_chang_pic: Option<String>,
#[serde(default, rename = "qrcode_wx_pic")]
pub qrcode_wx_pic: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct MeituanOrderResponse {
#[serde(default)]
pub status: Option<i32>,
#[serde(default)]
pub content: Option<Vec<MeituanOrderInfo>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct MeituanOrderInfo {
#[serde(default)]
pub code: Option<String>,
#[serde(default)]
pub account: Option<String>,
#[serde(default)]
pub appkey_ztk: Option<String>,
#[serde(default)]
pub sid: Option<String>,
#[serde(default)]
pub is_jiesuan: Option<String>,
#[serde(default)]
pub jiesuan_time: Option<String>,
#[serde(default)]
pub jiesuan_profit: Option<String>,
#[serde(default)]
pub orderid: Option<String>,
#[serde(default)]
pub paytime: Option<String>,
#[serde(default)]
pub payprice: Option<String>,
#[serde(default)]
pub profit: Option<f64>,
#[serde(default)]
pub smstitle: Option<String>,
#[serde(default)]
pub refundprice: Option<f64>,
#[serde(default)]
pub refundtime: Option<String>,
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub update_time: Option<String>,
#[serde(default, rename = "type")]
pub order_type: Option<String>,
#[serde(default)]
pub sid_ztk: Option<String>,
#[serde(default)]
pub customer_id_ztk: Option<String>,
#[serde(default)]
pub platform_ztk: Option<String>,
#[serde(default, rename = "actId")]
pub act_id: Option<String>,
#[serde(default, rename = "businessLine")]
pub business_line: Option<String>,
#[serde(default, rename = "subBusinessLine")]
pub sub_business_line: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_meituan_convert_response_deserialize() {
let json = r#"{
"status": 0,
"des": "推广链接生成成功",
"data": "https://click.meituan.com/t?t=1&c=1&p=OWMpZ-uzIFOVe6JyOONs3dXuqV0qcAf-r-KCvH",
"wx_mini_pic": "http://p0.meituan.net/poiqrcode/b407b0c4346e854c4468a704ab42f156103581.jpg",
"qrcode_chang_pic": "http://www.zhetaoke.com/uploads_qrcode/20210429/20210429449433.jpg",
"qrcode_wx_pic": "http://www.zhetaoke.com/uploads_qrcode/20210429/2021047444942.jpg"
}"#;
let response: MeituanConvertResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.status, Some(0));
assert_eq!(response.des, Some("推广链接生成成功".to_string()));
assert!(response.data.is_some());
assert!(response.wx_mini_pic.is_some());
}
#[test]
fn test_meituan_order_response_deserialize() {
let json = r#"{
"status": 200,
"content": [
{
"code": "15",
"account": "test@example.com",
"appkey_ztk": "a2a33cacfb1f4005b818ffd0ab7c951d",
"sid": "16ztkzheta",
"is_jiesuan": "0",
"jiesuan_time": "",
"jiesuan_profit": "1.16",
"orderid": "105518514197820013",
"paytime": "2021/04/27 12:22:09",
"payprice": "21.50",
"profit": 1.29,
"smstitle": "霸碗盖码饭(凤凰大厦店)",
"refundprice": 0,
"refundtime": "",
"status": "8",
"update_time": "",
"type": "4",
"sid_ztk": "16",
"customer_id_ztk": "100000",
"platform_ztk": "zhetaoke",
"actId": "33",
"businessLine": "2",
"subBusinessLine": "1"
}
]
}"#;
let response: MeituanOrderResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.status, Some(200));
assert!(response.content.is_some());
let orders = response.content.unwrap();
assert_eq!(orders.len(), 1);
assert_eq!(orders[0].orderid, Some("105518514197820013".to_string()));
assert_eq!(orders[0].profit, Some(1.29));
assert_eq!(orders[0].status, Some("8".to_string()));
assert_eq!(orders[0].order_type, Some("4".to_string()));
}
#[test]
fn test_meituan_convert_response_with_missing_fields() {
let json = r#"{"status": 0, "des": "成功"}"#;
let response: MeituanConvertResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.status, Some(0));
assert!(response.data.is_none());
assert!(response.wx_mini_pic.is_none());
}
#[test]
fn test_meituan_order_response_empty_content() {
let json = r#"{"status": 200, "content": []}"#;
let response: MeituanOrderResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.status, Some(200));
assert!(response.content.is_some());
assert_eq!(response.content.unwrap().len(), 0);
}
#[test]
fn test_meituan_order_info_optional_fields() {
let json = r#"{
"orderid": "123456",
"status": "1"
}"#;
let order: MeituanOrderInfo = serde_json::from_str(json).unwrap();
assert_eq!(order.orderid, Some("123456".to_string()));
assert_eq!(order.status, Some("1".to_string()));
assert!(order.profit.is_none());
assert!(order.act_id.is_none());
}
}