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/DmsFileCenterServiceTest.java |  142 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 142 insertions(+), 0 deletions(-)

diff --git a/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsFileCenterServiceTest.java b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsFileCenterServiceTest.java
new file mode 100644
index 0000000..f5a6b7e
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsFileCenterServiceTest.java
@@ -0,0 +1,142 @@
+package jnpf.dmsService;
+
+import jnpf.base.UserInfo;
+import jnpf.dmsEntity.permission.model.DmsSubjectSet;
+import jnpf.dmsEntity.permission.vo.DmsCursorPageVO;
+import jnpf.dmsEntity.permission.vo.DmsFileCenterItemVO;
+import jnpf.dmsMapper.DmsFileCenterMapper;
+import jnpf.dmsPermission.DmsCurrentIdentity;
+import jnpf.dmsPermission.DmsFileCenterCursorCodec;
+import jnpf.dmsPermission.DmsFileCenterQuery;
+import jnpf.dmsPermission.DmsPermissionException;
+import jnpf.dmsPermission.DmsPermissionGroupMembershipResolver;
+import jnpf.dmsPermission.DmsPermissionProperties;
+import jnpf.dmsPermission.DmsSubjectResolver;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+
+import java.util.Arrays;
+import java.util.Collections;
+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.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+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.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+class DmsFileCenterServiceTest {
+
+    @Test
+    void resolvesOrdinaryUserSubjectsBeforeFolderQueryAndReturnsKeysetCursor() {
+        Fixture fixture = new Fixture(false);
+        DmsSubjectSet subjects = new DmsSubjectSet();
+        subjects.getDirectOrgIds().add("org-direct");
+        subjects.getAncestorOrgIds().add("org-parent");
+        subjects.getPositionIds().add("position-1");
+        subjects.getRoleIds().add("role-1");
+        subjects.getPermissionGroupIds().add("group-1");
+        when(fixture.subjectResolver.resolve(fixture.user)).thenReturn(subjects);
+
+        DmsFileCenterItemVO first = folder("A", fixture.firstId);
+        DmsFileCenterItemVO second = folder("B", fixture.secondId);
+        DmsFileCenterItemVO overflow = folder("C", fixture.thirdId);
+        when(fixture.mapper.selectFolders(any())).thenReturn(Arrays.asList(first, second, overflow));
+
+        DmsCursorPageVO<DmsFileCenterItemVO> result = fixture.service.rootFolders(null, 2);
+
+        assertEquals(Arrays.asList(first, second), result.getList());
+        assertTrue(result.isHasMore());
+        assertNotNull(result.getNextCursor());
+        verify(fixture.groupResolver).resolveAll(subjects, 1000);
+
+        ArgumentCaptor<DmsFileCenterQuery> queryCaptor = ArgumentCaptor.forClass(DmsFileCenterQuery.class);
+        verify(fixture.mapper).selectFolders(queryCaptor.capture());
+        DmsFileCenterQuery query = queryCaptor.getValue();
+        assertFalse(query.isAdministrator());
+        assertEquals(3, query.getLimit());
+        assertEquals(Collections.singletonList("org-direct"), query.getDirectOrgIds());
+        assertEquals(Collections.singletonList("org-parent"), query.getAncestorOrgIds());
+        assertEquals(Collections.singletonList("position-1"), query.getPositionIds());
+        assertEquals(Collections.singletonList("role-1"), query.getRoleIds());
+        assertEquals(Collections.singletonList("group-1"), query.getPermissionGroupIds());
+    }
+
+    @Test
+    void administratorSkipsSubjectAndPermissionGroupResolution() {
+        Fixture fixture = new Fixture(true);
+        when(fixture.mapper.selectCurrentDocuments(any())).thenReturn(Collections.emptyList());
+
+        DmsCursorPageVO<DmsFileCenterItemVO> result = fixture.service.currentDocuments(
+                fixture.folderId, null, null, "  report  ");
+
+        assertFalse(result.isHasMore());
+        assertEquals(Collections.emptyList(), result.getList());
+        verify(fixture.subjectResolver, never()).resolve(any());
+        verify(fixture.groupResolver, never()).resolveAll(any(), any(Integer.class));
+
+        ArgumentCaptor<DmsFileCenterQuery> queryCaptor = ArgumentCaptor.forClass(DmsFileCenterQuery.class);
+        verify(fixture.mapper).selectCurrentDocuments(queryCaptor.capture());
+        assertTrue(queryCaptor.getValue().isAdministrator());
+        assertEquals("report", queryCaptor.getValue().getKeyword());
+        assertEquals(21, queryCaptor.getValue().getLimit());
+    }
+
+    @Test
+    void rejectsUnknownSharedCenterBeforeCallingMapper() {
+        Fixture fixture = new Fixture(true);
+
+        assertThrows(DmsPermissionException.class,
+                () -> fixture.service.sharedDocuments("ARCHIVE", null, 20));
+
+        verify(fixture.mapper, never()).selectSharedDocuments(any());
+        verify(fixture.mapper, never()).selectSharedHistoricalVersions(any());
+    }
+
+    private static DmsFileCenterItemVO folder(String name, UUID id) {
+        DmsFileCenterItemVO value = new DmsFileCenterItemVO();
+        value.setId(id);
+        value.setName(name);
+        value.setResourceType("Folder");
+        return value;
+    }
+
+    private static class Fixture {
+        private final UUID folderId = UUID.fromString("018f0000-0000-7000-8000-000000000201");
+        private final UUID firstId = UUID.fromString("018f0000-0000-7000-8000-000000000202");
+        private final UUID secondId = UUID.fromString("018f0000-0000-7000-8000-000000000203");
+        private final UUID thirdId = UUID.fromString("018f0000-0000-7000-8000-000000000204");
+        private final UserInfo user = new UserInfo();
+        private final DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class);
+        private final DmsSubjectResolver subjectResolver = mock(DmsSubjectResolver.class);
+        private final DmsPermissionGroupMembershipResolver groupResolver =
+                mock(DmsPermissionGroupMembershipResolver.class);
+        private final DmsPermissionProperties properties = properties();
+        private final DmsFileCenterCursorCodec cursorCodec = new DmsFileCenterCursorCodec(properties);
+        private final DmsFileCenterMapper mapper = mock(DmsFileCenterMapper.class);
+        private final DmsFileCenterService service = new DmsFileCenterService(
+                currentIdentity, subjectResolver, groupResolver, properties, cursorCodec, mapper);
+
+        private Fixture(boolean administrator) {
+            user.setUserId("user-1");
+            user.setTenantId("tenant-1");
+            when(currentIdentity.requireUser()).thenReturn(user);
+            when(currentIdentity.tenantId(user)).thenReturn("tenant-1");
+            when(currentIdentity.isPermissionAdministrator()).thenReturn(administrator);
+        }
+
+        private static DmsPermissionProperties properties() {
+            DmsPermissionProperties value = new DmsPermissionProperties();
+            value.setDefaultPageSize(20);
+            value.setMaxPageSize(100);
+            value.setMaxPermissionGroupScan(1000);
+            value.setCursorSigningSecret("0123456789abcdef0123456789abcdef");
+            return value;
+        }
+    }
+}

--
Gitblit v1.8.0