fix(会员计价): 升级报价先做领域校验再做数值校验

- quote_runtime_profile_membership_upgrade 先跑账期变更 / 档位合法性校验,再跑期号与窗口数值校验,使年付转月付等高期号场景返回 CycleKindChangeUnsupported 而非 InvalidQuoteInput。
- 补充年付转月付的回归断言,覆盖目标账期 period 数小于当前期号的拒绝路径。
This commit is contained in:
2026-10-03 17:32:00 +08:00
parent da0ef16df5
commit 1811b2206f
@@ -161,8 +161,8 @@ fn validate_runtime_profile_membership_upgrade_quote_input(
pub fn quote_runtime_profile_membership_upgrade(
input: RuntimeProfileMembershipUpgradeQuoteInput,
) -> Result<RuntimeProfileMembershipUpgradeQuote, RuntimeProfileMembershipUpgradeRejection> {
validate_runtime_profile_membership_upgrade_quote_input(&input)?;
check_runtime_profile_membership_upgrade_allowed(&input.current, &input.target)?;
validate_runtime_profile_membership_upgrade_quote_input(&input)?;
let current = input.current;
let target = input.target;
@@ -506,6 +506,22 @@ mod tests {
}),
Err(RuntimeProfileMembershipUpgradeRejection::CycleKindChangeUnsupported)
);
// 中文注释:年付转月付时 `cycle_index = 3` 超过月付的 1 期;领域校验必须先于数值校验,
// 否则会被误判成 InvalidQuoteInput,破坏「账期变更不支持」这一对外契约。
assert_eq!(
quote_runtime_profile_membership_upgrade(RuntimeProfileMembershipUpgradeQuoteInput {
current: snapshot(
RuntimeProfileMembershipPlan::Plus,
RuntimeProfileMembershipCycleKind::Yearly,
),
target: snapshot(
RuntimeProfileMembershipPlan::Pro,
RuntimeProfileMembershipCycleKind::Monthly,
),
..base_input()
}),
Err(RuntimeProfileMembershipUpgradeRejection::CycleKindChangeUnsupported)
);
}
#[test]