use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum UserIdType {
#[serde(rename = "open_id")]
OpenId,
#[serde(rename = "user_id")]
UserId,
#[serde(rename = "union_id")]
UnionId,
}
impl UserIdType {
pub fn as_str(&self) -> &str {
match self {
UserIdType::OpenId => "open_id",
UserIdType::UserId => "user_id",
UserIdType::UnionId => "union_id",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DepartmentIdType {
#[serde(rename = "open_department_id")]
OpenDepartmentId,
#[serde(rename = "department_id")]
DepartmentId,
}
impl DepartmentIdType {
pub fn as_str(&self) -> &str {
match self {
DepartmentIdType::OpenDepartmentId => "open_department_id",
DepartmentIdType::DepartmentId => "department_id",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Application {
#[serde(skip_serializing_if = "Option::is_none")]
pub app_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_type: Option<AppType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<AppStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub update_time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AppType {
#[serde(rename = "self_built")]
SelfBuilt,
#[serde(rename = "marketplace")]
Marketplace,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AppStatus {
#[serde(rename = "developing")]
Developing,
#[serde(rename = "published")]
Published,
#[serde(rename = "removed")]
Removed,
#[serde(rename = "disabled")]
Disabled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppVersion {
#[serde(skip_serializing_if = "Option::is_none")]
pub version_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remark: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publish_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<VersionStatus>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum VersionStatus {
#[serde(rename = "developing")]
Developing,
#[serde(rename = "auditing")]
Auditing,
#[serde(rename = "published")]
Published,
#[serde(rename = "rejected")]
Rejected,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppCollaborator {
#[serde(skip_serializing_if = "Option::is_none")]
pub collaborator_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collaborator_type: Option<CollaboratorType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub permissions: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CollaboratorType {
#[serde(rename = "user")]
User,
#[serde(rename = "group")]
Group,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PermissionScope {
#[serde(skip_serializing_if = "Option::is_none")]
pub permission: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub granted: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<AuthStatus>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AuthStatus {
#[serde(rename = "granted")]
Granted,
#[serde(rename = "not_granted")]
NotGranted,
#[serde(rename = "pending")]
Pending,
#[serde(rename = "rejected")]
Rejected,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppAdmin {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub permissions: Option<Vec<AdminPermission>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AdminPermission {
#[serde(rename = "app_management")]
AppManagement,
#[serde(rename = "user_management")]
UserManagement,
#[serde(rename = "permission_management")]
PermissionManagement,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppAvailability {
#[serde(skip_serializing_if = "Option::is_none")]
pub is_visible_to_all: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub visible_list: Option<VisibilityList>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invisible_list: Option<VisibilityList>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VisibilityList {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_list: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_list: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub group_list: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppUsage {
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active_users: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub new_users: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_push_count: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DepartmentUsage {
#[serde(skip_serializing_if = "Option::is_none")]
pub department_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active_users: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_users: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppFeedback {
#[serde(skip_serializing_if = "Option::is_none")]
pub feedback_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub feedback_type: Option<FeedbackType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rating: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<FeedbackStatus>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FeedbackType {
#[serde(rename = "bug")]
Bug,
#[serde(rename = "feature")]
Feature,
#[serde(rename = "other")]
Other,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FeedbackStatus {
#[serde(rename = "pending")]
Pending,
#[serde(rename = "processing")]
Processing,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "closed")]
Closed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppBadge {
#[serde(skip_serializing_if = "Option::is_none")]
pub badge_type: Option<BadgeType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BadgeType {
#[serde(rename = "number")]
Number,
#[serde(rename = "dot")]
Dot,
#[serde(rename = "clear")]
Clear,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Order {
#[serde(skip_serializing_if = "Option::is_none")]
pub order_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OrderStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pricing_plan_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub purchase_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expire_time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OrderStatus {
#[serde(rename = "pending")]
Pending,
#[serde(rename = "paid")]
Paid,
#[serde(rename = "cancelled")]
Cancelled,
#[serde(rename = "expired")]
Expired,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PricingPlan {
#[serde(skip_serializing_if = "Option::is_none")]
pub pricing_plan_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_cycle: Option<BillingCycle>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BillingCycle {
#[serde(rename = "monthly")]
Monthly,
#[serde(rename = "yearly")]
Yearly,
#[serde(rename = "once")]
Once,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditStatus {
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<AuditResult>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub audit_time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AuditResult {
#[serde(rename = "pending")]
Pending,
#[serde(rename = "approved")]
Approved,
#[serde(rename = "rejected")]
Rejected,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContactsRange {
#[serde(skip_serializing_if = "Option::is_none")]
pub range_type: Option<ContactsRangeType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_list: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_list: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ContactsRangeType {
#[serde(rename = "all")]
All,
#[serde(rename = "some")]
Some,
#[serde(rename = "admin_range")]
AdminRange,
}
#[cfg(test)]
#[allow(unused_variables, unused_unsafe)]
mod tests {
use super::*;
use serde_json;
#[test]
fn test_user_id_type_enum() {
assert_eq!(
serde_json::to_string(&UserIdType::OpenId).unwrap(),
"\"open_id\""
);
assert_eq!(
serde_json::to_string(&UserIdType::UserId).unwrap(),
"\"user_id\""
);
assert_eq!(
serde_json::to_string(&UserIdType::UnionId).unwrap(),
"\"union_id\""
);
}
#[test]
fn test_user_id_type_as_str() {
assert_eq!(UserIdType::OpenId.as_str(), "open_id");
assert_eq!(UserIdType::UserId.as_str(), "user_id");
assert_eq!(UserIdType::UnionId.as_str(), "union_id");
}
#[test]
fn test_department_id_type_enum() {
assert_eq!(
serde_json::to_string(&DepartmentIdType::OpenDepartmentId).unwrap(),
"\"open_department_id\""
);
assert_eq!(
serde_json::to_string(&DepartmentIdType::DepartmentId).unwrap(),
"\"department_id\""
);
}
#[test]
fn test_department_id_type_as_str() {
assert_eq!(
DepartmentIdType::OpenDepartmentId.as_str(),
"open_department_id"
);
assert_eq!(DepartmentIdType::DepartmentId.as_str(), "department_id");
}
#[test]
fn test_application_full() {
let app = Application {
app_id: Some("app123".to_string()),
app_name: Some("测试应用".to_string()),
description: Some("这是一个测试应用".to_string()),
avatar_url: Some("https://example.com/avatar.png".to_string()),
app_type: Some(AppType::SelfBuilt),
status: Some(AppStatus::Published),
create_time: Some("2024-01-01T00:00:00Z".to_string()),
update_time: Some("2024-01-01T12:00:00Z".to_string()),
};
let json = serde_json::to_string(&app).unwrap();
assert!(json.contains("app123"));
assert!(json.contains("测试应用"));
assert!(json.contains("self_built"));
assert!(json.contains("published"));
}
#[test]
fn test_app_type_enum() {
assert_eq!(
serde_json::to_string(&AppType::SelfBuilt).unwrap(),
"\"self_built\""
);
assert_eq!(
serde_json::to_string(&AppType::Marketplace).unwrap(),
"\"marketplace\""
);
}
#[test]
fn test_app_status_enum() {
assert_eq!(
serde_json::to_string(&AppStatus::Developing).unwrap(),
"\"developing\""
);
assert_eq!(
serde_json::to_string(&AppStatus::Published).unwrap(),
"\"published\""
);
assert_eq!(
serde_json::to_string(&AppStatus::Removed).unwrap(),
"\"removed\""
);
assert_eq!(
serde_json::to_string(&AppStatus::Disabled).unwrap(),
"\"disabled\""
);
}
#[test]
fn test_app_version() {
let version = AppVersion {
version_id: Some("v123".to_string()),
version: Some("1.2.0".to_string()),
version_name: Some("重要更新".to_string()),
remark: Some("修复了若干bug".to_string()),
create_time: Some("2024-01-01T00:00:00Z".to_string()),
publish_time: Some("2024-01-02T00:00:00Z".to_string()),
status: Some(VersionStatus::Published),
};
let json = serde_json::to_string(&version).unwrap();
assert!(json.contains("v123"));
assert!(json.contains("1.2.0"));
assert!(json.contains("重要更新"));
assert!(json.contains("published"));
}
#[test]
fn test_version_status_enum() {
assert_eq!(
serde_json::to_string(&VersionStatus::Developing).unwrap(),
"\"developing\""
);
assert_eq!(
serde_json::to_string(&VersionStatus::Auditing).unwrap(),
"\"auditing\""
);
assert_eq!(
serde_json::to_string(&VersionStatus::Published).unwrap(),
"\"published\""
);
assert_eq!(
serde_json::to_string(&VersionStatus::Rejected).unwrap(),
"\"rejected\""
);
}
#[test]
fn test_app_collaborator() {
let collaborator = AppCollaborator {
collaborator_id: Some("user123".to_string()),
collaborator_type: Some(CollaboratorType::User),
permissions: Some(vec!["read".to_string(), "write".to_string()]),
};
let json = serde_json::to_string(&collaborator).unwrap();
assert!(json.contains("user123"));
assert!(json.contains("user"));
assert!(json.contains("read"));
}
#[test]
fn test_collaborator_type_enum() {
assert_eq!(
serde_json::to_string(&CollaboratorType::User).unwrap(),
"\"user\""
);
assert_eq!(
serde_json::to_string(&CollaboratorType::Group).unwrap(),
"\"group\""
);
}
#[test]
fn test_permission_scope() {
let scope = PermissionScope {
permission: Some("contacts:read".to_string()),
granted: Some(true),
status: Some(AuthStatus::Granted),
};
let json = serde_json::to_string(&scope).unwrap();
assert!(json.contains("contacts:read"));
assert!(json.contains("true"));
assert!(json.contains("granted"));
}
#[test]
fn test_auth_status_enum() {
assert_eq!(
serde_json::to_string(&AuthStatus::Granted).unwrap(),
"\"granted\""
);
assert_eq!(
serde_json::to_string(&AuthStatus::NotGranted).unwrap(),
"\"not_granted\""
);
assert_eq!(
serde_json::to_string(&AuthStatus::Pending).unwrap(),
"\"pending\""
);
assert_eq!(
serde_json::to_string(&AuthStatus::Rejected).unwrap(),
"\"rejected\""
);
}
#[test]
fn test_app_admin() {
let admin = AppAdmin {
user_id: Some("admin123".to_string()),
permissions: Some(vec![
AdminPermission::AppManagement,
AdminPermission::UserManagement,
]),
};
let json = serde_json::to_string(&admin).unwrap();
assert!(json.contains("admin123"));
assert!(json.contains("app_management"));
assert!(json.contains("user_management"));
}
#[test]
fn test_admin_permission_enum() {
assert_eq!(
serde_json::to_string(&AdminPermission::AppManagement).unwrap(),
"\"app_management\""
);
assert_eq!(
serde_json::to_string(&AdminPermission::UserManagement).unwrap(),
"\"user_management\""
);
assert_eq!(
serde_json::to_string(&AdminPermission::PermissionManagement).unwrap(),
"\"permission_management\""
);
}
#[test]
fn test_app_availability() {
let availability = AppAvailability {
is_visible_to_all: Some(false),
visible_list: Some(VisibilityList {
user_list: Some(vec!["user1".to_string(), "user2".to_string()]),
department_list: Some(vec!["dept1".to_string()]),
group_list: Some(vec!["group1".to_string()]),
}),
invisible_list: None,
};
let json = serde_json::to_string(&availability).unwrap();
assert!(json.contains("false"));
assert!(json.contains("user1"));
assert!(json.contains("dept1"));
}
#[test]
fn test_visibility_list() {
let list = VisibilityList {
user_list: Some(vec!["user123".to_string()]),
department_list: Some(vec!["tech".to_string(), "product".to_string()]),
group_list: None,
};
let json = serde_json::to_string(&list).unwrap();
assert!(json.contains("user123"));
assert!(json.contains("tech"));
assert!(json.contains("product"));
}
#[test]
fn test_app_usage() {
let usage = AppUsage {
date: Some("2024-01-01".to_string()),
active_users: Some(150),
new_users: Some(20),
message_push_count: Some(500),
};
let json = serde_json::to_string(&usage).unwrap();
assert!(json.contains("2024-01-01"));
assert!(json.contains("150"));
assert!(json.contains("20"));
assert!(json.contains("500"));
}
#[test]
fn test_department_usage() {
let usage = DepartmentUsage {
department_id: Some("dept123".to_string()),
department_name: Some("技术部".to_string()),
active_users: Some(25),
total_users: Some(30),
};
let json = serde_json::to_string(&usage).unwrap();
assert!(json.contains("dept123"));
assert!(json.contains("技术部"));
assert!(json.contains("25"));
assert!(json.contains("30"));
}
#[test]
fn test_app_feedback() {
let feedback = AppFeedback {
feedback_id: Some("fb123".to_string()),
user_id: Some("user456".to_string()),
feedback_type: Some(FeedbackType::Bug),
content: Some("应用启动很慢".to_string()),
rating: Some(3),
create_time: Some("2024-01-01T10:00:00Z".to_string()),
status: Some(FeedbackStatus::Processing),
};
let json = serde_json::to_string(&feedback).unwrap();
assert!(json.contains("fb123"));
assert!(json.contains("bug"));
assert!(json.contains("应用启动很慢"));
assert!(json.contains("processing"));
}
#[test]
fn test_feedback_type_enum() {
assert_eq!(
serde_json::to_string(&FeedbackType::Bug).unwrap(),
"\"bug\""
);
assert_eq!(
serde_json::to_string(&FeedbackType::Feature).unwrap(),
"\"feature\""
);
assert_eq!(
serde_json::to_string(&FeedbackType::Other).unwrap(),
"\"other\""
);
}
#[test]
fn test_feedback_status_enum() {
assert_eq!(
serde_json::to_string(&FeedbackStatus::Pending).unwrap(),
"\"pending\""
);
assert_eq!(
serde_json::to_string(&FeedbackStatus::Processing).unwrap(),
"\"processing\""
);
assert_eq!(
serde_json::to_string(&FeedbackStatus::Completed).unwrap(),
"\"completed\""
);
assert_eq!(
serde_json::to_string(&FeedbackStatus::Closed).unwrap(),
"\"closed\""
);
}
#[test]
fn test_app_badge() {
let badge = AppBadge {
badge_type: Some(BadgeType::Number),
content: Some("5".to_string()),
};
let json = serde_json::to_string(&badge).unwrap();
assert!(json.contains("number"));
assert!(json.contains("5"));
}
#[test]
fn test_badge_type_enum() {
assert_eq!(
serde_json::to_string(&BadgeType::Number).unwrap(),
"\"number\""
);
assert_eq!(serde_json::to_string(&BadgeType::Dot).unwrap(), "\"dot\"");
assert_eq!(
serde_json::to_string(&BadgeType::Clear).unwrap(),
"\"clear\""
);
}
#[test]
fn test_order() {
let order = Order {
order_id: Some("order123".to_string()),
status: Some(OrderStatus::Paid),
pricing_plan_id: Some("plan456".to_string()),
quantity: Some(10),
purchase_time: Some("2024-01-01T00:00:00Z".to_string()),
expire_time: Some("2025-01-01T00:00:00Z".to_string()),
};
let json = serde_json::to_string(&order).unwrap();
assert!(json.contains("order123"));
assert!(json.contains("paid"));
assert!(json.contains("plan456"));
assert!(json.contains("10"));
}
#[test]
fn test_order_status_enum() {
assert_eq!(
serde_json::to_string(&OrderStatus::Pending).unwrap(),
"\"pending\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::Paid).unwrap(),
"\"paid\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::Cancelled).unwrap(),
"\"cancelled\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::Expired).unwrap(),
"\"expired\""
);
}
#[test]
fn test_pricing_plan() {
let plan = PricingPlan {
pricing_plan_id: Some("plan123".to_string()),
plan_name: Some("专业版".to_string()),
description: Some("适合中型团队".to_string()),
price: Some("99.00".to_string()),
billing_cycle: Some(BillingCycle::Monthly),
};
let json = serde_json::to_string(&plan).unwrap();
assert!(json.contains("plan123"));
assert!(json.contains("专业版"));
assert!(json.contains("99.00"));
assert!(json.contains("monthly"));
}
#[test]
fn test_billing_cycle_enum() {
assert_eq!(
serde_json::to_string(&BillingCycle::Monthly).unwrap(),
"\"monthly\""
);
assert_eq!(
serde_json::to_string(&BillingCycle::Yearly).unwrap(),
"\"yearly\""
);
assert_eq!(
serde_json::to_string(&BillingCycle::Once).unwrap(),
"\"once\""
);
}
#[test]
fn test_audit_status() {
let status = AuditStatus {
status: Some(AuditResult::Approved),
comment: Some("应用符合规范".to_string()),
audit_time: Some("2024-01-01T14:00:00Z".to_string()),
};
let json = serde_json::to_string(&status).unwrap();
assert!(json.contains("approved"));
assert!(json.contains("应用符合规范"));
}
#[test]
fn test_audit_result_enum() {
assert_eq!(
serde_json::to_string(&AuditResult::Pending).unwrap(),
"\"pending\""
);
assert_eq!(
serde_json::to_string(&AuditResult::Approved).unwrap(),
"\"approved\""
);
assert_eq!(
serde_json::to_string(&AuditResult::Rejected).unwrap(),
"\"rejected\""
);
}
#[test]
fn test_contacts_range() {
let range = ContactsRange {
range_type: Some(ContactsRangeType::Some),
department_list: Some(vec!["dept1".to_string(), "dept2".to_string()]),
user_list: Some(vec!["user1".to_string()]),
};
let json = serde_json::to_string(&range).unwrap();
assert!(json.contains("some"));
assert!(json.contains("dept1"));
assert!(json.contains("user1"));
}
#[test]
fn test_contacts_range_type_enum() {
assert_eq!(
serde_json::to_string(&ContactsRangeType::All).unwrap(),
"\"all\""
);
assert_eq!(
serde_json::to_string(&ContactsRangeType::Some).unwrap(),
"\"some\""
);
assert_eq!(
serde_json::to_string(&ContactsRangeType::AdminRange).unwrap(),
"\"admin_range\""
);
}
#[test]
fn test_minimal_structs() {
let minimal_app = Application {
app_id: Some("minimal".to_string()),
app_name: Some("最小应用".to_string()),
description: None,
avatar_url: None,
app_type: None,
status: None,
create_time: None,
update_time: None,
};
let json = serde_json::to_string(&minimal_app).unwrap();
assert!(json.contains("minimal"));
assert!(json.contains("最小应用"));
assert!(!json.contains("description"));
}
}