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

diff --git a/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsResourceServiceTest.java b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsResourceServiceTest.java
new file mode 100644
index 0000000..a12d3cd
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsResourceServiceTest.java
@@ -0,0 +1,152 @@
+package jnpf.dmsService;
+
+import jnpf.base.UserInfo;
+import jnpf.dmsEntity.permission.entity.DmsFolderEntity;
+import jnpf.dmsEntity.permission.entity.DmsPermissionResourceEntity;
+import jnpf.dmsEntity.permission.enums.DmsPermissionAction;
+import jnpf.dmsEntity.permission.enums.DmsResourceType;
+import jnpf.dmsEntity.permission.form.FolderCreateUserForm;
+import jnpf.dmsEntity.permission.vo.DmsPermissionResourceVO;
+import jnpf.dmsIntegration.audit.DmsAuditAdapter;
+import jnpf.dmsMapper.DmsDocumentMapper;
+import jnpf.dmsMapper.DmsFileVersionMapper;
+import jnpf.dmsMapper.DmsFolderMapper;
+import jnpf.dmsMapper.DmsPermissionResourceMapper;
+import jnpf.dmsPermission.DmsCurrentIdentity;
+import jnpf.dmsPermission.DmsPermissionError;
+import jnpf.dmsPermission.DmsPermissionException;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+
+import java.util.UUID;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+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 DmsResourceServiceTest {
+
+    @Test
+    void createsChildFolderAfterCheckingParentPermission() {
+        Fixture fixture = new Fixture();
+        FolderCreateUserForm form = fixture.form();
+        DmsPermissionResourceVO created = new DmsPermissionResourceVO();
+        created.setId(fixture.folderId);
+        when(fixture.resourceMapper.nextUuidV7()).thenReturn(fixture.folderId);
+        when(fixture.resourceMapper.selectView("tenant-1", fixture.folderId)).thenReturn(created);
+
+        DmsPermissionResourceVO result = fixture.service.createFolder(form);
+
+        assertSame(created, result);
+        verify(fixture.decisionService).requireAllowed(
+                DmsResourceType.FOLDER, fixture.parentId, DmsPermissionAction.CREATE);
+        verify(fixture.resourceMapper).lockSource(
+                "tenant-1", "SYSTEM", "web-folder:request-1");
+
+        ArgumentCaptor<DmsFolderEntity> folderCaptor = ArgumentCaptor.forClass(DmsFolderEntity.class);
+        verify(fixture.folderMapper).insert(folderCaptor.capture());
+        DmsFolderEntity folder = folderCaptor.getValue();
+        assertEquals(fixture.folderId, folder.getId());
+        assertEquals(fixture.parentId, folder.getParentId());
+        assertEquals("Child Folder", folder.getName());
+        assertEquals("tenant-1", folder.getTenantId());
+        assertEquals("user-1", folder.getCreatedBy());
+
+        ArgumentCaptor<DmsPermissionResourceEntity> registryCaptor =
+                ArgumentCaptor.forClass(DmsPermissionResourceEntity.class);
+        verify(fixture.resourceMapper).insert(registryCaptor.capture());
+        DmsPermissionResourceEntity registry = registryCaptor.getValue();
+        assertEquals(fixture.folderId, registry.getId());
+        assertEquals("FOLDER", registry.getResourceType());
+        assertEquals("SYSTEM", registry.getSourceType());
+        assertEquals("web-folder:request-1", registry.getSourceId());
+        assertEquals("jnpf-dms-web", registry.getRegisteredBy());
+        verify(fixture.permissionGrantService).ensureFolderCreatorCreatePermission(
+                "tenant-1", fixture.folderId, "user-1");
+    }
+
+    @Test
+    void returnsSameFolderForIdempotentRetry() {
+        Fixture fixture = new Fixture();
+        FolderCreateUserForm form = fixture.form();
+        DmsPermissionResourceEntity registry = new DmsPermissionResourceEntity();
+        registry.setId(fixture.folderId);
+        registry.setResourceType("FOLDER");
+        registry.setSourceType("SYSTEM");
+        registry.setSourceId("web-folder:request-1");
+        registry.setRegisteredBy("jnpf-dms-web");
+        DmsFolderEntity folder = new DmsFolderEntity();
+        folder.setId(fixture.folderId);
+        folder.setTenantId("tenant-1");
+        folder.setParentId(fixture.parentId);
+        folder.setName("Child Folder");
+        folder.setCreatedBy("user-1");
+        DmsPermissionResourceVO existing = new DmsPermissionResourceVO();
+        existing.setId(fixture.folderId);
+        when(fixture.resourceMapper.selectBySource(
+                "tenant-1", "SYSTEM", "web-folder:request-1")).thenReturn(registry);
+        when(fixture.folderMapper.selectByTenantAndId("tenant-1", fixture.folderId)).thenReturn(folder);
+        when(fixture.resourceMapper.selectView("tenant-1", fixture.folderId)).thenReturn(existing);
+
+        DmsPermissionResourceVO result = fixture.service.createFolder(form);
+
+        assertSame(existing, result);
+        verify(fixture.resourceMapper, never()).nextUuidV7();
+        verify(fixture.folderMapper, never()).insert(any(DmsFolderEntity.class));
+        verify(fixture.resourceMapper, never()).insert(any(DmsPermissionResourceEntity.class));
+        verify(fixture.permissionGrantService).ensureFolderCreatorCreatePermission(
+                "tenant-1", fixture.folderId, "user-1");
+    }
+
+    @Test
+    void rejectsRootFolderCreationFromWebApi() {
+        Fixture fixture = new Fixture();
+        FolderCreateUserForm form = fixture.form();
+        form.setParentId(null);
+
+        DmsPermissionException exception = assertThrows(
+                DmsPermissionException.class, () -> fixture.service.createFolder(form));
+
+        assertEquals(DmsPermissionError.INVALID_RESOURCE_PARENT, exception.getError());
+        verify(fixture.decisionService, never()).requireAllowed(any(), any(), any());
+        verify(fixture.folderMapper, never()).insert(any(DmsFolderEntity.class));
+        verify(fixture.permissionGrantService, never()).ensureFolderCreatorCreatePermission(any(), any(), any());
+    }
+
+    private static class Fixture {
+        private final UUID parentId = UUID.fromString("018f0000-0000-7000-8000-000000000401");
+        private final UUID folderId = UUID.fromString("018f0000-0000-7000-8000-000000000402");
+        private final DmsCurrentIdentity currentIdentity = mock(DmsCurrentIdentity.class);
+        private final DmsPermissionDecisionService decisionService = mock(DmsPermissionDecisionService.class);
+        private final DmsFolderMapper folderMapper = mock(DmsFolderMapper.class);
+        private final DmsDocumentMapper documentMapper = mock(DmsDocumentMapper.class);
+        private final DmsFileVersionMapper fileVersionMapper = mock(DmsFileVersionMapper.class);
+        private final DmsPermissionResourceMapper resourceMapper = mock(DmsPermissionResourceMapper.class);
+        private final DmsPermissionGrantService permissionGrantService = mock(DmsPermissionGrantService.class);
+        private final DmsAuditAdapter auditAdapter = mock(DmsAuditAdapter.class);
+        private final DmsResourceService service = new DmsResourceService(
+                currentIdentity, decisionService, folderMapper, documentMapper,
+                fileVersionMapper, resourceMapper, permissionGrantService, auditAdapter);
+
+        private Fixture() {
+            UserInfo user = new UserInfo();
+            user.setUserId("user-1");
+            user.setTenantId("tenant-1");
+            when(currentIdentity.requireUser()).thenReturn(user);
+            when(currentIdentity.tenantId(user)).thenReturn("tenant-1");
+        }
+
+        private FolderCreateUserForm form() {
+            FolderCreateUserForm form = new FolderCreateUserForm();
+            form.setParentId(parentId);
+            form.setName(" Child Folder ");
+            form.setSourceId("request-1");
+            return form;
+        }
+    }
+}

--
Gitblit v1.8.0