package jnpf.dmsService; import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity; import jnpf.dmsEntity.permission.enums.DmsResourceType; import jnpf.dmsEntity.permission.model.DmsResourcePath; import jnpf.dmsEntity.permission.vo.DmsCursorPageVO; import jnpf.dmsEntity.permission.vo.DmsPermissionGrantVO; import jnpf.dmsMapper.DmsFilePermissionMapper; import jnpf.dmsMapper.DmsPermissionGroupMapper; import jnpf.dmsMapper.DmsPermissionUsageMapper; import jnpf.dmsPermission.DmsCurrentIdentity; import jnpf.dmsPermission.DmsCursorCodec; import jnpf.dmsPermission.DmsPermissionMatcher; import jnpf.dmsPermission.DmsPermissionProperties; import jnpf.dmsPermission.DmsResourceResolver; import jnpf.dmsPermission.DmsUserDisplayNameResolver; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class DmsPermissionAdminQueryServiceTest { private static final String TENANT_ID = "tenant-1"; private static final String USER_ID = "user-1"; @Test void enrichesGrantPageUserNames() { Fixture fixture = new Fixture(); DmsFilePermissionEntity permission = permission(UUID.randomUUID()); when(fixture.permissionMapper.selectPage(TENANT_ID, null, null, null, null, null, 11)) .thenReturn(Collections.singletonList(permission)); when(fixture.grantService.toVO(permission)).thenReturn(toVO(permission)); when(fixture.userDisplayNameResolver.resolve(any())) .thenReturn(Collections.singletonMap(USER_ID, "运营用户(yunying1)")); DmsCursorPageVO result = fixture.service.grants( null, null, null, null, 10); assertEquals(1, result.getList().size()); assertEquals("运营用户(yunying1)", result.getList().get(0).getPrincipalName()); verify(fixture.userDisplayNameResolver).resolve(any()); } @Test void enrichesGrantDetailUserName() { Fixture fixture = new Fixture(); DmsFilePermissionEntity permission = permission(UUID.randomUUID()); when(fixture.permissionMapper.selectByTenantAndId(TENANT_ID, permission.getId())) .thenReturn(permission); when(fixture.grantService.toVO(permission)).thenReturn(toVO(permission)); when(fixture.userDisplayNameResolver.resolve(any())) .thenReturn(Collections.singletonMap(USER_ID, "运营用户(yunying1)")); DmsPermissionGrantVO result = fixture.service.grant(permission.getId()); assertEquals("运营用户(yunying1)", result.getPrincipalName()); verify(fixture.userDisplayNameResolver).resolve(any()); } @Test void enrichesDirectAndInheritedUserGrantsWithOneResolverCall() { Fixture fixture = new Fixture(); UUID selectedResourceId = UUID.randomUUID(); UUID ancestorResourceId = UUID.randomUUID(); DmsResourcePath path = new DmsResourcePath(); path.setActualResourceId(selectedResourceId); path.setActualResourceType("FOLDER"); List candidateIds = Arrays.asList(selectedResourceId, ancestorResourceId); DmsFilePermissionEntity direct = permission(selectedResourceId); DmsFilePermissionEntity inherited = permission(ancestorResourceId); when(fixture.resourceResolver.resolve(TENANT_ID, DmsResourceType.FOLDER, selectedResourceId)) .thenReturn(path); when(fixture.resourceResolver.candidateResourceIds(path)).thenReturn(candidateIds); when(fixture.permissionMapper.selectForResourceIds(TENANT_ID, candidateIds, 1000)) .thenReturn(Arrays.asList(direct, inherited)); when(fixture.matcher.coversResource(any(), any())).thenReturn(true); when(fixture.grantService.toVO(any())).thenAnswer(invocation -> toVO(invocation.getArgument(0))); when(fixture.userDisplayNameResolver.resolve(any())) .thenReturn(Collections.singletonMap(USER_ID, "运营用户(yunying1)")); List result = fixture.service.resourceGrants( DmsResourceType.FOLDER, selectedResourceId); assertEquals(2, result.size()); assertFalse(result.get(0).isInherited()); assertTrue(result.get(1).isInherited()); assertEquals("运营用户(yunying1)", result.get(0).getPrincipalName()); assertEquals("运营用户(yunying1)", result.get(1).getPrincipalName()); verify(fixture.userDisplayNameResolver).resolve(any()); } private static DmsFilePermissionEntity permission(UUID resourceId) { DmsFilePermissionEntity result = new DmsFilePermissionEntity(); result.setId(UUID.randomUUID()); result.setResourceId(resourceId); result.setPrincipalType("USER"); result.setPrincipalId(USER_ID); result.setValidFrom(new Date(System.currentTimeMillis() - 60_000)); result.setUsedCount(0L); result.setCreatedAt(new Date()); return result; } private static DmsPermissionGrantVO toVO(DmsFilePermissionEntity permission) { DmsPermissionGrantVO result = new DmsPermissionGrantVO(); result.setId(permission.getId()); result.setResourceId(permission.getResourceId()); result.setPrincipalType(permission.getPrincipalType()); result.setPrincipalId(permission.getPrincipalId()); return result; } private static class Fixture { private final DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class); private final DmsPermissionProperties properties = new DmsPermissionProperties(); private final DmsCursorCodec cursorCodec = new DmsCursorCodec(); private final DmsFilePermissionMapper permissionMapper = mock(DmsFilePermissionMapper.class); private final DmsPermissionGroupMapper permissionGroupMapper = mock(DmsPermissionGroupMapper.class); private final DmsPermissionUsageMapper usageMapper = mock(DmsPermissionUsageMapper.class); private final DmsPermissionGrantService grantService = mock(DmsPermissionGrantService.class); private final DmsResourceResolver resourceResolver = mock(DmsResourceResolver.class); private final DmsPermissionMatcher matcher = mock(DmsPermissionMatcher.class); private final DmsUserDisplayNameResolver userDisplayNameResolver = mock(DmsUserDisplayNameResolver.class); private final DmsPermissionAdminQueryService service = new DmsPermissionAdminQueryService( currentIdentity, properties, cursorCodec, permissionMapper, permissionGroupMapper, usageMapper, grantService, resourceResolver, matcher, userDisplayNameResolver); private Fixture() { when(currentIdentity.tenantId()).thenReturn(TENANT_ID); } } }