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

diff --git a/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsMapper/DmsFileCenterMapperSqlTest.java b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsMapper/DmsFileCenterMapperSqlTest.java
new file mode 100644
index 0000000..9384132
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsMapper/DmsFileCenterMapperSqlTest.java
@@ -0,0 +1,119 @@
+package jnpf.dmsMapper;
+
+import jnpf.dmsDatabase.DmsUuidTypeHandler;
+import jnpf.dmsPermission.DmsFileCenterQuery;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.session.Configuration;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.UUID;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class DmsFileCenterMapperSqlTest {
+    private Configuration configuration;
+
+    @BeforeEach
+    void setUp() {
+        configuration = new Configuration();
+        configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class);
+        configuration.addMapper(DmsFileCenterMapper.class);
+    }
+
+    @Test
+    void ordinaryFolderPageFiltersPermissionsBeforeStableLimit() {
+        String sql = sql("selectFolders", query(false));
+
+        assertTrue(sql.contains("FROM public.dms_file_permissions p"));
+        assertTrue(sql.contains("authorized_navigation_ancestors"));
+        assertTrue(sql.contains("SELECT granted.id, granted.parent_id"));
+        assertTrue(sql.contains("UNION SELECT parent.id, parent.parent_id FROM authorized_navigation_ancestors child"));
+        assertTrue(sql.contains("OR f.id IN (SELECT id FROM authorized_navigation_ancestors)"));
+        assertTrue(sql.contains("p.principal_type = 'USER'"));
+        assertTrue(sql.contains("p.principal_type = 'ORG'"));
+        assertTrue(sql.contains("p.principal_type = 'POSITION'"));
+        assertTrue(sql.contains("p.principal_type = 'ROLE'"));
+        assertTrue(sql.contains("p.principal_type = 'GROUP'"));
+        assertTrue(sql.contains("p.resource_scope = 'SUBTREE'"));
+        assertTrue(sql.contains("ORDER BY f.name, f.id LIMIT ?"));
+        assertTrue(sql.indexOf("dms_file_permissions") < sql.indexOf("LIMIT ?"));
+        assertFalse(sql.contains("SELECT *"));
+    }
+
+    @Test
+    void administratorFolderPageDoesNotRequireAllowRows() {
+        String sql = sql("selectFolders", query(true));
+
+        assertFalse(sql.contains("dms_file_permissions"));
+        assertFalse(sql.contains("authorized_navigation_ancestors"));
+        assertTrue(sql.contains("ORDER BY f.name, f.id LIMIT ?"));
+    }
+
+    @Test
+    void currentDocumentPageUsesEffectiveWindowFolderReadAndExclusionPriority() {
+        String sql = sql("selectCurrentDocuments", query(false));
+
+        assertTrue(sql.contains("s.lifecycle_status = 'EFFECTIVE'"));
+        assertTrue(sql.contains("s.effective_from <= CURRENT_TIMESTAMP"));
+        assertTrue(sql.contains("CURRENT_TIMESTAMP < s.effective_to"));
+        assertTrue(sql.contains("NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e"));
+        assertTrue(sql.contains("p.resource_type = 'FOLDER'"));
+        assertFalse(sql.contains("p.resource_type = 'DOCUMENT'"));
+        assertTrue(sql.contains("ORDER BY d.name, d.id LIMIT ?"));
+    }
+
+    @Test
+    void historicalPageUsesOnlyExplicitTerminalStatesAndMixedKeyset() {
+        DmsFileCenterQuery query = query(false);
+        query.setCursorName("A");
+        query.setCursorDocumentId(UUID.fromString("018f0000-0000-7000-8000-000000000701"));
+        query.setCursorVersionNo(3L);
+        query.setCursorId(UUID.fromString("018f0000-0000-7000-8000-000000000702"));
+
+        String sql = sql("selectHistoricalVersions", query);
+
+        assertTrue(sql.contains("IN ('SUPERSEDED', 'EXPIRED', 'REVOKED', 'INVALIDATED', 'OBSOLETE')"));
+        assertFalse(sql.contains("PENDING_EFFECTIVE"));
+        assertTrue(sql.contains("v.version_no < ?"));
+        assertTrue(sql.contains("v.id < ?"));
+        assertTrue(sql.contains("ORDER BY d.name, d.id, v.version_no DESC, v.id DESC LIMIT ?"));
+    }
+
+    @Test
+    void sharedPageUsesOnlyDirectDocumentOrVersionAllow() {
+        String sql = sql("selectSharedHistoricalVersions", query(false));
+
+        assertTrue(sql.contains("p.resource_type = 'DOCUMENT'"));
+        assertTrue(sql.contains("p.resource_type = 'FILE_VERSION'"));
+        assertFalse(sql.contains("p.resource_type = 'FOLDER'"));
+        assertTrue(sql.contains("dms_access_exclusions"));
+    }
+
+    private DmsFileCenterQuery query(boolean administrator) {
+        DmsFileCenterQuery query = new DmsFileCenterQuery();
+        query.setTenantId("tenant-1");
+        query.setUserId("user-1");
+        query.setAdministrator(administrator);
+        query.setParentId(UUID.fromString("018f0000-0000-7000-8000-000000000601"));
+        query.setFolderId(UUID.fromString("018f0000-0000-7000-8000-000000000601"));
+        query.setDocumentId(UUID.fromString("018f0000-0000-7000-8000-000000000602"));
+        query.setDirectOrgIds(Arrays.asList("org-1"));
+        query.setAncestorOrgIds(Arrays.asList("org-1", "org-root"));
+        query.setPositionIds(Arrays.asList("position-1"));
+        query.setRoleIds(Arrays.asList("role-1"));
+        query.setPermissionGroupIds(Arrays.asList("group-1"));
+        query.setLimit(51);
+        return query;
+    }
+
+    private String sql(String method, DmsFileCenterQuery query) {
+        MappedStatement statement = configuration.getMappedStatement(
+                DmsFileCenterMapper.class.getName() + "." + method);
+        BoundSql boundSql = statement.getBoundSql(java.util.Collections.singletonMap("q", query));
+        return boundSql.getSql().replaceAll("\\s+", " ").trim();
+    }
+}

--
Gitblit v1.8.0