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>
82 lines
3.0 KiB
Rust
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);
|
|
}
|