From 91cd90608afdf8ae0a15888b84349b5d69803b22 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 6 Jun 2026 17:44:47 +0530 Subject: [PATCH] test: Role assignments with same role on scopes --- .../integration/src/assignment/grant/list.rs | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/tests/integration/src/assignment/grant/list.rs b/tests/integration/src/assignment/grant/list.rs index 35fa6bccb..dfb87060b 100644 --- a/tests/integration/src/assignment/grant/list.rs +++ b/tests/integration/src/assignment/grant/list.rs @@ -200,3 +200,98 @@ async fn test_list_user_roles() -> Result<()> { ); Ok(()) } +#[traced_test] +#[tokio::test] +async fn test_list_role_assignments_by_user_same_role_multiple_scopes() -> Result<()> { + let (state, _) = get_state().await?; + + let domain = create_domain!(state)?; + let project_1 = create_project!(state, domain.id.clone())?; + let project_2 = create_project!(state, domain.id.clone())?; + let user = create_user!(state, domain.id.clone())?; + let role = create_role!(state)?; + + for assignment in [ + AssignmentCreate::user_project(&user.id, &project_1.id, &role.id, false), + AssignmentCreate::user_project(&user.id, &project_2.id, &role.id, false), + AssignmentCreate::user_system(&user.id, "all", &role.id, false), + ] { + state + .provider + .get_assignment_provider() + .create_grant(&state, assignment) + .await?; + } + + let assignments = state + .provider + .get_assignment_provider() + .list_role_assignments( + &state, + &RoleAssignmentListParametersBuilder::default() + .user_id(user.id.clone()) + .build()?, + ) + .await?; + + assert_eq!(assignments.len(), 3); + + let target_ids: BTreeSet = assignments.iter().map(|a| a.target_id.clone()).collect(); + assert!(target_ids.contains(&project_1.id)); + assert!(target_ids.contains(&project_2.id)); + assert!(target_ids.contains("all")); + + Ok(()) +} + +#[traced_test] +#[tokio::test] +async fn test_list_role_assignments_by_role_id_same_role_multiple_scopes() -> Result<()> { + let (state, _) = get_state().await?; + + let domain = create_domain!(state)?; + let project_1 = create_project!(state, domain.id.clone())?; + let project_2 = create_project!(state, domain.id.clone())?; + let user = create_user!(state, domain.id.clone())?; + let role = create_role!(state)?; + + for assignment in [ + AssignmentCreate::user_project(&user.id, &project_1.id, &role.id, false), + AssignmentCreate::user_project(&user.id, &project_2.id, &role.id, false), + AssignmentCreate::user_system(&user.id, "all", &role.id, false), + ] { + state + .provider + .get_assignment_provider() + .create_grant(&state, assignment) + .await?; + } + + let assignments = state + .provider + .get_assignment_provider() + .list_role_assignments( + &state, + &RoleAssignmentListParametersBuilder::default() + .role_id(role.id.clone()) + .build()?, + ) + .await?; + + let user_assignments: Vec<_> = assignments + .iter() + .filter(|a| a.actor_id == user.id) + .collect(); + + assert_eq!(user_assignments.len(), 3); + + let target_ids: BTreeSet = user_assignments + .iter() + .map(|a| a.target_id.clone()) + .collect(); + assert!(target_ids.contains(&project_1.id)); + assert!(target_ids.contains(&project_2.id)); + assert!(target_ids.contains("all")); + + Ok(()) +}