package jnpf.bizcommon.onlyoffice.service.impl; import jnpf.dmsEntity.preview.model.DmsFilePreviewTicket; import jnpf.exception.DataException; import jnpf.util.JsonUtil; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.junit.Test; import org.mockito.ArgumentCaptor; import java.io.ByteArrayOutputStream; import java.util.UUID; import static org.junit.Assert.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; public class DmsOnlyOfficePageCountServiceTest { private static final UUID VERSION = UUID.randomUUID(); private final OnlyOfficeDmsPrintRenderer renderer = mock(OnlyOfficeDmsPrintRenderer.class); @Test public void countsRenderedPagesFromPreparedPreviewSource() throws Exception { DmsFilePreviewTicket ticket = ticket(); byte[] pdf; try (PDDocument document = new PDDocument(); ByteArrayOutputStream output = new ByteArrayOutputStream()) { for (int page = 0; page < 19; page++) document.addPage(new PDPage()); document.save(output); pdf = output.toByteArray(); } when(renderer.render(any(), eq("preview-ticket"))).thenReturn(pdf); DmsOnlyOfficePageCountService service = service(ticket); assertEquals(19, service.getPageCount(VERSION, "preview-ticket")); ArgumentCaptor source = ArgumentCaptor.forClass(DmsFilePreviewTicket.class); verify(renderer).render(source.capture(), eq("preview-ticket")); assertEquals(ticket, source.getValue()); verify(renderer, never()).renderBase(any(), anyString()); } @Test public void rejectsInvalidTicketsBeforeRendering() { for (int scenario = 0; scenario < 4; scenario++) { DmsFilePreviewTicket ticket = ticket(); switch (scenario) { case 0: ticket.setExpiresAt(System.currentTimeMillis() - 1); break; case 1: ticket.setScope(DmsFilePreviewTicket.PRINT_SCOPE); break; case 2: ticket.setFileVersionId(UUID.randomUUID()); break; case 3: ticket.setFileName("manual.txt"); break; } assertRejected(service(ticket)); } assertRejected(new DmsOnlyOfficePageCountService(renderer, value -> null)); verifyNoInteractions(renderer); } @Test public void rejectsFailedConversionAndInvalidPdf() { when(renderer.render(any(), anyString())).thenThrow(new DataException("转换失败")); assertRejected(service(ticket())); reset(renderer); when(renderer.render(any(), anyString())).thenReturn(new byte[]{1, 2, 3}); assertRejected(service(ticket())); } private void assertRejected(DmsOnlyOfficePageCountService service) { try { service.getPageCount(VERSION, "preview-ticket"); fail("expected page count failure"); } catch (DataException expected) { assertNotNull(expected.getMessage()); } } private DmsOnlyOfficePageCountService service(DmsFilePreviewTicket ticket) { return new DmsOnlyOfficePageCountService(renderer, value -> JsonUtil.getObjectToString(ticket)); } private DmsFilePreviewTicket ticket() { DmsFilePreviewTicket ticket = new DmsFilePreviewTicket(); ticket.setScope(DmsFilePreviewTicket.SCOPE); ticket.setTenantId("tenant-1"); ticket.setUserId("user-1"); ticket.setFileVersionId(VERSION); ticket.setFileName("玻思韬DMS调研报告.docx"); ticket.setStoragePlatform("seaweedfs-1"); ticket.setBucketName("jnpf-dms"); ticket.setObjectPath("prepared-preview/"); ticket.setObjectName("prepared.docx"); ticket.setExpiresAt(System.currentTimeMillis() + 60_000); return ticket; } }