feat: add invite code validity controls
- Add invite code starts/expires fields across contracts, API, Spacetime bindings, and admin UI - Enforce pending/expired invite code redemption behavior and expose admin status - Add admin write-operation confirmation guard and documentation - Add invite code contract/runtime tests
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
mod application;
|
||||
mod application;
|
||||
mod commands;
|
||||
mod domain;
|
||||
mod errors;
|
||||
@@ -465,6 +465,57 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn analytics_date_dimension_handles_iso_week_across_year() {
|
||||
let date_key = parse_analytics_calendar_date_key("2024-12-31").unwrap();
|
||||
let dimension = build_analytics_date_dimension_from_date_key(date_key);
|
||||
|
||||
assert_eq!(dimension.calendar_date, "2024-12-31");
|
||||
assert_eq!(dimension.weekday, 2);
|
||||
assert_eq!(dimension.iso_week_key, 202501);
|
||||
assert_eq!(
|
||||
dimension.week_start_date_key,
|
||||
parse_analytics_calendar_date_key("2024-12-30").unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
dimension.week_end_date_key,
|
||||
parse_analytics_calendar_date_key("2025-01-05").unwrap()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn analytics_date_dimension_handles_leap_day() {
|
||||
let date_key = parse_analytics_calendar_date_key("2024-02-29").unwrap();
|
||||
let dimension = build_analytics_date_dimension_from_date_key(date_key);
|
||||
|
||||
assert_eq!(dimension.calendar_date, "2024-02-29");
|
||||
assert_eq!(dimension.weekday, 4);
|
||||
assert_eq!(dimension.month_key, 202402);
|
||||
assert_eq!(dimension.month_end_date_key, date_key);
|
||||
assert_eq!(dimension.quarter_key, 20241);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn analytics_date_dimension_handles_quarter_boundary() {
|
||||
let date_key = parse_analytics_calendar_date_key("2024-04-01").unwrap();
|
||||
let dimension = build_analytics_date_dimension_from_date_key(date_key);
|
||||
|
||||
assert_eq!(dimension.quarter_key, 20242);
|
||||
assert_eq!(dimension.quarter_start_date_key, date_key);
|
||||
assert_eq!(
|
||||
dimension.quarter_end_date_key,
|
||||
parse_analytics_calendar_date_key("2024-06-30").unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
dimension.year_start_date_key,
|
||||
parse_analytics_calendar_date_key("2024-01-01").unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
dimension.year_end_date_key,
|
||||
parse_analytics_calendar_date_key("2024-12-31").unwrap()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn runtime_profile_task_status_matches_progress_and_claim() {
|
||||
assert_eq!(
|
||||
@@ -525,6 +576,51 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_task_config_input_accepts_only_user_scope() {
|
||||
let input = build_runtime_profile_task_config_admin_upsert_input(
|
||||
"admin".to_string(),
|
||||
PROFILE_TASK_ID_DAILY_LOGIN.to_string(),
|
||||
"每日登录".to_string(),
|
||||
"".to_string(),
|
||||
PROFILE_TASK_EVENT_KEY_DAILY_LOGIN.to_string(),
|
||||
RuntimeProfileTaskCycle::Daily,
|
||||
RuntimeTrackingScopeKind::User,
|
||||
1,
|
||||
10,
|
||||
true,
|
||||
10,
|
||||
1,
|
||||
)
|
||||
.expect("user scope should be accepted");
|
||||
assert_eq!(input.scope_kind, RuntimeTrackingScopeKind::User);
|
||||
|
||||
for scope_kind in [
|
||||
RuntimeTrackingScopeKind::Site,
|
||||
RuntimeTrackingScopeKind::Module,
|
||||
RuntimeTrackingScopeKind::Work,
|
||||
] {
|
||||
assert_eq!(
|
||||
build_runtime_profile_task_config_admin_upsert_input(
|
||||
"admin".to_string(),
|
||||
PROFILE_TASK_ID_DAILY_LOGIN.to_string(),
|
||||
"每日登录".to_string(),
|
||||
"".to_string(),
|
||||
PROFILE_TASK_EVENT_KEY_DAILY_LOGIN.to_string(),
|
||||
RuntimeProfileTaskCycle::Daily,
|
||||
scope_kind,
|
||||
1,
|
||||
10,
|
||||
true,
|
||||
10,
|
||||
1,
|
||||
)
|
||||
.expect_err("non-user scope should fail"),
|
||||
RuntimeProfileFieldError::UnsupportedProfileTaskScopeKind
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn recharge_product_catalog_matches_reference_prices() {
|
||||
let point_products = runtime_profile_recharge_point_products();
|
||||
|
||||
Reference in New Issue
Block a user