package jnpf.bizcommon.onlyoffice.service.impl; import jnpf.dmsEntity.preview.model.DmsFilePreviewTicket; import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeProperties; import jnpf.exception.DataException; import jnpf.onlyoffice.DmsPreviewPdfRequest; import jnpf.util.JsonUtil; import org.junit.Test; import java.util.UUID; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class DmsOnlyOfficePreviewServiceTest { private static final UUID VERSION_ID = UUID.fromString("018f0000-0000-7000-8000-000000000702"); @Test public void convertsBaseOnceAndStampsPreviewWatermarks() { DmsFilePreviewTicket ticket = ticket(DmsFilePreviewTicket.SCOPE); byte[] base = new byte[]{1, 2}; byte[] result = new byte[]{3, 4}; StubRenderer renderer = new StubRenderer(base); StubComposer composer = new StubComposer(result); DmsOnlyOfficePreviewService service = new DmsOnlyOfficePreviewService(renderer, composer, value -> JsonUtil.getObjectToString(ticket)); assertArrayEquals(result, service.render( new DmsPreviewPdfRequest(VERSION_ID, "source-ticket"))); assertEquals(1, renderer.calls); assertEquals(1, composer.calls); assertEquals(ticket, composer.ticket); } @Test public void rejectsPrintTicketForPreviewConversion() { DmsFilePreviewTicket ticket = ticket(DmsFilePreviewTicket.PRINT_SCOPE); DmsOnlyOfficePreviewService service = new DmsOnlyOfficePreviewService( new StubRenderer(new byte[]{1}), new StubComposer(new byte[]{2}), value -> JsonUtil.getObjectToString(ticket)); try { service.render(new DmsPreviewPdfRequest(VERSION_ID, "source-ticket")); fail("expected preview scope validation"); } catch (DataException expected) { assertEquals("DMS 预览票据与文件版本不匹配", expected.getMessage()); } } private DmsFilePreviewTicket ticket(String scope) { DmsFilePreviewTicket ticket = new DmsFilePreviewTicket(); ticket.setScope(scope); ticket.setTenantId("tenant-1"); ticket.setUserId("user-1"); ticket.setFileVersionId(VERSION_ID); ticket.setFileName("quality-manual.docx"); ticket.setStoragePlatform("seaweedfs-1"); ticket.setBucketName("jnpf-dms"); ticket.setObjectPath("2026/08/24/document/"); ticket.setObjectName("quality-manual-v1.docx"); ticket.setExpiresAt(System.currentTimeMillis() + 60_000L); return ticket; } private static final class StubRenderer extends OnlyOfficeDmsPrintRenderer { private final byte[] result; private int calls; private StubRenderer(byte[] result) { super(new OnlyOfficeProperties()); this.result = result; } @Override public byte[] renderBase(DmsFilePreviewTicket ticket, String accessTicket) { calls++; return result; } } private static final class StubComposer extends DmsOnlyOfficePrintPdfComposer { private final byte[] result; private int calls; private DmsFilePreviewTicket ticket; private StubComposer(byte[] result) { super(new OnlyOfficeProperties()); this.result = result; } @Override public byte[] composePreview(byte[] basePdf, DmsFilePreviewTicket ticket) { calls++; this.ticket = ticket; return result; } } }