From 1811b2206f7fd56a2556ab6a6e1b0c5c08b46e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 3 Oct 2026 17:32:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E4=BC=9A=E5=91=98=E8=AE=A1=E4=BB=B7):=20?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=8A=A5=E4=BB=B7=E5=85=88=E5=81=9A=E9=A2=86?= =?UTF-8?q?=E5=9F=9F=E6=A0=A1=E9=AA=8C=E5=86=8D=E5=81=9A=E6=95=B0=E5=80=BC?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - quote_runtime_profile_membership_upgrade 先跑账期变更 / 档位合法性校验,再跑期号与窗口数值校验,使年付转月付等高期号场景返回 CycleKindChangeUnsupported 而非 InvalidQuoteInput。 - 补充年付转月付的回归断言,覆盖目标账期 period 数小于当前期号的拒绝路径。 --- .../module-runtime/src/membership/upgrade.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/server-rs/crates/module-runtime/src/membership/upgrade.rs b/server-rs/crates/module-runtime/src/membership/upgrade.rs index 30545a1d9..169f3213e 100644 --- a/server-rs/crates/module-runtime/src/membership/upgrade.rs +++ b/server-rs/crates/module-runtime/src/membership/upgrade.rs @@ -161,8 +161,8 @@ fn validate_runtime_profile_membership_upgrade_quote_input( pub fn quote_runtime_profile_membership_upgrade( input: RuntimeProfileMembershipUpgradeQuoteInput, ) -> Result { - 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]