Files
Genarrative/server-rs/crates/module-runtime/tests/membership_plan_enum.rs
T
k88936 b827c93d39 领域层:新增会员档位、周期、模型权限与变更类型枚举
- 新增 RuntimeProfileMembershipPlan { Normal, Starter, Plus, Pro, Max } 作为档位权威身份,取代旧 RuntimeProfileMembershipTier
- 新增 RuntimeProfileMembershipCycleKind:月付 1 期、年付 12 期(每期仍为一个自然月)
- 新增 RuntimeProfileMembershipModelAccess { Basic, Full } 与 RuntimeProfileMembershipChangeKind { Purchase, Upgrade }
- 四个枚举各带 as_str 与 parse,未知对外 token 返回 None,由调用方显式拒绝
- 新增集成测试 tests/membership_plan_enum.rs:token 往返、Normal 不可购买、期数映射、未知 token 拒绝

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-02 14:06:20 +08:00

82 lines
3.0 KiB
Rust

use module_runtime::{
RuntimeProfileMembershipChangeKind, RuntimeProfileMembershipCycleKind,
RuntimeProfileMembershipModelAccess, RuntimeProfileMembershipPlan,
};
#[test]
fn membership_plan_tokens_round_trip_strictly() {
// 中文注释:对外 wire token 必须与枚举一一对应,未知 token 一律解析失败。
let cases = [
(RuntimeProfileMembershipPlan::Normal, "normal"),
(RuntimeProfileMembershipPlan::Starter, "starter"),
(RuntimeProfileMembershipPlan::Plus, "plus"),
(RuntimeProfileMembershipPlan::Pro, "pro"),
(RuntimeProfileMembershipPlan::Max, "max"),
];
for (plan, token) in cases {
assert_eq!(plan.as_str(), token);
assert_eq!(RuntimeProfileMembershipPlan::parse(token), Some(plan));
}
assert_eq!(RuntimeProfileMembershipPlan::parse("basic"), None);
assert_eq!(RuntimeProfileMembershipPlan::parse("ultimate"), None);
assert_eq!(RuntimeProfileMembershipPlan::parse("PLUS"), None);
assert_eq!(RuntimeProfileMembershipPlan::parse(""), None);
}
#[test]
fn membership_plan_normal_is_not_purchasable() {
// 中文注释:Normal 是非会员占位档位,不允许被购买。
assert!(!RuntimeProfileMembershipPlan::Normal.is_purchasable());
for plan in [
RuntimeProfileMembershipPlan::Starter,
RuntimeProfileMembershipPlan::Plus,
RuntimeProfileMembershipPlan::Pro,
RuntimeProfileMembershipPlan::Max,
] {
assert!(plan.is_purchasable());
}
}
#[test]
fn membership_cycle_kind_maps_to_period_count() {
// 中文注释:年付 12 期、月付 1 期,每期仍是一个自然月。
assert_eq!(RuntimeProfileMembershipCycleKind::Monthly.cycle_count(), 1);
assert_eq!(RuntimeProfileMembershipCycleKind::Yearly.cycle_count(), 12);
assert_eq!(
RuntimeProfileMembershipCycleKind::Monthly.as_str(),
"monthly"
);
assert_eq!(RuntimeProfileMembershipCycleKind::Yearly.as_str(), "yearly");
assert_eq!(
RuntimeProfileMembershipCycleKind::parse("yearly"),
Some(RuntimeProfileMembershipCycleKind::Yearly)
);
assert_eq!(RuntimeProfileMembershipCycleKind::parse("weekly"), None);
}
#[test]
fn membership_model_access_and_change_kind_tokens_round_trip() {
assert_eq!(RuntimeProfileMembershipModelAccess::Basic.as_str(), "basic");
assert_eq!(RuntimeProfileMembershipModelAccess::Full.as_str(), "full");
assert_eq!(
RuntimeProfileMembershipModelAccess::parse("full"),
Some(RuntimeProfileMembershipModelAccess::Full)
);
assert_eq!(RuntimeProfileMembershipModelAccess::parse("premium"), None);
assert_eq!(
RuntimeProfileMembershipChangeKind::Purchase.as_str(),
"purchase"
);
assert_eq!(
RuntimeProfileMembershipChangeKind::Upgrade.as_str(),
"upgrade"
);
assert_eq!(
RuntimeProfileMembershipChangeKind::parse("upgrade"),
Some(RuntimeProfileMembershipChangeKind::Upgrade)
);
assert_eq!(RuntimeProfileMembershipChangeKind::parse("downgrade"), None);
}