From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsPermissionAdminQueryServiceTest.java |  143 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 143 insertions(+), 0 deletions(-)

diff --git a/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsPermissionAdminQueryServiceTest.java b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsPermissionAdminQueryServiceTest.java
new file mode 100644
index 0000000..8970171
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsPermissionAdminQueryServiceTest.java
@@ -0,0 +1,143 @@
+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, "杩愯惀鐢ㄦ埛锛坹unying1锛�"));
+
+        DmsCursorPageVO<DmsPermissionGrantVO> result = fixture.service.grants(
+                null, null, null, null, 10);
+
+        assertEquals(1, result.getList().size());
+        assertEquals("杩愯惀鐢ㄦ埛锛坹unying1锛�", 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, "杩愯惀鐢ㄦ埛锛坹unying1锛�"));
+
+        DmsPermissionGrantVO result = fixture.service.grant(permission.getId());
+
+        assertEquals("杩愯惀鐢ㄦ埛锛坹unying1锛�", 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<UUID> 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, "杩愯惀鐢ㄦ埛锛坹unying1锛�"));
+
+        List<DmsPermissionGrantVO> result = fixture.service.resourceGrants(
+                DmsResourceType.FOLDER, selectedResourceId);
+
+        assertEquals(2, result.size());
+        assertFalse(result.get(0).isInherited());
+        assertTrue(result.get(1).isInherited());
+        assertEquals("杩愯惀鐢ㄦ埛锛坹unying1锛�", result.get(0).getPrincipalName());
+        assertEquals("杩愯惀鐢ㄦ埛锛坹unying1锛�", 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);
+        }
+    }
+}

--
Gitblit v1.8.0