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<DmsFilePreviewTicket> 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;
|
}
|
}
|