@@ -62,6 +62,7 @@ import io.mockk.junit5.MockKExtension
6262import io.mockk.mockk
6363import io.mockk.mockkStatic
6464import java.util.*
65+ import kotlin.test.Test
6566import kotlin.test.assertEquals
6667import org.junit.jupiter.api.BeforeEach
6768import org.junit.jupiter.api.DynamicTest.dynamicTest
@@ -2777,15 +2778,15 @@ class RunnerServiceRBACTest : CsmRedisTestBase() {
27772778
27782779 @TestFactory
27792780 fun `test Dataset RBAC addRunnerAccessControl` () =
2780- mapOf (
2781- ROLE_VIEWER to true ,
2782- ROLE_EDITOR to true ,
2783- ROLE_VALIDATOR to true ,
2784- ROLE_USER to true ,
2785- ROLE_NONE to true ,
2786- ROLE_ADMIN to false ,
2781+ listOf (
2782+ ROLE_VIEWER ,
2783+ ROLE_EDITOR ,
2784+ ROLE_VALIDATOR ,
2785+ ROLE_USER ,
2786+ ROLE_NONE ,
2787+ ROLE_ADMIN ,
27872788 )
2788- .map { ( role, shouldThrow) ->
2789+ .map { role ->
27892790 dynamicTest(" Test Dataset RBAC addRunnerAccessControl : $role " ) {
27902791 every { getCurrentAccountIdentifier(any()) } returns CONNECTED_ADMIN_USER
27912792 val connector = makeConnector()
@@ -2820,32 +2821,90 @@ class RunnerServiceRBACTest : CsmRedisTestBase() {
28202821 role = ROLE_ADMIN )
28212822 val runnerSaved =
28222823 runnerApiService.createRunner(organizationSaved.id!! , workspaceSaved.id!! , runner)
2823- every { getCurrentAccountIdentifier(any()) } returns TEST_USER_MAIL
28242824
2825- if (shouldThrow) {
2826- val exception =
2827- assertThrows<CsmAccessForbiddenException > {
2828- runnerApiService.addRunnerAccessControl(
2829- organizationSaved.id!! ,
2830- workspaceSaved.id!! ,
2831- runnerSaved.id!! ,
2832- RunnerAccessControl (" id" , ROLE_ADMIN ))
2833- }
2825+ assertDoesNotThrow {
28342826 assertEquals(
2835- " RBAC ${datasetSaved.id!! } - User does not have permission $PERMISSION_WRITE_SECURITY " ,
2836- exception.message)
2837- } else {
2838- assertDoesNotThrow {
2839- runnerApiService.addRunnerAccessControl(
2840- organizationSaved.id!! ,
2841- workspaceSaved.id!! ,
2842- runnerSaved.id!! ,
2843- RunnerAccessControl (" id" , ROLE_ADMIN ))
2844- }
2827+ true ,
2828+ datasetSaved.security
2829+ ?.accessControlList
2830+ ?.filter { datasetAccessControl ->
2831+ datasetAccessControl.id == TEST_USER_MAIL
2832+ }
2833+ ?.any { datasetAccessControl -> datasetAccessControl.role == role })
2834+
2835+ runnerApiService.addRunnerAccessControl(
2836+ organizationSaved.id!! ,
2837+ workspaceSaved.id!! ,
2838+ runnerSaved.id!! ,
2839+ RunnerAccessControl (TEST_USER_MAIL , ROLE_ADMIN ))
2840+
2841+ val datasetWithUpgradedACL =
2842+ datasetApiService.findDatasetById(organizationSaved.id!! , datasetSaved.id!! )
2843+ assertEquals(
2844+ true ,
2845+ datasetWithUpgradedACL.security
2846+ ?.accessControlList
2847+ ?.filter { datasetAccessControl ->
2848+ datasetAccessControl.id == TEST_USER_MAIL
2849+ }
2850+ ?.any { datasetAccessControl -> datasetAccessControl.role == role })
28452851 }
28462852 }
28472853 }
28482854
2855+ @Test
2856+ fun `test Dataset RBAC addRunnerAccessControl with new ACL entry` () {
2857+ every { getCurrentAccountIdentifier(any()) } returns CONNECTED_ADMIN_USER
2858+ val connector = makeConnector()
2859+ val connectorSaved = connectorApiService.registerConnector(connector)
2860+ val organization = makeOrganizationWithRole(id = TEST_USER_MAIL , role = ROLE_ADMIN )
2861+ val organizationSaved = organizationApiService.registerOrganization(organization)
2862+ val dataset =
2863+ makeDataset(
2864+ organizationSaved.id
!! , connectorSaved, id
= " [email protected] " , role
= ROLE_NONE )
2865+ var datasetSaved = datasetApiService.createDataset(organizationSaved.id!! , dataset)
2866+ datasetSaved =
2867+ datasetRepository.save(
2868+ datasetSaved.apply { ingestionStatus = Dataset .IngestionStatus .SUCCESS })
2869+ every { datasetApiService.createSubDataset(any(), any(), any()) } returns datasetSaved
2870+
2871+ assertEquals(
2872+ false ,
2873+ datasetSaved.security?.accessControlList?.any { datasetAccessControl ->
2874+ datasetAccessControl.id == TEST_USER_MAIL
2875+ })
2876+
2877+ val solution = makeSolution(organizationSaved.id!! , TEST_USER_MAIL , ROLE_ADMIN )
2878+ val solutionSaved = solutionApiService.createSolution(organizationSaved.id!! , solution)
2879+ val workspace =
2880+ makeWorkspaceWithRole(
2881+ organizationSaved.id!! , solutionSaved.id!! , id = TEST_USER_MAIL , role = ROLE_ADMIN )
2882+ val workspaceSaved = workspaceApiService.createWorkspace(organizationSaved.id!! , workspace)
2883+ val runner =
2884+ makeRunnerWithRole(
2885+ organizationSaved.id!! ,
2886+ workspaceSaved.id!! ,
2887+ solutionSaved.id!! ,
2888+ mutableListOf (datasetSaved.id!! ),
2889+ 2890+ role = ROLE_ADMIN )
2891+ val runnerSaved =
2892+ runnerApiService.createRunner(organizationSaved.id!! , workspaceSaved.id!! , runner)
2893+
2894+ runnerApiService.addRunnerAccessControl(
2895+ organizationSaved.id!! ,
2896+ workspaceSaved.id!! ,
2897+ runnerSaved.id!! ,
2898+ RunnerAccessControl (TEST_USER_MAIL , ROLE_ADMIN ))
2899+ val datasetWithUpgradedACL =
2900+ datasetApiService.findDatasetById(organizationSaved.id!! , datasetSaved.id!! )
2901+ assertEquals(
2902+ true ,
2903+ datasetWithUpgradedACL.security?.accessControlList?.any { datasetAccessControl ->
2904+ datasetAccessControl.id == TEST_USER_MAIL
2905+ })
2906+ }
2907+
28492908 @TestFactory
28502909 fun `test Solution RBAC addRunnerAccessControl` () =
28512910 mapOf (
0 commit comments