From 0a06b498801c65b2628c9944efe5249bbf2fa938 Mon Sep 17 00:00:00 2001 From: Linghong Date: Wed, 2 Sep 2026 10:41:21 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A5=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=9F=8B=E7=82=B9=E6=9E=84=E9=80=A0=E5=99=A8=E7=BC=BA=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复 TrackingEventDraft::user 用户态构造器 补充用户 scope 与主体字段的回归测试 --- server-rs/crates/api-server/src/tracking.rs | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/server-rs/crates/api-server/src/tracking.rs b/server-rs/crates/api-server/src/tracking.rs index 5ab2c66d4..c6bbf7789 100644 --- a/server-rs/crates/api-server/src/tracking.rs +++ b/server-rs/crates/api-server/src/tracking.rs @@ -61,6 +61,16 @@ impl TrackingEventDraft { client_marker: None, } } + + pub fn user(event_key: &'static str, module_key: &'static str, user_id: &str) -> Self { + let normalized_user_id = user_id.trim().to_string(); + let mut draft = Self::new(event_key, module_key); + draft.scope_kind = RuntimeTrackingScopeKind::User; + draft.scope_id = normalized_user_id.clone(); + draft.user_id = Some(normalized_user_id.clone()); + draft.owner_user_id = Some(normalized_user_id); + draft + } } #[derive(Clone, Debug)] @@ -1271,6 +1281,21 @@ mod tests { assert_eq!(resolve_tracking_scope_id(&spec, &identity), "user-225"); } + #[test] + fn user_tracking_draft_sets_user_scope_and_subject_fields() { + let draft = TrackingEventDraft::user("daily_login", "profile", " user-225 "); + + assert_eq!( + draft.scope_kind, + module_runtime::RuntimeTrackingScopeKind::User + ); + assert_eq!(draft.scope_id, "user-225"); + assert_eq!(draft.user_id.as_deref(), Some("user-225")); + assert_eq!(draft.owner_user_id.as_deref(), Some("user-225")); + assert_eq!(draft.module_key, Some("profile")); + assert_eq!(draft.event_key, "daily_login"); + } + #[test] fn tracking_identity_uses_external_api_owner_and_does_not_forge_user() { let authenticated = build_test_authenticated("login-user");