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-file/jnpf-file-storage/src/test/java/jnpf/fileStorage/dms/DmsFileStorageServiceTest.java |  187 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 187 insertions(+), 0 deletions(-)

diff --git a/jnpf-file/jnpf-file-storage/src/test/java/jnpf/fileStorage/dms/DmsFileStorageServiceTest.java b/jnpf-file/jnpf-file-storage/src/test/java/jnpf/fileStorage/dms/DmsFileStorageServiceTest.java
new file mode 100644
index 0000000..d391d43
--- /dev/null
+++ b/jnpf-file/jnpf-file-storage/src/test/java/jnpf/fileStorage/dms/DmsFileStorageServiceTest.java
@@ -0,0 +1,187 @@
+package jnpf.fileStorage.dms;
+
+import jnpf.base.ActionResult;
+import jnpf.config.ConfigValueUtil;
+import jnpf.dms.DmsResourceApi;
+import jnpf.dmsEntity.storage.form.DmsFileRevisionRegisterForm;
+import jnpf.dmsEntity.storage.form.DmsFileUploadRegisterForm;
+import jnpf.dmsEntity.storage.vo.DmsFileUploadVO;
+import jnpf.exception.DataException;
+import org.dromara.x.file.storage.core.FileInfo;
+import org.dromara.x.file.storage.core.FileStorageService;
+import org.dromara.x.file.storage.core.hash.HashInfo;
+import org.dromara.x.file.storage.core.platform.MinioFileStorage;
+import org.dromara.x.file.storage.core.upload.UploadPretreatment;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.time.LocalDate;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class DmsFileStorageServiceTest {
+
+    @Test
+    public void uploadsToDedicatedSeaweedFsPlatformAndRegistersDmsResources() {
+        Fixture fixture = new Fixture();
+        DmsFileUploadVO registered = fixture.registeredViewForStoredObject();
+        ActionResult<DmsFileUploadVO> response = mock(ActionResult.class);
+        when(response.getCode()).thenReturn(200);
+        when(response.getData()).thenReturn(registered);
+        when(fixture.dmsResourceApi.registerUpload(anyString(), fixture.formCaptor.capture()))
+                .thenReturn(response);
+
+        DmsFileUploadVO result = fixture.upload();
+
+        assertEquals(registered, result);
+        verify(fixture.upload).setPlatform("seaweedfs-1");
+        verify(fixture.upload).setHashCalculatorSha256();
+        DmsFileUploadRegisterForm form = fixture.formCaptor.getValue();
+        assertEquals(fixture.folderId, form.getFolderId());
+        assertEquals("MM-R02", form.getDocumentNo());
+        assertEquals("璐ㄩ噺鎵嬪唽", form.getDocumentName());
+        assertEquals("QUALITY_MANUAL", form.getDocumentType());
+        assertEquals("dept-quality", form.getResponsibleDeptId());
+        assertEquals("D(00)", form.getVersionLabel());
+        assertEquals("author-1", form.getPreparedBy());
+        assertEquals(LocalDate.of(2026, 8, 21), form.getPreparedOn());
+        assertEquals("seaweedfs-1", form.getStoragePlatform());
+        assertEquals("jnpf-dms", form.getBucketName());
+        assertEquals("a".repeat(64), form.getChecksumSha256());
+        assertTrue(form.getDocumentId().version() == 7);
+    }
+
+    @Test
+    public void deletesStoredObjectWhenDmsRegistrationFails() {
+        Fixture fixture = new Fixture();
+        ActionResult<DmsFileUploadVO> response = mock(ActionResult.class);
+        when(response.getCode()).thenReturn(400);
+        when(response.getMsg()).thenReturn("DMS rejected");
+        when(fixture.dmsResourceApi.registerUpload(anyString(), fixture.formCaptor.capture()))
+                .thenReturn(response);
+        when(fixture.fileStorageService.delete(fixture.stored)).thenReturn(true);
+
+        assertThrows(DataException.class,
+                fixture::upload);
+
+        verify(fixture.fileStorageService).delete(fixture.stored);
+    }
+
+    @Test
+    public void uploadsRevisionToSameDocumentAndRegistersNewVersion() {
+        Fixture fixture = new Fixture();
+        DmsFileUploadVO registered = fixture.registeredViewForStoredObject();
+        ActionResult<DmsFileUploadVO> response = mock(ActionResult.class);
+        when(response.getCode()).thenReturn(200);
+        when(response.getData()).thenReturn(registered);
+        when(fixture.dmsResourceApi.registerRevision(anyString(), fixture.revisionCaptor.capture()))
+                .thenReturn(response);
+
+        DmsFileUploadVO result = fixture.revise();
+
+        assertEquals(registered, result);
+        verify(fixture.upload).setPlatform("seaweedfs-1");
+        DmsFileRevisionRegisterForm form = fixture.revisionCaptor.getValue();
+        assertEquals(fixture.documentId, form.getDocumentId());
+        assertEquals(fixture.baseVersionId, form.getBaseFileVersionId());
+        assertEquals("D(01)", form.getVersionLabel());
+        assertEquals("鏇存柊璐ㄩ噺鑱岃矗", form.getRevisionReason());
+        assertEquals("author-2", form.getPreparedBy());
+        assertEquals(LocalDate.of(2026, 8, 22), form.getPreparedOn());
+        assertTrue(form.getFileVersionId().version() == 7);
+        assertTrue(form.getFileObjectId().version() == 7);
+    }
+
+    @Test
+    public void deletesRevisionObjectWhenDmsRegistrationFails() {
+        Fixture fixture = new Fixture();
+        ActionResult<DmsFileUploadVO> response = mock(ActionResult.class);
+        when(response.getCode()).thenReturn(400);
+        when(response.getMsg()).thenReturn("current version changed");
+        when(fixture.dmsResourceApi.registerRevision(anyString(), fixture.revisionCaptor.capture()))
+                .thenReturn(response);
+        when(fixture.fileStorageService.delete(fixture.stored)).thenReturn(true);
+
+        assertThrows(DataException.class, fixture::revise);
+
+        verify(fixture.fileStorageService).delete(fixture.stored);
+    }
+
+    private static class Fixture {
+        private final UUID folderId = UUID.fromString("018f0000-0000-7000-8000-000000000401");
+        private final UUID documentId = UUID.fromString("018f0000-0000-7000-8000-000000000402");
+        private final UUID baseVersionId = UUID.fromString("018f0000-0000-7000-8000-000000000403");
+        private final FileStorageService fileStorageService = mock(FileStorageService.class);
+        private final DmsResourceApi dmsResourceApi = mock(DmsResourceApi.class);
+        private final ConfigValueUtil configValueUtil = mock(ConfigValueUtil.class);
+        private final MultipartFile file = mock(MultipartFile.class);
+        private final UploadPretreatment upload = mock(UploadPretreatment.class);
+        private final MinioFileStorage minio = mock(MinioFileStorage.class);
+        private final FileInfo stored = storedFile();
+        private final ArgumentCaptor<DmsFileUploadRegisterForm> formCaptor =
+                ArgumentCaptor.forClass(DmsFileUploadRegisterForm.class);
+        private final ArgumentCaptor<DmsFileRevisionRegisterForm> revisionCaptor =
+                ArgumentCaptor.forClass(DmsFileRevisionRegisterForm.class);
+        private final DmsFileStorageService service =
+                new DmsFileStorageService(fileStorageService, dmsResourceApi, configValueUtil);
+
+        private Fixture() {
+            when(file.isEmpty()).thenReturn(false);
+            when(file.getOriginalFilename()).thenReturn("report.txt");
+            when(configValueUtil.getAllowUploadFileType()).thenReturn("txt,pdf,doc,docx");
+            when(fileStorageService.getFileStorageVerify("seaweedfs-1")).thenReturn(minio);
+            when(fileStorageService.getFileStorage("seaweedfs-1")).thenReturn(minio);
+            when(minio.getBucketName()).thenReturn("jnpf-dms");
+            when(fileStorageService.of(file)).thenReturn(upload);
+            when(upload.setPlatform("seaweedfs-1")).thenReturn(upload);
+            when(upload.setPath(anyString())).thenReturn(upload);
+            when(upload.setSaveFilename(anyString())).thenReturn(upload);
+            when(upload.setOriginalFilename("report.txt")).thenReturn(upload);
+            when(upload.setHashCalculatorSha256()).thenReturn(upload);
+            when(upload.upload()).thenReturn(stored);
+        }
+
+        private DmsFileUploadVO registeredViewForStoredObject() {
+            DmsFileUploadVO view = new DmsFileUploadVO();
+            view.setStoragePlatform(stored.getPlatform());
+            view.setBasePath(stored.getBasePath());
+            view.setObjectPath(stored.getPath());
+            view.setObjectName(stored.getFilename());
+            return view;
+        }
+
+        private DmsFileUploadVO upload() {
+            return service.upload(folderId, "source-1", "MM-R02", "璐ㄩ噺鎵嬪唽",
+                    "QUALITY_MANUAL", "dept-quality", "D(00)", "author-1",
+                    LocalDate.of(2026, 8, 21), file);
+        }
+
+        private DmsFileUploadVO revise() {
+            return service.revise(documentId, baseVersionId, "revision-1", "D(01)",
+                    "author-2", LocalDate.of(2026, 8, 22), "鏇存柊璐ㄩ噺鑱岃矗", file);
+        }
+
+        private static FileInfo storedFile() {
+            HashInfo hashInfo = new HashInfo();
+            hashInfo.put("SHA-256", "a".repeat(64));
+            FileInfo info = new FileInfo();
+            info.setPlatform("seaweedfs-1");
+            info.setBasePath("dms/");
+            info.setPath("2026/08/17/document/");
+            info.setFilename("version.txt");
+            info.setOriginalFilename("report.txt");
+            info.setContentType("text/plain");
+            info.setSize(12L);
+            info.setHashInfo(hashInfo);
+            return info;
+        }
+    }
+}

--
Gitblit v1.8.0