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)); +}