package jnpf.bizcommon.onlyoffice.service.impl; import jnpf.base.UserInfo; import jnpf.base.model.uploadedit.UploadEditLease; import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeConfigParam; import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeProperties; import jnpf.exception.DataException; import org.junit.Before; import org.junit.Test; import java.util.Map; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class UploadEditSceneConfigBuilderTest { private UploadEditSceneConfigBuilder builder; private UploadEditSessionSupport support; private OnlyOfficeSceneBuildContext context; private UploadEditLease lease; private DmsQianpiyeTicketIssuer ticketIssuer; @Before public void setup() { jnpf.util.context.SpringContext.setApplicationContext(mock(org.springframework.context.ApplicationContext.class)); support = mock(UploadEditSessionSupport.class); OnlyOfficeProperties properties = new OnlyOfficeProperties(); properties.getUploadFile().setEditEnabled(true); ticketIssuer = mock(DmsQianpiyeTicketIssuer.class); builder = new UploadEditSceneConfigBuilder(support, properties, ticketIssuer); OnlyOfficeConfigParam param = new OnlyOfficeConfigParam(); param.setFileType("annex"); param.setMode("edit"); param.setFileId("lease"); param.setBizDataId("draft"); param.setFileName("test.docx"); UserInfo user = new UserInfo(); user.setUserId("owner"); context = new OnlyOfficeSceneBuildContext(param, null, user, "tenant"); lease = new UploadEditLease(); lease.setLeaseId("lease"); lease.setDraftId("draft"); lease.setFile(Map.of("fileId", "physical-file", "name", "test.docx")); when(support.lease("tenant", "owner", "lease")).thenReturn(lease); } private void denied() { try { builder.build(context); fail("expected denial"); } catch (DataException expected) { } } @Test public void authorizedLeaseUsesOriginalPhysicalSource() { OnlyOfficeSceneBuildPlan plan = builder.build(context); assertEquals("physical-file", plan.sourceFileId()); assertTrue(plan.canEdit()); assertFalse(plan.uploadQianpiyeAnnotatorEnabled()); assertFalse(plan.uploadFileAllowDownload()); verify(support).lease("tenant", "owner", "lease"); } @Test public void enabledPluginUsesPhysicalSourceAndDmsTicketContext() { lease.setQianpiyeAnnotatorEnabled(true); when(ticketIssuer.issue(any(), any(), any())).thenReturn("signed-ticket"); OnlyOfficeSceneBuildPlan plan = builder.build(context); assertTrue(plan.uploadQianpiyeAnnotatorEnabled()); Map pluginContext = new java.util.LinkedHashMap<>(); plan.customizePluginContext("dms-qianpiye-annotator", "asc.{C764F7D6-055D-4C7D-97FD-83D2C4440585}", pluginContext, true); assertEquals(true, pluginContext.get("canAnnotate")); assertEquals("onlyoffice:dms-qianpiye", pluginContext.get("scope")); assertEquals("signed-ticket", pluginContext.get("ticket")); verify(ticketIssuer).issue(argThat(param -> "physical-file".equals(param.getFileId()) && "dms.qianpiye".equals(param.getBizScene()) && "dms".equals(param.getBizModule())), eq(context.getUser()), any()); } @Test public void replacedLeaseUsesTheCurrentPhysicalFile() { lease.setFile(Map.of("fileId", "replacement", "name", "test.docx")); lease.setAllowDownload(true); OnlyOfficeSceneBuildPlan plan = builder.build(context); assertEquals("replacement", plan.sourceFileId()); assertTrue(plan.uploadFileAllowDownload()); } @Test public void failedLeaseAuthorizationCannotProduceConfig() { when(support.lease(any(), any(), any())).thenThrow(new DataException("revoked")); denied(); } @Test public void wrongFilenameRejected() { context.getParam().setFileName("other.docx"); denied(); } @Test public void wrongDraftRejected() { context.getParam().setBizDataId("other"); denied(); } }