From aae23a083be4d1824576256b8ff8deb445562609 Mon Sep 17 00:00:00 2001 From: ember33 Date: Thu, 19 Mar 2026 22:29:13 +0100 Subject: [PATCH] test(spaces): add multi-space scenario tests Cover highest-wins PL logic across multiple parent spaces, OR-based join/kick qualification, edge cases (one space has no PL, neither has PL, user only in one space, same role different PLs across spaces). --- src/service/rooms/roles/tests.rs | 121 +++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/src/service/rooms/roles/tests.rs b/src/service/rooms/roles/tests.rs index 81d52d1a..4396f774 100644 --- a/src/service/rooms/roles/tests.rs +++ b/src/service/rooms/roles/tests.rs @@ -78,3 +78,124 @@ fn qualifies_with_no_requirements() { fn does_not_qualify_with_no_roles() { assert!(!roles_satisfy_requirements(&make_set(&["nsfw"]), &HashSet::new())); } + +// Multi-space scenarios + +#[test] +fn multi_space_highest_pl_wins() { + let space_a_roles = make_roles(&[("mod", Some(50))]); + let space_b_roles = make_roles(&[("admin", Some(100))]); + + let user_roles_a = make_set(&["mod"]); + let user_roles_b = make_set(&["admin"]); + + let pl_a = compute_user_power_level(&space_a_roles, &user_roles_a); + let pl_b = compute_user_power_level(&space_b_roles, &user_roles_b); + + let effective = [pl_a, pl_b].into_iter().flatten().max(); + assert_eq!(effective, Some(100)); +} + +#[test] +fn multi_space_one_space_has_no_pl() { + let space_a_roles = make_roles(&[("nsfw", None)]); + let space_b_roles = make_roles(&[("mod", Some(50))]); + + let user_roles_a = make_set(&["nsfw"]); + let user_roles_b = make_set(&["mod"]); + + let pl_a = compute_user_power_level(&space_a_roles, &user_roles_a); + let pl_b = compute_user_power_level(&space_b_roles, &user_roles_b); + + let effective = [pl_a, pl_b].into_iter().flatten().max(); + assert_eq!(effective, Some(50)); +} + +#[test] +fn multi_space_neither_has_pl() { + let space_a_roles = make_roles(&[("nsfw", None)]); + let space_b_roles = make_roles(&[("vip", None)]); + + let user_roles_a = make_set(&["nsfw"]); + let user_roles_b = make_set(&["vip"]); + + let pl_a = compute_user_power_level(&space_a_roles, &user_roles_a); + let pl_b = compute_user_power_level(&space_b_roles, &user_roles_b); + + let effective = [pl_a, pl_b].into_iter().flatten().max(); + assert_eq!(effective, None); +} + +#[test] +fn multi_space_user_only_in_one_space() { + let space_a_roles = make_roles(&[("admin", Some(100))]); + let space_b_roles = make_roles(&[("mod", Some(50))]); + + let user_roles_a = make_set(&["admin"]); + let user_roles_b: HashSet = HashSet::new(); + + let pl_a = compute_user_power_level(&space_a_roles, &user_roles_a); + let pl_b = compute_user_power_level(&space_b_roles, &user_roles_b); + + let effective = [pl_a, pl_b].into_iter().flatten().max(); + assert_eq!(effective, Some(100)); +} + +#[test] +fn multi_space_join_or_logic_qualifies_in_any() { + let space_a_reqs = make_set(&["staff"]); + let space_b_reqs = make_set(&["nsfw"]); + + let user_roles = make_set(&["nsfw"]); + + let qualifies_a = roles_satisfy_requirements(&space_a_reqs, &user_roles); + let qualifies_b = roles_satisfy_requirements(&space_b_reqs, &user_roles); + + assert!(!qualifies_a); + assert!(qualifies_b); + assert!(qualifies_a || qualifies_b); +} + +#[test] +fn multi_space_kick_or_logic_qualifies_in_other() { + let space_a_reqs = make_set(&["nsfw"]); + let space_b_reqs = make_set(&["vip"]); + + let user_roles_after_revoke = make_set(&["vip"]); + + let qualifies_a = roles_satisfy_requirements(&space_a_reqs, &user_roles_after_revoke); + let qualifies_b = roles_satisfy_requirements(&space_b_reqs, &user_roles_after_revoke); + + assert!(!qualifies_a); + assert!(qualifies_b); + assert!(qualifies_a || qualifies_b); +} + +#[test] +fn multi_space_no_qualification_anywhere() { + let space_a_reqs = make_set(&["staff"]); + let space_b_reqs = make_set(&["admin"]); + + let user_roles = make_set(&["nsfw"]); + + let qualifies_a = roles_satisfy_requirements(&space_a_reqs, &user_roles); + let qualifies_b = roles_satisfy_requirements(&space_b_reqs, &user_roles); + + assert!(!qualifies_a); + assert!(!qualifies_b); + assert!(!(qualifies_a || qualifies_b)); +} + +#[test] +fn multi_space_same_role_different_pl() { + let space_a_roles = make_roles(&[("mod", Some(50))]); + let space_b_roles = make_roles(&[("mod", Some(75))]); + + let user_roles = make_set(&["mod"]); + + let pl_a = compute_user_power_level(&space_a_roles, &user_roles); + let pl_b = compute_user_power_level(&space_b_roles, &user_roles); + + let effective = [pl_a, pl_b].into_iter().flatten().max(); + assert_eq!(effective, Some(75)); +}