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

diff --git a/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsPermission/DmsPermissionMatcherTest.java b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsPermission/DmsPermissionMatcherTest.java
new file mode 100644
index 0000000..3d8ba2b
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsPermission/DmsPermissionMatcherTest.java
@@ -0,0 +1,121 @@
+package jnpf.dmsPermission;
+
+import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity;
+import jnpf.dmsEntity.permission.model.DmsResourcePath;
+import jnpf.dmsEntity.permission.model.DmsSubjectSet;
+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 DmsPermissionMatcherTest {
+    private final DmsPermissionMatcher matcher = new DmsPermissionMatcher();
+    private final UUID root = UUID.randomUUID();
+    private final UUID child = UUID.randomUUID();
+    private final UUID document = UUID.randomUUID();
+    private final UUID version = UUID.randomUUID();
+
+    @Test
+    void folderSelfCoversDirectDocumentButNotChildFolder() {
+        DmsFilePermissionEntity permission = permission("FOLDER", root, "SELF", "USER", "u1", false);
+        DmsSubjectSet subjects = user("u1");
+
+        assertTrue(matcher.matches(permission, documentPath(root), subjects));
+        assertFalse(matcher.matches(permission, folderPath(child, root), subjects));
+    }
+
+    @Test
+    void folderSubtreeCoversDescendantVersion() {
+        DmsFilePermissionEntity permission = permission("FOLDER", root, "SUBTREE", "USER", "u1", false);
+        assertTrue(matcher.matches(permission, versionPath(child, root), user("u1")));
+    }
+
+    @Test
+    void documentSelfCoversAllItsVersions() {
+        DmsFilePermissionEntity permission = permission("DOCUMENT", document, "SELF", "USER", "u1", false);
+        assertTrue(matcher.matches(permission, versionPath(child, root), user("u1")));
+    }
+
+    @Test
+    void fileVersionDoesNotCoverAnotherVersion() {
+        DmsFilePermissionEntity permission = permission("FILE_VERSION", version, "SELF", "USER", "u1", false);
+        DmsResourcePath other = versionPath(child, root);
+        other.setActualResourceId(UUID.randomUUID());
+        assertFalse(matcher.matches(permission, other, user("u1")));
+    }
+
+    @Test
+    void childOrganizationRequiresIncludeChildOrgs() {
+        DmsSubjectSet subjects = user("u1");
+        subjects.getDirectOrgIds().add("child-org");
+        subjects.getAncestorOrgIds().addAll(Arrays.asList("child-org", "root-org"));
+        DmsFilePermissionEntity directOnly = permission("DOCUMENT", document, "SELF", "ORG", "root-org", false);
+        DmsFilePermissionEntity descendants = permission("DOCUMENT", document, "SELF", "ORG", "root-org", true);
+
+        assertFalse(matcher.matches(directOnly, documentPath(child), subjects));
+        assertTrue(matcher.matches(descendants, documentPath(child), subjects));
+    }
+
+    @Test
+    void dmsGroupUsesResolvedPermissionGroupsOnly() {
+        DmsSubjectSet subjects = user("u1");
+        subjects.getPlatformGroupIds().add("g1");
+        DmsFilePermissionEntity permission = permission("DOCUMENT", document, "SELF", "GROUP", "g1", false);
+
+        assertFalse(matcher.matches(permission, documentPath(child), subjects));
+        subjects.getPermissionGroupIds().add("g1");
+        assertTrue(matcher.matches(permission, documentPath(child), subjects));
+    }
+
+    private DmsFilePermissionEntity permission(String type, UUID resourceId, String scope,
+                                                String principalType, String principalId, boolean childOrgs) {
+        DmsFilePermissionEntity result = new DmsFilePermissionEntity();
+        result.setResourceType(type);
+        result.setResourceId(resourceId);
+        result.setResourceScope(scope);
+        result.setPrincipalType(principalType);
+        result.setPrincipalId(principalId);
+        result.setIncludeChildOrgs(childOrgs);
+        return result;
+    }
+
+    private DmsSubjectSet user(String id) {
+        DmsSubjectSet result = new DmsSubjectSet();
+        result.setUserId(id);
+        return result;
+    }
+
+    private DmsResourcePath folderPath(UUID actual, UUID... ancestors) {
+        DmsResourcePath result = new DmsResourcePath();
+        result.setActualResourceType("FOLDER");
+        result.setActualResourceId(actual);
+        result.setDirectFolderId(actual);
+        result.getFolderPath().add(actual);
+        result.getFolderPath().addAll(Arrays.asList(ancestors));
+        return result;
+    }
+
+    private DmsResourcePath documentPath(UUID folder) {
+        DmsResourcePath result = new DmsResourcePath();
+        result.setActualResourceType("DOCUMENT");
+        result.setActualResourceId(document);
+        result.setDocumentId(document);
+        result.setDirectFolderId(folder);
+        result.getFolderPath().add(folder);
+        return result;
+    }
+
+    private DmsResourcePath versionPath(UUID folder, UUID... ancestors) {
+        DmsResourcePath result = new DmsResourcePath();
+        result.setActualResourceType("FILE_VERSION");
+        result.setActualResourceId(version);
+        result.setDocumentId(document);
+        result.setDirectFolderId(folder);
+        result.getFolderPath().add(folder);
+        result.getFolderPath().addAll(Arrays.asList(ancestors));
+        return result;
+    }
+}

--
Gitblit v1.8.0